too many connection
2019-06-20현상
일정 시간마다 ajax로 내용을 리프레시 해 주는 게시판에서 사용자 200여명이 넘어가자 DB엑세스 시 too many connection이 발생하고 연결을 하지 못하는 현상 발생
DB, API 서버의 cpu/mem 부하는 20% 전후인 상태
리셋 등으로 해결이 안 되고, 도커 컨테이너 늘려서도 해결이 안 됨
지속되는 경우 리퀘스트도 쌓이고 file open max 값이 넘어가서 사용 불가
원인
- DB 처리량보다 부하 심함
- IO 부분이 보틀넥으로 보임
- 도커 인스턴스가 값싼 거고 DB도 값싼 인스턴스
- 커넥션이 늘어남
- 실제 DB 커넥션이 45개 전후
- RDS에서 가장 작은 인스턴스를 사용했는데 전체 DB 메모리 양과 CPU 사용량을 가지고 연결수 계산
- 도커 컨테이너의 Max Connection은 50
- 이전 네이버에서 직접 배포 때 잡은 설정 그대로
- RDS 인스턴스가 여러 개 일 때는 괜찮았음
- 제일 작은 걸로 바꾸고 인스턴스도 줄여둔 상태
- 이미 늘어난 컨넥션은 없어지지 않고 CPU 사용량은 그리 많지 않음
재현
봇을 만들어서 로그인, 화면 리프레시를 하게 하니 100명 전후가 몰려서 접근시 문제 발생
too many connection 발생
수정
- 실제 Max 커넥션에 맞추어 커넥션 조정
- CPU/mem 은 남는데 커녁션은 넘어가는 문제 발생
- 커넥션은 4-5 정도로 유지함 이걸 넘어가면 io가 못버텨줌
- 서버 인스턴스 변경
- 서버를 0.25vcpu/0.5GB ram 에서 0.5vcpu, 1GB ram으로 변경
- DB 인스턴스를 t3.micro 에서 r5.large로 변경
- read 인스턴스를 추가
결과
1500개 봇을 돌렸을 때 문제 없이 15분간 돌았음. CPU/램 10%이하로 유지
재발 방지를 위해
인스턴스 비용을 너무 아끼지 말자
-
Category
- 회고
- 시리즈
- AJAX 요청응답이 왔는데 JSON parse에러가 났는데 정상 작동
- AJAX 요청이 간헐적으로 실패하는 문제
- CloudFront에서 웹사이트 연동을 위해 S3의 파일을 불러올 때 Access Denied가 날 때
- Font Awesome이 적용되지 않았던 문제
- GORM에서 Many To Many 값을 제대로 가져오지 못하는 문제
- too many connection
- VueJS 에서 템플릿을 리터럴로 선언 했을 때, 바인딩이 안됨
- Vue에서 외부 모듈의 스타일을 적용했는데 적용되지 않을 때
- 그래들 래퍼 버전을 잘못 입력 했을 때
- 그래들은 컴파일이 되는데 인텔리J에서 컴파일이 안 되던 문제
- 배포 이후 변경이 안 되는 문제
- 유니코드 문자를 Console.WriteLine으로 출력시 에러
- 인수 전달이 잘못된 문제
- 테이블 생성 시 Foreign key constraint is incorrectly formed 에러 발생