- 하드웨어 네트워크 카드 관련 손실
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
- 네트워크 드라이버 및 커널 처리 문제
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 # 큐 수 조정
- 커널 프로토콜 스택 손실 원인
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 조정 필요
- 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