오프로드가 왜 필요한가

10G 이상 회선에서 패킷을 1500바이트씩 나눠 커널이 하나하나 처리하면 초당 수백만 개의 인터럽트와 스택 순회가 발생한다. TSO/GSO는 송신 시 큰 세그먼트를 만들어 분할을 미루고, GRO는 수신 시 여러 패킷을 하나로 합쳐 스택을 한 번만 타게 한다. 결과적으로 CPU당 처리량이 크게 오르고 소프트 인터럽트 부하가 줄어든다. 문제는 이 기능들이 "합치고 늦게 나누는" 성격 때문에 지연시간·MTU·캡처·터널링과 미묘하게 충돌한다는 점이다.

세 가지 오프로드의 역할 구분

기능방향분할/병합 주체대상
TSO송신NIC 하드웨어TCP
GSO송신커널(드라이버 진입 직전)TCP/UDP 등
GRO수신커널(NAPI)TCP/UDP

TSO는 하드웨어가 지원해야 하고, GSO는 하드웨어가 못 해도 커널이 소프트웨어로 대신한다. GRO는 LRO와 달리 병합 후에도 원본 경계를 복원할 수 있어 포워딩·브리지 환경에서 안전하다. LRO는 정보가 손실되므로 라우터/방화벽 역할 노드에서는 반드시 꺼야 한다.

현재 상태 확인과 설정

ethtool -k eth0 | egrep 'tcp-segmentation|generic-segmentation|generic-receive|large-receive'
# tcp-segmentation-offload: on      (TSO)
# generic-segmentation-offload: on  (GSO)
# generic-receive-offload: on       (GRO)
# large-receive-offload: off        (LRO, 포워딩 노드는 off 유지)

# 라우터/브리지 노드에서 GRO가 지연을 유발하면 끄기
ethtool -K eth0 gro off lro off
# 종단 서버는 처리량을 위해 켜두기
ethtool -K eth0 gso on tso on gro on

ethtool 설정은 재부팅 시 사라진다. NetworkManager나 udev, 또는 systemd 유닛으로 부팅 시 고정해야 한다.

함정 1: 지연에 민감한 워크로드

GRO는 병합 대상을 모으려 짧게 기다리므로, 소량·저지연 RPC나 트레이딩 트래픽에서는 p99 지연을 들쭉날쭉하게 만든다. 처리량은 필요 없고 지연만 중요한 노드라면 GRO를 끄거나 인터럽트 코얼레싱을 낮춘다.

# 인터럽트 병합을 최소화해 지연 튀는 것 완화
ethtool -C eth0 rx-usecs 0 rx-frames 1
# 커널 GRO 병합 타임 상한(마이크로초) 축소
ethtool -C eth0 gro-flush-timeout 0

함정 2: 패킷 캡처와 MTU 착시

tcpdump로 로컬에서 잡으면 GRO/GSO 때문에 실제 회선에 없는 20KB짜리 "슈퍼 패킷"이 보인다. MTU 초과 프레임을 봤다고 오해하기 쉽다. 실제 와이어 크기를 봐야 한다면 캡처 노드에서만 잠시 오프로드를 끄고 확인한다.

# 캡처 중에만 GRO/GSO/TSO 비활성화 후 확인
ethtool -K eth0 gro off gso off tso off
tcpdump -i eth0 -nn 'tcp port 443' -c 20
# 확인 끝나면 원복
ethtool -K eth0 gro on gso on tso on

함정 3: 터널·오버레이 환경

VXLAN·GENEVE·IPsec 같은 캡슐화에서는 이너 헤더까지 이해하는 오프로드(tx-udp_tnl-segmentation 등)가 켜져 있어야 성능이 유지된다. 드라이버가 이너 체크섬을 지원하지 않으면 GSO 조합이 어긋나 체크섬 오류나 성능 급락이 생긴다. 쿠버네티스 CNI 오버레이에서 특정 노드만 느리다면 NIC 모델·펌웨어별 터널 오프로드 지원을 먼저 의심한다.

ethtool -k eth0 | grep tnl
# tx-udp_tnl-segmentation: on
# tx-udp_tnl-csum-segmentation: on   # off면 VXLAN 성능 저하 의심

검증과 롤백 원칙

오프로드는 "무조건 켠다/끈다"가 아니라 노드 역할에 따라 결정한다. 종단 애플리케이션 서버는 처리량 우선으로 켜고, 포워딩·저지연·캡처 노드는 상황에 맞게 끈다. 변경 후에는 netstat -s의 재전송/체크섬 오류 카운터와 실제 애플리케이션 p99를 함께 본다. 처리량 그래프만 보고 판단하면 지연 회귀를 놓친다. 설정은 반드시 부팅 영속화하되, 변경 이력과 롤백 명령을 함께 남겨 문제 시 즉시 되돌릴 수 있게 한다.