Linux 서버에서 초당 수백만 개의 네트워크 패킷이 유입되는 환경에서는 CPU가 각 패킷을 개별적으로 처리해야 하므로 상당한 부하가 발생합니다. 특히 웹 서버, API 서버, 데이터베이스 서버처럼 네트워크 트래픽이 많은 시스템에서는 작은 패킷이 대량으로 들어오면서 CPU 사용률이 급격히 증가할 수 있습니다.
이러한 문제를 줄이기 위해 Linux에서는 GRO(Generic Receive Offload) 기능을 제공합니다. GRO는 여러 개의 작은 수신 패킷을 하나의 큰 패킷처럼 합쳐 커널에 전달하여 CPU가 처리해야 하는 패킷 수를 줄이는 기술입니다.
이번 글에서는 GRO의 개념부터 확인 방법, 활성화 및 비활성화 방법, 성능 최적화 방법까지 실무 중심으로 자세히 알아보겠습니다.
GRO(Generic Receive Offload)란?
GRO는 Generic Receive Offload의 약자로, 동일한 흐름(Flow)에 속하는 여러 개의 수신 패킷을 하나의 큰 패킷으로 병합하여 처리하는 Linux 커널 기능입니다.
패킷 처리 과정은 다음과 같습니다.
Packet 1
Packet 2
Packet 3
Packet 4
│
▼
GRO 병합
│
▼
하나의 큰 패킷
│
▼
TCP/IP Stack 처리
이 과정을 통해 CPU가 인터럽트와 패킷 처리에 사용하는 시간을 줄일 수 있습니다.
GRO를 사용하는 이유
다음과 같은 환경에서 GRO의 효과가 큽니다.
- Nginx 웹 서버
- Apache 웹 서버
- API 서버
- Kubernetes Cluster
- Docker Host
- MySQL
- PostgreSQL
- Redis
- NAS 서버
- 파일 서버
실무에서는 CPU 사용률 감소와 네트워크 처리량 향상을 위해 GRO를 활성화하는 경우가 많습니다.
1. GRO 활성화 여부 확인하기
현재 GRO 상태를 확인합니다.
ethtool -k eth0
예시
generic-receive-offload: on
on이면 GRO가 활성화된 상태입니다.
2. GRO 활성화하기
비활성화되어 있다면 다음과 같이 활성화합니다.
ethtool -K eth0 gro on
즉시 적용됩니다.
3. GRO 비활성화하기
성능 테스트나 특정 애플리케이션 요구 사항에 따라 비활성화할 수도 있습니다.
ethtool -K eth0 gro off
일반적인 서버에서는 특별한 이유가 없다면 활성화 상태를 유지하는 것이 좋습니다.
4. CPU 사용률 확인하기
설정 전후 CPU 사용률을 비교합니다.
mpstat -P ALL 1
또는
top
GRO가 정상적으로 동작하면 CPU 사용률이 감소하는 경우가 많습니다.
5. SoftIRQ 확인하기
패킷 처리 부하를 확인합니다.
cat /proc/softirqs
다음 항목을 확인합니다.
- NET_RX
- NET_TX
GRO 적용 후 SoftIRQ 처리 횟수가 감소하는지 확인합니다.
6. 네트워크 처리량 측정하기
트래픽 처리량을 비교합니다.
iperf3 -c 서버IP
또는
sar -n DEV 1
GRO 적용 전후 처리량과 CPU 사용률을 함께 비교하는 것이 좋습니다.
7. 인터럽트 확인하기
인터럽트 발생 횟수를 확인합니다.
cat /proc/interrupts
실시간 확인
watch -n 1 cat /proc/interrupts
패킷 병합으로 인해 인터럽트 처리 효율이 향상될 수 있습니다.
8. 다른 Offload 기능 확인하기
GRO와 함께 다음 기능도 확인합니다.
ethtool -k eth0
다음 항목을 함께 살펴보는 것이 좋습니다.
- LRO
- GSO
- TSO
- RX Checksum
- TX Checksum
Offload 기능은 서로 영향을 줄 수 있으므로 함께 확인하는 것이 좋습니다.
9. NIC 드라이버 확인하기
드라이버 정보를 확인합니다.
ethtool -i eth0
최신 드라이버일수록 GRO 최적화가 잘 되어 있는 경우가 많습니다.
10. 커널 로그 확인하기
드라이버 오류가 없는지 확인합니다.
dmesg | grep -Ei "eth|net|gro"
또는
journalctl -k | grep -Ei "eth|gro"
오류 메시지가 있다면 먼저 해결하는 것이 좋습니다.
GRO 점검 순서
실무에서는 다음 순서대로 확인하는 것이 효율적입니다.
- GRO 활성화 여부 확인
- GRO 활성화 또는 비활성화
- CPU 사용률 확인
- SoftIRQ 확인
- 네트워크 처리량 측정
- 인터럽트 확인
- Offload 기능 확인
- NIC 드라이버 확인
- 커널 로그 확인
- 성능 비교 테스트
GRO 사용 시 주의사항
다음 사항을 함께 고려해야 합니다.
- 최신 NIC 드라이버 사용
- 최신 커널 유지
- RSS, RPS와 함께 사용
- NUMA 환경 고려
- 패킷 분석 환경에서는 비활성화 고려
- 실서비스 적용 전 성능 테스트 수행
패킷 캡처나 네트워크 분석을 수행할 때는 GRO를 비활성화해야 원본 패킷을 정확하게 확인할 수 있는 경우가 있습니다.
자주 묻는 질문
GRO와 LRO의 차이는 무엇인가요?
GRO는 Linux 커널에서 수행되는 범용 패킷 병합 기능이며, LRO(Large Receive Offload)는 주로 NIC 하드웨어 또는 드라이버 수준에서 수행되는 패킷 병합 기능입니다. 일반적으로 GRO가 더 범용적이며 다양한 환경에서 사용할 수 있습니다.
GRO를 항상 활성화해야 하나요?
일반적인 서버 환경에서는 활성화하는 것이 권장됩니다. 다만 IDS, 패킷 분석 시스템, 일부 가상화 환경에서는 비활성화하는 것이 적합할 수 있습니다.
GRO를 활성화하면 네트워크 속도가 빨라지나요?
직접적으로 회선 속도가 빨라지는 것은 아닙니다. CPU가 처리해야 하는 패킷 수가 줄어들어 CPU 사용률이 감소하고 전체 네트워크 처리 효율이 향상되는 효과를 기대할 수 있습니다.
마무리
GRO(Generic Receive Offload)는 Linux 커널에서 여러 개의 작은 수신 패킷을 하나로 병합하여 CPU 부하를 줄이고 네트워크 처리 효율을 높이는 핵심 기능입니다. ethtool, mpstat, iperf3, /proc/softirqs 등을 활용하면 GRO의 동작 상태와 성능 효과를 확인할 수 있으며, RSS, RPS, NAPI 등과 함께 구성하면 대규모 트래픽 환경에서도 높은 네트워크 성능을 유지할 수 있습니다.