고성능 Linux 서버에서는 초당 수많은 네트워크 패킷을 처리해야 합니다. 패킷 하나하나를 CPU가 모두 처리하면 인터럽트와 TCP/IP 스택 처리 비용이 증가하여 시스템 성능이 저하될 수 있습니다.
이러한 문제를 해결하기 위해 네트워크 카드(NIC)와 Linux 커널에서는 다양한 Offload 기능을 제공합니다. 그중 LRO(Large Receive Offload) 는 네트워크 카드 또는 드라이버가 여러 개의 수신 패킷을 하나의 큰 패킷으로 합쳐 CPU의 처리 부담을 줄이는 기술입니다.
하지만 최근 Linux 환경에서는 LRO보다 GRO(Generic Receive Offload)를 사용하는 경우가 많으며, 두 기능의 차이를 이해하는 것이 중요합니다.
이번 글에서는 LRO의 개념, GRO와의 차이점, 활성화 및 비활성화 방법, 실무에서의 활용법까지 자세히 알아보겠습니다.
LRO(Large Receive Offload)란?
LRO는 Large Receive Offload의 약자로, 네트워크 카드 또는 드라이버가 동일한 TCP 흐름의 여러 패킷을 하나의 큰 패킷으로 병합한 뒤 운영체제에 전달하는 기술입니다.
동작 과정은 다음과 같습니다.
Packet 1
Packet 2
Packet 3
Packet 4
│
▼
NIC / Driver
│
▼
LRO 병합
│
▼
하나의 큰 패킷
│
▼
Linux Kernel
CPU는 하나의 큰 패킷만 처리하면 되므로 인터럽트 횟수와 프로토콜 처리 비용이 줄어듭니다.
LRO를 사용하는 이유
다음과 같은 환경에서 CPU 부하 감소 효과를 기대할 수 있습니다.
- 파일 서버
- NAS 서버
- 백업 서버
- 대용량 데이터 전송
- 스토리지 서버
- 내부망 서버
- HPC 환경
- 고속 TCP 통신
- 대규모 다운로드 서버
- 데이터 복제 서버
단, 일반적인 웹 서비스에서는 GRO가 더 적합한 경우가 많습니다.
1. LRO 지원 여부 확인하기
현재 NIC가 LRO를 지원하는지 확인합니다.
ethtool -k eth0
예시
large-receive-offload: off
또는
large-receive-offload: on
지원하지 않는 NIC도 있습니다.
2. LRO 활성화하기
LRO를 활성화합니다.
ethtool -K eth0 lro on
적용 후 다시 확인합니다.
ethtool -k eth0
3. LRO 비활성화하기
필요 시 비활성화합니다.
ethtool -K eth0 lro off
패킷 분석이나 브리지 환경에서는 LRO를 끄는 것이 일반적입니다.
4. CPU 사용률 확인하기
적용 전후 CPU 사용률을 비교합니다.
mpstat -P ALL 1
또는
top
CPU SoftIRQ 사용량도 함께 확인하는 것이 좋습니다.
5. SoftIRQ 확인하기
cat /proc/softirqs
다음 항목을 확인합니다.
- NET_RX
- NET_TX
패킷 병합으로 인해 처리 횟수가 감소하는지 확인합니다.
6. 인터럽트 확인하기
cat /proc/interrupts
실시간 확인
watch -n 1 cat /proc/interrupts
인터럽트 증가 속도를 비교하면 효과를 확인할 수 있습니다.
7. 네트워크 성능 테스트
iperf3 -c 서버IP
또는
sar -n DEV 1
CPU 사용률과 처리량을 함께 비교합니다.
8. NIC 드라이버 확인하기
ethtool -i eth0
최신 드라이버에서는 LRO보다 GRO를 권장하는 경우가 많습니다.
9. GRO와 함께 확인하기
현재 GRO 상태도 확인합니다.
ethtool -k eth0 | grep receive
예시
generic-receive-offload: on
large-receive-offload: off
최근 Linux 배포판에서는 이 구성이 일반적입니다.
10. 커널 로그 확인하기
dmesg | grep -Ei "lro|eth|net"
또는
journalctl -k | grep -Ei "lro|driver"
드라이버 관련 오류가 없는지 확인합니다.
LRO와 GRO의 차이점
| 항목 | LRO | GRO |
|---|---|---|
| 처리 위치 | NIC 또는 드라이버 | Linux 커널 |
| 호환성 | 상대적으로 낮음 | 매우 높음 |
| 성능 | 높음 | 높음 |
| 패킷 분석 | 부적합 | 상대적으로 적합 |
| 브리지 환경 | 비권장 | 사용 가능 |
| 가상화 환경 | 제한적 | 권장 |
현재 대부분의 Linux 서버에서는 GRO를 기본으로 사용하고, LRO는 특정 환경에서만 사용하는 경우가 많습니다.
LRO 점검 순서
실무에서는 다음 순서대로 확인합니다.
- LRO 지원 여부 확인
- 활성화 여부 확인
- CPU 사용률 확인
- SoftIRQ 확인
- 인터럽트 확인
- 네트워크 처리량 측정
- NIC 드라이버 확인
- GRO 상태 확인
- 커널 로그 확인
- 성능 비교 테스트
LRO 사용 시 주의사항
다음 사항을 고려해야 합니다.
- 브리지 환경에서는 사용 비권장
- 패킷 캡처 시 비활성화 권장
- 최신 Linux에서는 GRO 우선
- 최신 NIC 드라이버 사용
- 성능 테스트 후 적용
- 가상화 환경에서는 호환성 확인
자주 묻는 질문
LRO와 GRO 중 어떤 것을 사용하는 것이 좋나요?
일반적인 Linux 서버에서는 GRO를 사용하는 것이 권장됩니다. 호환성과 안정성이 더 뛰어나며 대부분의 최신 커널과 드라이버에서 기본적으로 지원됩니다.
LRO를 활성화하면 항상 성능이 좋아지나요?
아닙니다. 대용량 TCP 전송에서는 효과가 있을 수 있지만, 브리지 환경이나 패킷 분석이 필요한 시스템에서는 오히려 문제가 발생할 수 있습니다.
LRO와 GRO를 동시에 사용할 수 있나요?
일부 환경에서는 가능하지만 일반적으로는 GRO가 우선 사용되며, 최신 Linux 배포판에서는 LRO가 비활성화되어 있는 경우가 많습니다.
마무리
LRO(Large Receive Offload)는 네트워크 카드나 드라이버에서 여러 개의 TCP 패킷을 하나로 병합하여 CPU 부하를 줄이는 기술입니다. 하지만 최신 Linux 환경에서는 호환성과 안정성이 뛰어난 GRO가 더 널리 사용되고 있으며, 대부분의 서버에서는 GRO를 기본으로 활용하는 것이 권장됩니다. ethtool, mpstat, iperf3, /proc/interrupts 등을 활용해 환경에 맞는 Offload 설정을 적용하면 네트워크 성능을 더욱 향상시킬 수 있습니다.