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 헤더 제공