too many connection

2019-06-20

현상

일정 시간마다 ajax로 내용을 리프레시 해 주는 게시판에서 사용자 200여명이 넘어가자 DB엑세스 시 too many connection이 발생하고 연결을 하지 못하는 현상 발생

DB, API 서버의 cpu/mem 부하는 20% 전후인 상태

리셋 등으로 해결이 안 되고, 도커 컨테이너 늘려서도 해결이 안 됨

지속되는 경우 리퀘스트도 쌓이고 file open max 값이 넘어가서 사용 불가

원인

  1. DB 처리량보다 부하 심함
    1. IO 부분이 보틀넥으로 보임
    2. 도커 인스턴스가 값싼 거고 DB도 값싼 인스턴스
  2. 커넥션이 늘어남
  3. 실제 DB 커넥션이 45개 전후
    1. RDS에서 가장 작은 인스턴스를 사용했는데 전체 DB 메모리 양과 CPU 사용량을 가지고 연결수 계산
  4. 도커 컨테이너의 Max Connection은 50
    1. 이전 네이버에서 직접 배포 때 잡은 설정 그대로
    2. RDS 인스턴스가 여러 개 일 때는 괜찮았음
    3. 제일 작은 걸로 바꾸고 인스턴스도 줄여둔 상태
  5. 이미 늘어난 컨넥션은 없어지지 않고 CPU 사용량은 그리 많지 않음

재현

봇을 만들어서 로그인, 화면 리프레시를 하게 하니 100명 전후가 몰려서 접근시 문제 발생

too many connection 발생

수정

  1. 실제 Max 커넥션에 맞추어 커넥션 조정
    1. CPU/mem 은 남는데 커녁션은 넘어가는 문제 발생
    2. 커넥션은 4-5 정도로 유지함 이걸 넘어가면 io가 못버텨줌
  2. 서버 인스턴스 변경
    1. 서버를 0.25vcpu/0.5GB ram 에서 0.5vcpu, 1GB ram으로 변경
    2. DB 인스턴스를 t3.micro 에서 r5.large로 변경
    3. read 인스턴스를 추가

결과

1500개 봇을 돌렸을 때 문제 없이 15분간 돌았음. CPU/램 10%이하로 유지

재발 방지를 위해

인스턴스 비용을 너무 아끼지 말자

CloudFront에서 웹사이트 연동을 위해 S3의 파일을 불러올 때 Access Denied가 날 때 2019년 1사분기 회고