Linux 서버에서 대용량 데이터를 전송할 때 CPU는 TCP 세그먼트를 생성하는 과정에서 많은 자원을 사용합니다. 최신 서버용 네트워크 카드(NIC)는 이러한 작업을 대신 수행하는 TSO(TCP Segmentation Offload)를 지원하지만, 모든 네트워크 카드가 TSO를 지원하는 것은 아닙니다.
이러한 환경에서도 CPU 부담을 줄이기 위해 Linux 커널은 GSO(Generic Segmentation Offload) 기능을 제공합니다. GSO는 TSO와 비슷한 역할을 하지만, 하드웨어가 아닌 Linux 커널에서 세그먼트 분할을 처리하는 것이 가장 큰 차이점입니다.
이번 글에서는 GSO의 개념부터 TSO와의 차이점, 설정 방법, 성능 확인 및 실무 활용 방법까지 자세히 알아보겠습니다.
GSO(Generic Segmentation Offload)란?
GSO는 Generic Segmentation Offload의 약자로, 큰 패킷을 생성한 후 실제 전송 직전에 Linux 커널이 여러 개의 MTU 크기 패킷으로 분할하는 기능입니다.
동작 과정은 다음과 같습니다.
Application
│
▼
Linux Kernel
│
64KB Packet
│
▼
GSO 분할
│
▼
1500 Byte
1500 Byte
1500 Byte
...
│
▼
NIC 전송
TSO를 지원하지 않는 NIC에서도 CPU 부하를 줄일 수 있도록 설계되었습니다.
GSO를 사용하는 이유
다음과 같은 환경에서 효과를 기대할 수 있습니다.
- 가상 머신(KVM)
- Docker Host
- Kubernetes
- Cloud 서버
- 일반 서버용 NIC
- 테스트 서버
- 개발 서버
- NAS
- 파일 서버
- API 서버
특히 TSO를 지원하지 않는 환경에서 CPU 부담을 줄이는 데 효과적입니다.
1. GSO 활성화 여부 확인하기
현재 상태를 확인합니다.
ethtool -k eth0
예시
generic-segmentation-offload: on
on이면 GSO가 활성화된 상태입니다.
2. GSO 활성화하기
비활성화되어 있다면 다음 명령으로 활성화합니다.
ethtool -K eth0 gso on
설정 후 다시 확인합니다.
ethtool -k eth0
3. GSO 비활성화하기
테스트를 위해 일시적으로 비활성화할 수도 있습니다.
ethtool -K eth0 gso off
운영 환경에서는 특별한 이유가 없다면 활성화 상태를 유지하는 것이 좋습니다.
4. CPU 사용률 확인하기
GSO 적용 전후 CPU 사용률을 비교합니다.
mpstat -P ALL 1
또는
top
송신량이 많은 환경일수록 CPU 사용률 감소 효과가 크게 나타날 수 있습니다.
5. 송신 트래픽 확인하기
송신 패킷 처리량을 확인합니다.
sar -n DEV 1
또는
ip -s link
TX 처리량과 오류 여부를 함께 확인합니다.
6. SoftIRQ 확인하기
cat /proc/softirqs
다음 항목을 확인합니다.
- NET_TX
- NET_RX
송신 관련 SoftIRQ 처리량이 정상적으로 분산되는지 확인합니다.
7. 다른 Offload 기능 확인하기
다음 기능도 함께 확인합니다.
ethtool -k eth0
다음 항목을 함께 점검하는 것이 좋습니다.
- TSO
- GRO
- LRO
- Checksum Offload
- Scatter Gather
Offload 기능은 서로 연계되어 동작하는 경우가 많습니다.
8. NIC 드라이버 확인하기
ethtool -i eth0
드라이버가 최신 버전인지 확인합니다.
9. 성능 테스트 수행하기
실제 처리량을 확인합니다.
iperf3 -c 서버IP
또는
iperf3 -s
GSO 적용 전후 처리량과 CPU 사용률을 비교합니다.
10. 커널 로그 확인하기
드라이버 관련 오류를 확인합니다.
dmesg | grep -Ei "gso|eth|net"
또는
journalctl -k | grep -Ei "gso|driver"
문제가 발생하면 커널 또는 NIC 드라이버 업데이트를 검토합니다.
GSO와 TSO의 차이점
| 항목 | GSO | TSO |
|---|---|---|
| 처리 위치 | Linux 커널 | NIC 하드웨어 |
| 하드웨어 지원 | 불필요 | 필요 |
| CPU 사용률 | 낮음 | 매우 낮음 |
| 성능 | 높음 | 매우 높음 |
| 호환성 | 매우 높음 | NIC 의존 |
TSO를 지원하는 환경에서는 TSO가 우선 사용되며, 지원하지 않는 경우 GSO가 대체 기능으로 활용됩니다.
GSO 점검 순서
실무에서는 다음 순서대로 확인하는 것이 좋습니다.
- GSO 활성화 여부 확인
- GSO 활성화 또는 비활성화
- CPU 사용률 확인
- 송신 트래픽 확인
- SoftIRQ 확인
- 다른 Offload 기능 확인
- NIC 드라이버 확인
- 성능 테스트 수행
- 커널 로그 확인
- 적용 전후 성능 비교
GSO 사용 시 주의사항
다음 사항을 함께 고려해야 합니다.
- 최신 커널 유지
- 최신 NIC 드라이버 사용
- GRO와 함께 사용
- Checksum Offload 활성화
- 성능 테스트 후 운영 환경 적용
- 가상화 환경에서는 호환성 확인
특히 클라우드 환경에서는 GSO가 기본 활성화되어 있는 경우가 많으므로 변경 전에 현재 설정을 확인하는 것이 중요합니다.
자주 묻는 질문
GSO와 TSO 중 어떤 것이 더 좋은가요?
TSO를 지원하는 NIC라면 일반적으로 TSO가 더 높은 성능을 제공합니다. 하지만 TSO를 지원하지 않는 환경에서는 GSO가 효과적인 대안이 됩니다.
GSO를 반드시 활성화해야 하나요?
대부분의 서버에서는 활성화 상태를 유지하는 것이 권장됩니다. 다만 특정 드라이버 문제나 성능 테스트가 필요한 경우에는 일시적으로 비활성화할 수 있습니다.
GSO와 GRO는 함께 사용할 수 있나요?
네. GSO는 송신(TX) 최적화 기능이고, GRO는 수신(RX) 최적화 기능이므로 함께 사용하는 것이 일반적입니다.
마무리
GSO(Generic Segmentation Offload)는 Linux 커널에서 큰 데이터를 여러 개의 MTU 크기 패킷으로 분할하여 CPU 부담을 줄이는 핵심 네트워크 최적화 기능입니다. ethtool, mpstat, iperf3, /proc/softirqs 등을 활용하면 GSO의 동작 상태와 성능 효과를 확인할 수 있으며, TSO, GRO, Checksum Offload와 함께 구성하면 더욱 높은 네트워크 처리 성능을 얻을 수 있습니다.