본문 바로가기

UDP 패킷 유실 문제 해결: 네트워크 버퍼 설정 최적화

오토씨 2024. 10. 16.

안녕하세요! 오늘은 수집된 로그를 포워딩하면서 로드밸런싱을 담당하는 서버에서 발생한 패킷 유실 문제를 다루어 보려고 합니다. 이 서버는 다양한 소스로부터 로그를 수집하고, 효율적인 분산을 위해 로드밸런싱을 수행하고 있지만 최근 패킷 유실 현상이 발견되었습니다.

 

UDP 패킷 유실 문제 해결: 네트워크 버퍼 설정 최적화

 

1. 문제 개요

유실된 패킷은 UDP 패킷이었으며, 네트워크 인터페이스의 버퍼를 초과하는 패킷이 유입되어 이러한 문제가 발생한 것으로 파악되었습니다. UDP 프로토콜의 특성상 패킷 유실이 있을 수 있지만, 이번 경우는 인터페이스의 버퍼 한계를 초과한 상황에서 패킷이 유실된 것이 주요 원인이었습니다.



2. 문제 진단 과정

2.1 네트워크 통계 데이터 확인

먼저 네트워크 인터페이스의 통계 데이터를 확인하고, 버퍼 사용률이 급격히 증가하는 패턴을 발견했습니다. 이후 시스템 모니터링 도구를 통해 실시간으로 인터페이스 상태를 분석하여 패킷 유입률과 버퍼의 관계를 파악했습니다. 추가적으로 nstat 명령을 사용하여 UDP 패킷 처리 상황을 점검하였습니다. 아래는 실제 서버에서 nstat -az | grep -E 'IpExt|Udp' 명령을 실행한 결과입니다.

UdpInDatagrams                  123332580          0.0
UdpNoPorts                      910958391942       0.0
UdpInErrors                     306                0.0
UdpOutDatagrams                 123306132          0.0
UdpRcvbufErrors                 0                  0.0
UdpSndbufErrors                 2                  0.0
UdpInCsumErrors                 306                0.0
...

이 결과를 분석해 보면, UdpInErrorsUdpInCsumErrors의 값이 306으로 나타났습니다. 이는 수신된 패킷 중 일부에서 체크섬 오류가 발생했음을 의미하며, 이러한 오류가 패킷 유실의 원인 중 하나로 작용했을 가능성이 있습니다. 또한, UdpSndbufErrors가 2로 나타난 것은 송신 버퍼에서 패킷을 처리하는 과정에서 일부 문제가 있었음을 의미합니다. 다행히 UdpRcvbufErrors는 0으로 나타나 수신 버퍼 초과로 인해 패킷이 손실된 경우는 없었음을 알 수 있습니다.

 

 

3. 해결 방안

3.1 네트워크 인터페이스 설정 최적화

버퍼 초과 문제를 해결하기 위해 네트워크 인터페이스의 큐 크기를 조정하고, 트래픽 분산 설정을 최적화하여 패킷 유실을 줄이는 방향으로 조치하였습니다. 먼저 인터페이스의 버퍼 크기와 max_backlog 값을 확인하여 최적화하였습니다. 다음 명령을 사용하여 현재 설정된 값을 확인하였습니다.

# sysctl net.core.rmem_max
# sysctl net.core.netdev_max_backlog
  • net.core.rmem_max: 수신 버퍼의 최대 크기를 나타내며, 이 값을 적절하게 늘려줌으로써 더 많은 패킷을 처리할 수 있도록 조정하였습니다.
  • net.core.netdev_max_backlog: 네트워크 인터페이스에서 커널이 처리하기 전에 대기할 수 있는 패킷의 최대 수를 나타내며, 이 값을 증가시켜 인터페이스가 갑작스러운 트래픽 증가를 좀 더 잘 처리할 수 있도록 하였습니다.

최적화된 값을 적용하기 위해 다음과 같이 설정을 변경하였습니다.

# sysctl -w net.core.rmem_max=26214400
# sysctl -w net.core.wmem_max=26214400
# sysctl -w net.core.netdev_max_backlog=15000

이후 설정 파일에 값을 영구적으로 적용하기 위해 /etc/sysctl.conf 파일에 다음과 같이 추가하였습니다.

net.core.rmem_max = 26214400
net.core.wmem_max = 26214400
net.core.netdev_max_backlog = 15000

 

3.2 송수신 버퍼 크기 조정 (TX/RX 버퍼)

또한, 네트워크 인터페이스의 송수신 버퍼 크기(TX/RX 버퍼)를 조정하여 패킷 유실을 줄였습니다. 송신(TX) 버퍼와 수신(RX) 버퍼의 크기를 늘려 네트워크 인터페이스가 더 많은 데이터를 처리할 수 있도록 하였습니다. 다음 명령을 사용하여 현재 설정된 값을 확인하고 조정하였습니다.

# ethtool -g <인터페이스 이름>

이 명령을 통해 인터페이스의 현재 송수신 버퍼 크기를 확인할 수 있으며, 최적화된 값을 적용하기 위해 다음과 같이 설정을 변경하였습니다.

# ethtool -G <인터페이스 이름> rx 4096 tx 4096

이 설정을 통해 네트워크 인터페이스의 수신 및 송신 버퍼 크기를 늘려 패킷 유실을 줄이고 성능을 향상시킬 수 있었습니다.



4. 결론

이 글에서는 이러한 패킷 유실 문제를 해결하기 위해 수행한 진단 과정과 문제의 원인을 파악하는 방법, 그리고 이를 해결한 경험을 공유하려 합니다. 네트워크 인프라를 운영하면서 흔히 겪을 수 있는 문제이기에, 이 글이 유사한 상황에서 문제 해결에 도움이 되기를 바랍니다.

댓글