AWS EC2Local 포트 고갈로 인한 서비스 중단

(상황)


AWS ALB 모니터링 지표에서 HTTP 5XX 다수의 버그가 확인되었습니다.


AWS EC2Local 포트 고갈로 인한 서비스 중단 1

인스턴스의 nginx 로그에서 다음과 같은 오류가 많이 나타나는 것을 보았고, 포트 4001에 대한 연결이 실패한 것으로 나타났습니다.

127.0.0.1:4001 업스트림 연결 중 실패(99: 요청한 주소를 할당할 수 없음), ….


AWS EC2Local 포트 고갈로 인한 서비스 중단 2

(원인)


1. timawait에서 소켓 수 확인

문제가 발생한 인스턴스에 접속 후,

소켓 상태 확인 명령 사용 약 26000개의 소켓이 timewait 상태인지 확인나는했다.

(ec2-user@ip-172-31-26-217~)$ss -s
합계: 1201TCP: 26809(설립 871, 폐쇄 25923, 고아 3, 대기 시간 25922)

TIME_WAIT 상태에서 요청을 확인했습니다.

netstat -nap | 그랩 TIME_WAIT


AWS EC2Local 포트 고갈로 인한 서비스 중단 3

TIME_WAIT 소켓은 TIME_WAIT 상태가 해제된 후 재설정됩니다. 커널로 돌아갈 때까지 사용할 수 없습니다.

그리고 TIME_WAIT 소켓은 요청을 보내는 클라이언트에 의해 생성됩니다.


2. 소켓 정보

아래 이미지에서 볼 수 있는 내용은 다음과 같습니다.


AWS EC2Local 포트 고갈로 인한 서비스 중단 4

  • 소스 IP: 127.0.0.1
  • 출발항: 56336
  • 대상 IP: 127.0.0.1
  • 대상 포트: 4001
  • 소켓 상태: TIME_WAIT

(참조)
Elastic BeansTalk(linux2)로 서버 환경을 구축할 때 기본적으로 nginx가 설정되어 있는데,
nginx는 먼저 외부로부터 요청을 받아 익스프레스 서버로 요청을 보낸다.
(이 때 nginx와 express 서버의 IP는 127.0.0.1이 됩니다.)

nginx가 클라이언트가 됨 nginx가 로컬 포트로 소켓을 생성한 후,
목적지의 익스프레스 서버(서버)로 요청을 보냅니다.

“Source IP:Source PORT -> Destination IP:Destination PORT”로 구성된 소켓 커널에만 존재하다.


3. 로컬 IP 포트 범위 확인

이미지의 설명에 따라 인스턴스의 ip_local_port_range를 확인했습니다.


AWS EC2Local 포트 고갈로 인한 서비스 중단 5

고양이 /proc/sys/net/ipv4/ip_local_port_range


AWS EC2Local 포트 고갈로 인한 서비스 중단 6

표준 32768~60999Dog로 설정되어 있음을 확인했습니다.


4. 결론

ip_local_port_range를 보십시오. 사용 가능한 IP는 28231개입니다.

서버 트래픽이 증가하는 시기 경우에 따라,

약 26000개의 소켓이 TIME_WAIT 상태에 있었고 바인드할 로컬 포트가 더 이상 없기 때문에 요청을 처리할 수 없었습니다.

(반응)


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이어야 합니다.

두 작업 모두 ebextension과 함께 적용되었습니다.

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 5XX가 크게 감소했습니다.


AWS EC2Local 포트 고갈로 인한 서비스 중단 7

(참조 페이지)

https://jojoldu.319

https://jojoldu.322

https://tech.kakao.com/2016/04/21/closewait-timewait/

https://iximiuz.com/en/posts/reverse-proxy-http-keep-alive-and-502s/