네트워크 패킷 손실 문제 진단 및 해결 방법

  1. 하드웨어 네트워크 카드 관련 손실

1.1 Ring Buffer 과부하 확인 Ring Buffer는 데이터를 순환 저장하는 메모리 구조로, 처리 속도보다 입력 속도가 빠르면 버퍼가 가득 차 기존 데이터를 덮어쓰게 된다. 이는 수신 흐름이 드라이버 처리 속도를 따라가지 못할 때 발생한다.

# FIFO 오류 발생 횟수 확인
ethtool -S eth0 | grep rx_fifo

# /proc/net/dev에서 fifo 필드 확인
cat /proc/net/dev

# 현재 설정된 버퍼 크기 확인
ethtool -g eth0

# RX/TX 버퍼 크기 조정 (예: 4096로 설정)
ethtool -G eth0 rx 4096 tx 4096

1.2 포트 협상 불일치로 인한 손실 네트워크 장치 간의 전송률 또는 모드 불일치는 손실을 유발할 수 있다.

# 인터페이스 상태 확인
ifconfig eth0

# 드라이버 정보 확인
ethtool -i eth0

# 자동 협상 재시도
ethtool -r eth0

# 강제로 전송률 설정 (예: 1Gbps, 전용 모드)
ethtool -s eth0 speed 1000 duplex full autoneg off

1.3 흐름 제어 설정 문제 전송 측과 수신 측의 속도 불일치 시 흐름 제어로 인해 패킷이 버려질 수 있다.

# 흐름 제어 상태 확인
ethtool -a eth0

# 양방향 흐름 제어 비활성화
ethtool -A eth0 autoneg off
ethtool -A eth0 tx off
ethtool -A eth0 rx off
  1. 네트워크 드라이버 및 커널 처리 문제

2.1 수신 오류 항목 분석 ifconfig 출력에서 다음과 같은 항목을 주의 깊게 살펴보자:

  • RX errors: 전체 수신 오류(예: CRC, 프레임 오류, 버퍼 오버런 포함)
  • RX dropped: Ring Buffer에 들어왔으나 메모리 부족으로 복사 중 버려진 패킷
  • RX overruns: NIC 내부 버퍼가 가득 찬 상태에서 수신된 패킷이 물리적으로 버려짐 → rx_fifo_errors와 일치
  • RX frame: 잘못된 정렬된 프레임 수

이러한 값이 증가하면 커널 처리 속도가 네트워크 카드의 수신 속도를 따라가지 못함을 의미한다.

2.2 netdev_max_backlog 초과 커널은 네트워크 인터페이스에서 수신된 패킷을 netdev_max_backlog라는 대기 큐에 보관한다. 이 큐가 가득 차면 패킷이 버려진다.

# backlog 큐 상태 확인 (각 CPU 코어별 통계)
cat /proc/softirqs

# 기본값 1000에서 증가 (고속 링크 환경에서 권장)
sysctl -w net.core.netdev_max_backlog=2000

2.3 IRQ 처리 지연으로 인한 손실 소프트 인터럽트가 할당된 시간이 짧아 패킷 처리가 늦어지는 경우, netdev_budget 값을 조정해야 한다.

# 소프트 인터럽트 처리량 확인
cat /proc/softirqs | grep netdev

# 예산 값 증가 (기본값 300 → 600)
sysctl -w net.core.netdev_budget=600

2.4 단일 CPU 코어 과부하 문제 특정 코어에서 소프트 인터럽트 사용률이 100%에 도달하면 응용 프로그램 처리가 지연된다.

# CPU 사용률 모니터링
mpstat -P ALL 1

# RSS(Receiveside Scaling) 설정 조정
ethtool -x eth0   # 현재 설정 확인
ethtool -X eth0 xxxx  # 큐 수 조정
  1. 커널 프로토콜 스택 손실 원인

3.1 ARP 응답 제어 설정 오류 arp_ignore 파라미터는 외부 요청에 대한 응답 여부를 제어한다.

sysctl -a | grep arp_ignore
# 실제 환경에 맞게 0 또는 1로 설정

3.2 다중 인터페이스에서의 ARP 필터링 여러 네트워크 인터페이스가 동일한 요청에 응답할 경우, 목적지가 잘못된 MAC 주소를 학습할 수 있다.

