Mysql Connection 설정 (too many connections error)

2021. 4. 11. 03:47 Database/mysql tip

1. Mysql의 최대 접속자 수 확인하기.

show variables like '%max_connection%';

max_connections는 mysql에서 connect할 수 있는 최대 소켓수를 정의한 값입니다.

접속 최대수를 초과해 접속 시도를 하는 경우 "too many connections error"이 발생 합니다.

 

2. 접속수 보기.

show status like 'Max_used_connections';

 

3.  Connection 설정을 위한 변수.

 

- variables ( show variables like '%max_connection%';)

 

max_connections – 최대 동시 접속 가능 수. max_connection 수가 늘어 나면 innodb 의 thread별 메모리 사용량이 늘어나 같이 고려해야 합니다.

wait_timeout – 지정된 시간 동안 아무런 요청 없이 대기하는 경우 MySQL 서버는 해당 커넥션을 강제로 종료해 버립니다. (기본값은 28800초(8시간))

thread_cache_size – thread 재 사용을 위한 thread pool, 최대 몇 개 까지의 thread를 pool에 보관할지 설정.

 

- status ( show status like '%clients%';)

 

Aborted_clients : 클라이언트 프로그램이 비 정상적으로 종료된 수

Aborted_connects : MySQL 서버에 접속이 실패된 수

Max_used_connections : 최대로 동시에 접속한 수

Threads_cached : Thread Cache의 Thread 수

Threads_connected : 현재 연결된 Thread 수

Threads_created : 접속을 위해 생성된 Thread 수

Threads_running : Sleeping 되어 있지 않은 Thread 수

 

4. 튜닝

Cache Miss Rate(%) =  Threads_created / Connections * 100

Connection Miss Rate(%) = Aborted_connects / Connections * 100

Connection Usage(%) = Threads_connected / max_connections * 100

 

- Connection Usage(%)가 100% 라면 max_connections 수를 증가시켜 주십시요. Connection 수가 부족할 경우 Too Many Connection Error 가 발생합니다.

 

- DB 서버의 접속이 많은 경우는 wait_timeout 을 최대한 적게 (10~20 정도를 추천) 설정하여 불필요한 연결을 빨리 정리하는 것이 좋습니다. 그러나 Connection Miss Rate(%) 가 1% 이상이 된다면 wait_timeout 을 좀 더 길게 잡는 것이 좋습니다.

 

- Cache Miss Rate(%) 가 높다면 thread_cache_size를 기본값인 8 보다 높게 설정하는 것이 좋습니다. 일반적으로 threads_connected 가 Peak-time 시 보다 약간 낮은 수치로 설정하는 것이 좋습니다.

 

- MySQL 서버는 외부로 부터 접속 요청을 받을 경우 인증을 위해 IP 주소를 호스트네임으로 바꾸는 과정을 수행하여 접속시에 불필요한 부하가 발생하게 됩니다. skip-name-resolve를 설정하시고 접속시에 IP 기반으로 접속을 하게 되면 hostname lookup 과정을 생략하게 되어 좀 더 빠르게 접속을 하실 수 있습니다.

 

 

5. Aborted_clients 값이 증가하는 원인

클라이언트 프로그램이 mysql_close() 를 호출하지 않고 종료.

클라이언트 프로그램에서 wait_timeout 혹은 interactive_timeout 시간동안 요청이 없는 경우.

전송도중 클라이언트 프로그램이 비정상적으로 종료.

비정상적인 패킷을 가진 통신 시도.

접속을 시도한 사용자가 데이터베이스에 접근할 권한이 없거나, 패스워드가 잘못된 경우.

접속을 시도하는 동안 connect_timeout 시간을 초과.

live 서비스중 해당 값이 과도하게 증가 된다면 해킹 시도에 대한 의심을 해봐야 합니다.

 

출처 : code-factory.tistory.com/47?category=724516