본문 바로가기
backend/mysql

[Hoon] MySQL - Too many connections 해결 및 튜닝

by 훈즈 플로거 2019. 1. 8.

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

댓글0