문제
어느날 갑자기 api server가 죽어서 엄청 느려진 상태가 됬다.
파드를 내렸다가 올리면 정상적으로 작동하다 다시 느려지는 상태가 반복.
파드를 재시작할경우 정상적으로 작동하는것으로 보아 뭔가 쌓여서 문제가 되는것 같아
우선 네트워크부터 봤다.
처음시작할경우 netstat -antp로 보면 Est + Time_wait된 포트가 close_wait된 포트보다 많았으나
시간이 지날수록 close_wait된 포트가 많아지면서 서버가 응답이 느려지기 시작했다.
결론
Resttemplate으로 api서버에 요청을하는 서버에서 connection이 종료되지 않아서
CLOSE_WAIT이 쌓여 결국 서버가 멈추는 문제.
- 그림 출처 https://tech.kakao.com/2016/04/21/closewait-timewait/
- 현재 api 를 내려주는 서버에서 CLOSE 요청을 받고 받았다는 응답을 내려주지 않음.
예측
- Resttemplate이 작업을 처리하느라 close 요청을 못받는줄암.
- 그래서 Resttemplate에서 응답을 받고 강제로 connection 을 종료 시켜주기로함.
- Resttemplate는 직접 connection을 닫지않아도 자동으로 닫아준다고 했는데 안닫아지는건 뭔가 외부적인 이슈가 있을거라 판단
- https://www.popit.kr/마이크로-서비스와-time_wait-문제/
- 위 링크를 참조하여 EntityUtils로 닫아보려고 했지만 타입이 맞지 않아 에러로 닫아짐
해결
- api서버에서 CLOSE 요청을 내려주질 않아서 Connection 을 종료할수 가 없는 상황.
- 그래서 Resttemplate의 timeout 설정을 줘서 일정시간 없으면 요청을 종료하기로함.
- 정상적으로 timeout 시간이 지나면 timeout으로 종료됨.
문제 2.
- timeout줘서 요청을 종료하기로 했으나 api 서버에서 응답을 늦게내려줘서 모든 요청이 타임아웃 걸리는 상황.
- api 서버를 확인해보니 포트 4만6천개정도가 사용중인 상태.
해결
- 커넥션 새로 열때마다 새로운 포트를 생성하므로 커넥션풀을 만들어 사용하기로함.
- 이미 커넥션풀이 있었으나 특정 요청은 커넥션풀이 적용되지 않았었음.
- 그래서 적용되니 요청이 정상적으로 작동.
'개발 > trouble' 카테고리의 다른 글
expected webhook response of admission.k8s.io/v1, Kind=AdmissionReview, got /, Kind= (0) | 2021.02.06 |
---|---|
Invalid use of BasicClientConnManager: connection still allocated. (0) | 2020.07.01 |
h2 db 1.4.200 테이블 초기화 안되는 버그 (0) | 2020.03.17 |
h2 The file is locked 문제 (0) | 2020.03.03 |
spring admin server 에러 문제 (0) | 2020.03.02 |