본문 바로가기

여러가지/ERROR & 이슈

[정리] 각종 장애 현상

1. nginx miss configuration

(nginx workers 설정 미숙으로 인한 장애)

 

ㄱ. 장애 현상

"트래픽 증가와 함께 서버의 응답 지연 발생"

 

응답지연 ->  컴퓨팅 리소스 부족이 원인

 

>> 메트릭 수집

- CPU Usage: CPU 사용량이 많아서 응답을 못하는 것인가?

- MEM Usage: 메모리 사용량이 높아서 OOM이 발생했는가?

 

# top  // CPU Usage 확인

단, 멀티 코어일 경우 반드시 모든 코어 확인

 

ㄴ. 발견 문제

8개 중 한 개의 CPU만 100%

 

ㄷ. 해결방안

worker_processes=1 -> auto

: 서버 8배 늘린 것과 같은 효과

 

worker_processes

: nginx 설정 중 worker process의 개수를 설정하는 항목

(+) worker process: 사용자의 요청 처리하는 프로세스

 

# cat /etc/nginx/ngnix.conf | grep -i worker_processes

# ps -eLF | grep -i nginx

# lscpu

 

! CPU Usage 모니터링을 잘하자 !

 

 

2. 간헐적인 네트워크 응답 지연

(Read Timeout으로 인한 장애)

 

ㄱ. 장애 현상

간헐적으로 API 호출 시 타임 아웃 발생

 

>> 메트릭 수집

- netstat 통해 네트워크 연결 잘 되었는지 확인 (Close_Wait은 없는지)

- tcpdump 통해 패킷 흐름 수집 후 분석

 

# tcpdump -vvv -nn -A -G 3600 -w /var/log/tcpdump/$(hostname)_%Y%m%d-%H%M%S.pcap

// -G 3600: 한 시간 마다 파일 새로 생성

: 간헐적인 타임아웃은 긴 시간동안 패킷 수집해야함

즉, 타임 아웃이 발생한 순간의 pcap 파일 분석

 

ㄴ. 발견 문제

POST 요청을 보내고 3초 후에 FIN 패킷 날라감 (TIME_OUT)

그런데 POST에 대한 응답이 5초 후 도착

 

ㄷ. 해결 방안

클라이언트의 타임아웃 설정

 

 Timeout

: 현재 상태가 정상이라고 판단할 때까지 얼마나 기다릴 것인가?

 

ㄱ. 종류

(1) Connection Timeout

: 종단 간 연결 처음 맺을 때

(2) Read Timeout

: 종단 간 연결 맺은 후 데이터 주고 받을 때

 

ㄴ. Timeout 설정 시 고려 사항

응답에 소요되는 시간 + RTT 보다 커야함

 

● RTT(Round Trip Time)

: 패킷이 종단 간 이동할 때 걸리는 시간

즉, 물리적 거리에 따른 시간

ex) 서울 <-> 부산, 서울 <-> USA

 

(1) RTT 모를 때

: 종단 간 커넥션 처음 맺을 때

-> InitRTO 사용

 

 InitRTO

: RTT 모를 때 사용하는 커널의 패킷 초기 타임아웃값

# define TCP_TIMEOUT_INIT ((unsigned)(1*HZ))  // RFC6298 2.1 inital RTO value (리눅스 1초)

 

Connection Timeout

즉, 3-Way Handshake 과정 중 최소 한번의 패킷 유실 정도는 방어할 수 있어야 함

따라서 3초(1초+RTT) 정도로 설정하는 것 추천

 

(2) 패킷 유실 되었을 때

 

 RTO(Retransmisstion TimeOut)

: 패킷에 대한 응답이 RTO 이내에 도착하지 않으면 유실로 간주

 

=> RTT 기반으로 계산

단, RTO 최소값 존재

# define TCP_RTO_MIN    ((unsigned)(HZ/5))

// 1/5초 = 200ms

 

Read Timeout

즉, 프로세싱 시간을 고려하고 최소 한번의 패킷 유실 정도는 방어할 수 있어야 함

따라서 1초(프로세싱 시간+RTO) 정도로 설정하는 것 추천

하지만 프로세싱 시간은 각각 다르므로 각각 고려

 

! 환경에 적합한 타임아웃 값을 설정하자 !

 

 

3. 간헐적인 커넥션 종료 에러

(Keepalive Timeout으로 인한 장애)

 

ㄱ. 장애 현상

간헐적으로 API 호출 시 커넥션 에러가 발생

ERROR: Connection prematurely closed BEFORE response

 

>> 메트릭 수집

- netstat 통해 네트워크 연결 잘 되었는지 확인 (Close_Wait은 없는지)

- tcpdump 통해 패킷 흐름 수집 후 분석

 

# tcpdump -vvv -nn -A G 3600 host <-목적지 IP-> -w /var/log/tcpdump/$(hostname)_%Y%m%d-%H%M%S.pcap

// -G 3600: 한 시간 마다 파일 새로 생성

: 간헐적인 타임아웃은 긴 시간동안 패킷 수집해야함

즉, 타임 아웃이 발생한 순간의 pcap 파일 분석

 

Q. 상대방 서버가 갑자기 연결을 끊었다?

HTTP Keepalive

 

- HTTP는 원래 Stateless

- HTTP 통신 후에 연결 끊는 것이 원래 스펙

하지만, HTTP/1.1부터 Connection:Keep-Alive 헤더 제공