MySQL - Too many connections 해결 및 튜닝
MySql 이나 Mariadb 를 운용할때 종종 만나게 되는 too many connections 의 해결과 성능 튜닝에 대해서 알아보자.
# 상태 확인
show variables like '%max_connections%';
show status like '%connect%';
"Aborted_connects" "53" - MySQL 서버에 접속이 실패된 수
"Connections" "10832"
"Max_used_connections" "101" - 최대로 동시에 접속한 수
"Threads_connected" "100" - Thread Cache의 Thread 수
show status like 'Aborted%';
"Aborted_clients" "5000" - 클라이언트 프로그램이 비 정상적으로 종료된 수
"Aborted_connects" "53" - MySQL 서버에 접속이 실패된 수
show status like '%thread%';
"Threads_cached" "5" - Thread Cache의 Thread 수
"Threads_connected" "99" - 현재 연결된 Thread 수
"Threads_created" "1469" - 접속을 위해 생성된 Thread 수
"Threads_running" "1" - Sleeping 되어 있지 않은 Thread 수
# 문제해결 및 튜닝
Cache Miss Rate(%) = Threadscreated / Connections * 100
Connection Miss Rate(%) = Abortedconnects / Connections * 100
Connection Usage(%) = Threads_connected / max_connections * 100
- Connection Usage(%)가 100% 라면 max_connections 수를 증가시켜 주십시요.
- Connection 수가 부족할 경우 ==> Too Many Connection 에러 ==> max_connections 를 올려줌
- DB 서버의 접속이 많은 경우는 wait_timeout 을 최대한 적게 (30 정도를 추천) 설정하여 불필요한 연결을 빨리 정리필요. 그러나 Connection Miss Rate(%) 가 1% 이상이 된다면 wait_timeout 을 좀 더 길게 가져야 함.
- Cache Miss Rate(%) 가 높다면 thread_cache_size를 기본값인 8 보다 높게 설정하는 것이 좋음.
- 일반적으로 threads_connected 가 Peak-time 시 보다 약간 낮은 수치로 설정함.
# 참고
MySQL 서버는 외부로 부터 접속 요청을 받을 경우 인증을 위해 IP 주소를 호스트네임으로 바꾸는 과정을 수행하여
접속시에 불필요한 부하 발생.
my.cnf에서 skip-name-resolve를 설정, 접속시 IP 기반으로 접속을 하게 되면 hostname lookup 과정 생략되어 좀 더 빠르게 접속 가능
[권한필요 - root]
set global max_connections = 500;
set wait_timeout = 30;
[vi /etc/my.cnf]
skip-name-resolve
'Backend > mysql' 카테고리의 다른 글
[Hoon] MySql 에서의 현재시각 sysdate vs now (0) | 2013.05.03 |
---|
댓글