저는 nginx로 로드밸런싱을 설정하는 도중에 too many connections라는 에러가 떳습니다.
검색해보니 mysql이나 mariadb에서 종종 일어나는 에러라고 하는데 많이 만날 에러인듯하니 정리해보겠습니다.😂
mysql -u root -p
show variables like "%max_connections%";
show status like "%connect%";
show status like '%thread%';
위의 내용을 보고 Rate를 계산할 수 있습니다.
방법은
Cache Miss Rate(%) = Threadscreated / Connections x 100
⭐ Cache Miss Rate(%) 가 높다면 thread_cache_size를 기본값인 8 보다 높게 설정하는 것이 권장됩니다.
Connection Miss Rate(%)= Abortedconnects / Connections x 100
⭐ Connection Miss Rate(%) 가 1% 이상이 된다면 wait_timeout 을 좀 더 길게 가져가는 것이 좋습니다!
Connection Usage(%) = Threads_connected / max_connections x 100
⭐ Connection Usage(%)가 100% 라면 max_connections 수를 증가시키는 것이 좋습니다.
⭐⭐⭐ connection 수가 부족할 경우 too many connections 에러가 발생합니다!!!
프로젝트에서 mariadb를 사용하기 때문에 경로가 mysql과는 살짝 다릅니다.
경로: /etc/mysql/mariadb.conf.d/50-server.cnf
50-server.cnf안에서 max_connections를 위에서 계산했을 때 나온 적당한 값으로 변경해준다.
여기서 단순히 max_connections만 바꾼다고 완벽하게 해결되지 않습니다.
해결되지 않는 이유 2가지
- 최대 연결 갯수를 늘린 것이기 때문에 메모리 용량이 꽉차면 연결을 허용해도 과부하가 걸려 처리 불가능!
- 최대 연결 갯수를 넘어가면 또 too many connections 오류 발생!
50-server.cnf안에서 저같은 경우는 3600으로 했습니다.
👷♂️ 하지만 트래픽이 많다면 30초같이 적게 하는 것이 좋습니다!
내 경우에는 백엔드와 연결 시 connectionLimit을 5로 하고 있었습니다.
기본값은 10이지만 max_connections과 맞게 300으로 주었습니다.
가장 중요한 작업입니다. 이 값들을 적용하기 위해서 mysql을 재부팅해줍니다.
service mysql restart
이렇게 해결방법을 다 하고 processlist를 보면 ConnectionLimit만큼의 쓰레드가 있는 것을 확인할 수 있습니다!