sysctl -a | grep arp_filter
# 0: 모든 인터페이스에서 응답 (기본값)
# 1: 수신 인터페이스와 일치하지 않으면 응답하지 않음

3.3 ARP 캐시 만료로 인한 손실 ARP 테이블 용량이 초과되면 새로운 엔트리가 추가되지 않는다.

# ARP 상태 확인
cat /proc/net/stat/arp_cache | grep table_fulls
dmesg | grep neighbour

# 현재 캐시 크기 확인
ip n | wc -l

# 임계값 조정 (기본값: 128/512/1024)
sysctl -w net.ipv4.neigh.default.gc_thresh1=1024
sysctl -w net.ipv4.neigh.default.gc_thresh2=2048
sysctl -w net.ipv4.neigh.default.gc_thresh3=4096
sysctl -p

3.4 ARP 요청 대기열 오버플로우 unresolved_discards 카운터가 증가하면 요청 처리 대기열이 꽉 찬 것이다.

cat /proc/net/stat/arp_cache | grep unresolved_discards
# unres_qlen_bytes 조정 필요
  1. TCP/UDP 계층 손실 문제

4.1 패킷 분할 재구성 실패 IP 분할 재구성 실패는 타임아웃이나 메모리 부족으로 인해 발생한다.

# 재구성 실패 통계 확인
netstat -s | grep reassembles

# 타임아웃 시간 증가
sysctl -w net.ipv4.ipfrag_time=60

# 분할 메모리 한도 조정
sysctl -w net.ipv4.ipfrag_high_thresh=262144
sysctl -w net.ipv4.ipfrag_low_thresh=196608

# 분할 보안 검사 비활성화 (위험 주의)
sysctl -w net.ipv4.ipfrag_max_dist=0

# 해시 버킷 충돌 확인
dmesg | grep "Dropping fragment"
# 해시 크기 확장 (핫패치 적용)

# 메모리 부족 시
echo 3 > /proc/sys/vm/drop_caches
sysctl -w net.core.rmem_default=262144
sysctl -w net.core.rmem_max=1310720

4.2 TIME_WAIT 상태 과잉 고주파 연결/종료 시 많은 소켓이 TIME_WAIT 상태에 머무르며 리소스 고갈 발생.

# 오버플로우 메시지 확인
dmesg | grep "time wait bucket table overflow"

# 최대 개수 조정
sysctl -w net.ipv4.tcp_max_tw_buckets=200000

# tw_reuse: 클라이언트에서 1초 내 재사용 가능
sysctl -w net.ipv4.tcp_tw_reuse=1

# tw_recycle: 클라이언트 및 서버 모두에서 재사용 (내부망만 사용 가능)
sysctl -w net.ipv4.tcp_tw_recycle=1

4.3 메모리 부족으로 인한 손실 TCP 버퍼 메모리 부족 시 패킷이 버려진다.

dmesg | grep "out of memory"
cat /proc/sys/net/ipv4/tcp_mem
cat /proc/sys/net/ipv4/tcp_rmem
cat /proc/sys/net/ipv4/tcp_wmem

# 메모리 매개변수 증가
sysctl -w net.ipv4.tcp_mem="262144 524288 1048576"
sysctl -w net.ipv4.tcp_rmem="4096 87380 6291456"
sysctl -w net.ipv4.tcp_wmem="4096 16384 4194304"
sysctl -p

4.4 TCP 타임아웃 손실 네트워크 지연이 심할 경우 패킷 전송이 실패할 수 있다.

# 네트워크 품질 점검
hping -S 9.199.10.104 -A

# Nagle 알고리즘 비활성화
sysctl -w net.ipv4.tcp_nodelay=1

# 지연된 ACK 비활성화
sysctl -w net.ipv4.tcp_no_delay_ack=1

4.5 TCP 순서 오류 손실 순서가 어긋난 패킷 처리에 대한 민감도 조절.

sysctl -a | grep tcp_reordering
# 예: 3 이상으로 설정하면 더 많은 오류 허용
sysctl -w net.ipv4.tcp_reordering=6

태그: network troubleshooting packet loss ethtool kernel networking TCP/IP

6월 1일 17:05에 게시됨