[상황]
AWS ALB 모니터링 지표에서 HTTP 5XXs 에러 갯수가 대량으로 발생하는 것을 확인하였습니다.
인스턴스 nginx 로그에서 아래의 에러가 대량으로 발생 중인 것을 확인하였고, 4001 포트에 연결이 실패하는 것으로 보였습니다.
127.0.0.1:4001 faild (99: Cannot assign requested address) while connection to upstream, ....
[원인]
1. timawait 중인 소켓 갯수 확인
문제가 발생하고 있는 인스턴스에 접속 후,
socket 상태 확인 명령어를 이용해 timewait 상태의 소켓이 약 26000개인 것을 확인했습니다.
[ec2-user@ip-172-31-26-217 ~]$ ss -s
Total: 1201TCP: 26809 (estab 871, closed 25923, orphaned 3, timewait 25922)
...
TIME_WAIT 상태인 요청들을 확인해보았습니다.
netstat -nap | grep TIME_WAIT
TIME_WAIT 소켓은 TIME_WAIT 상태가가 풀려서 다시 커널로 돌아갈때까지는 사용할 수 없습니다.
그리고, TIME_WAIT 소켓은 요청을 보내는 출발지(client)에서 발생합니다.
2. 소켓 정보
아래의 이미지에서 알 수 있는 정보는 다음과 같습니다.
- 출발지 IP : 127.0.0.1
- 출발지 PORT : 56336
- 목적지 IP : 127.0.0.1
- 목적지 PORT : 4001
- 소켓 상태 : TIME_WAIT
[참고]
Elastic BeansTalk(linux2)을 이용해 서버 환경을 구축하게 되면 nginx는 기본적으로 설정이 되고,
외부로부터 들어온 요청을 nginx가 먼저 받고 express 서버로 요청을 보내주게 됩니다.
(이때, nginx와 express 서버의 IP는 127.0.0.1이 됩니다.)
nginx가 출발지(client)가 되고, nginx는 local port를 사용하여 소켓을 생성한 후
목적지(server)인 express서버로 요청을 보냅니다.
"출발지 IP:출발지 PORT -> 목적지 IP:목적지 PORT" 로 구성된 소켓은 커널에서 유일하게 존재합니다.
3. ip local port range 확인
이미지의 설명에 따라 인스턴스의 ip_local_port_range를 확인했습니다.
cat /proc/sys/net/ipv4/ip_local_port_range
기본값인 32768 ~ 60999개로 설정되어 있는 것을 확인했습니다.
4. 결론
ip_local_port_range를 보면 사용 가능 ip 28231개 입니다.
서버 트레픽이 증가하는 시간대에 인스턴스 1대 기준,
약 26000개의 소켓이 TIME_WAIT 상태가 되었고, 더 이상 bind할 local port가 없어서 요청을 처리하지 못한 것이었습니다.
[대응]
1. ip_local_port_range 범위 증가
echo \"10240 65535\" > /proc/sys/net/ipv4/ip_local_port_range
2. TIME_WAIT 소켓 재사용.
sudo sysctl -w "net.ipv4.tcp_timestamps=1"
sudo sysctl -w "net.ipv4.tcp_tw_reuse=1"
[참고]
net.ipv4.tcp_tw_reuse는 항상 net.ipv4.tcp_timestamps와 함께 사용되어야하고,
net.ipv4.tcp_timestamps는 반드시 1 이어야 합니다.
두가지 작업을 ebextensions 을 이용해 적용하였습니다.
files:
"/etc/security/limits.conf":
content: |
* soft nofile 200000
* hard nofile 200000
commands:
01:
command: "echo \"10240 65535\" > /proc/sys/net/ipv4/ip_local_port_range"
02:
command: "sysctl -w \"net.ipv4.tcp_timestamps=1\""
03:
command: "sysctl -w \"net.ipv4.tcp_tw_reuse=1\""
설정 적용 후 HTTP 5XXs가 현저히 줄어든 것을 확인했습니다.
[참고 사이트]
https://jojoldu.tistory.com/319
https://jojoldu.tistory.com/322
https://tech.kakao.com/2016/04/21/closewait-timewait/
https://iximiuz.com/en/posts/reverse-proxy-http-keep-alive-and-502s/
'개발 > AWS' 카테고리의 다른 글
AWS RDS INSERT문 중복 실행으로 인한 DeadLock 파악 (0) | 2023.03.22 |
---|---|
AWS ElastiCache 네티워크 대역폭 초과로 인한 서비스 장애 (0) | 2023.03.14 |
AWS ElastiCache Evictions로 인한 데이터 삭제 (0) | 2023.02.02 |
AWS ElastiCache 엔진 마이너 버전 업데이트로 인한 다운타임 (0) | 2023.01.31 |
AWS RDS Too many max_connections 장애 (0) | 2023.01.31 |