TCP GSO(Generic Segmentation Offload) 동작 원리: 네트워크 송신 시 CPU 오버헤드를 줄이는 마법





TCP GSO(Generic Segmentation Offload) 동작 원리와 CPU 최적화

GSO(Generic Segmentation Offload)는 CPU 사용량을 어떻게 줄일까? 송신 가속 기술의 핵심

대규모 웹 서비스나 클라우드 인프라를 운영하다 보면 대용량 파일을 사용자에게 다운로드해 주거나 대량의 트래픽을 송신해야 하는 상황을 마주합니다. 이때 네트워크 카드(NIC)의 대역폭만큼이나 중요한 것이 바로 ‘운영체제(OS) 커널의 CPU 사용량’입니다. 데이터를 패킷 단위로 쪼개는 작업은 생각보다 많은 CPU 연산력을 소모하기 때문입니다. 리눅스 커널은 이를 해결하기 위해 GSO(Generic Segmentation Offload)라는 지능적인 지연(Delay) 기술을 사용합니다. 본 포스팅에서는 GSO가 어떻게 CPU의 비명을 멈추고 송신 성능을 극대화하는지 그 내부 구조를 상세히 살펴보겠습니다.

1. GSO가 해결하려는 근본적인 문제: 분할(Segmentation) 오버헤드

응용 프로그램(예: 웹 서버, DB)이 수십 킬로바이트(KB)에서 수 메가바이트(MB)에 달하는 거대한 데이터를 네트워크로 보내려고 할 때, 이 데이터는 한 번에 나갈 수 없습니다. 데이터 링크 계층의 물리적 한계인 MTU(일반적으로 1,500바이트) 크기에 맞춰 여러 개의 작은 패킷(세그먼트)으로 쪼개져야 합니다.

GSO가 없다면 리눅스 커널의 TCP/IP 프로토콜 스택은 응용 프로그램이 준 거대한 데이터를 1,460바이트(MSS) 단위로 일일이 쪼개야 합니다. 이 과정에서 다음과 같은 엄청난 CPU 오버헤드가 발생합니다.

  • 쪼개진 수천 개의 패킷마다 각각의 IP 헤더와 TCP 헤더를 새로 생성하고 채워 넣는 연산
  • 각 패킷 헤더의 무결성을 검증하기 위한 체크섬(Checksum) 계산 연산
  • 수많은 패킷 구조체(sk_buff)를 메모리에 생성하고 관리하는 오버헤드

이 방식은 초고속 네트워크망에서 CPU가 프로토콜 스택 연산만 하다가 고갈되는 병목 현상을 유발합니다.

2. GSO(Generic Segmentation Offload)의 동작 원리

GSO의 핵심 철학은 “데이터를 쪼개는 무거운 작업을 최대한 뒤로 미루고(Delay), 커널 상부 레이어에서는 단 하나의 거대한 패킷인 것처럼 통째로 처리하여 CPU 소모를 줄이는 것”입니다.

2.1 슈퍼 패킷(Super Packet)의 유지

응용 프로그램이 보낸 대용량 데이터는 TCP 계층과 IP 계층을 통과할 때까지 절대 쪼개지지 않고 하나의 거대한 ‘슈퍼 패킷(Super Packet)’ 상태를 유지합니다. 커널은 이 거대한 덩어리에 딱 한 번만 TCP 헤더와 IP 헤더를 붙여서 네트워크 드라이버 계층(NIC 직전)까지 밀어 넣습니다.

2.2 하부 레이어에서의 지능적 분할

패킷이 랜카드(NIC) 드라이버 바로 앞 단계인 하부 계층에 도달해서야 GSO는 하드웨어의 성능을 확인합니다.

  • 하드웨어 가속(TSO) 지원 시: 랜카드가 스스로 패킷을 쪼갤 수 있는 기능(TSO, TCP Segmentation Offload)이 있다면, GSO는 거대한 덩어리를 쪼개지 않고 하드웨어 칩셋으로 통째로 넘깁니다. 분할 연산이 CPU가 아닌 랜카드 하드웨어에서 처리되므로 CPU 사용량은 0에 수용하게 됩니다.
  • 하드웨어 가속 미지원 시: 만약 구형 랜카드라 하드웨어가 쪼개지 못한다면, GSO는 그제야 소프트웨어적으로 거대한 패킷을 MTU 크기로 숭덩숭덩 분할하여 랜카드로 전달합니다.

2.3 커널 레이어 통과 비용의 최소화

설령 하드웨어가 분할 기능을 지원하지 않아서 소프트웨어(GSO)가 패킷을 쪼개더라도 CPU 사용량은 크게 줄어듭니다. 왜냐하면 복잡한 라우팅 체킹, 넷필터(Netfilter/iptables) 방화벽 검사, 정책 기반 라우팅 등의 무거운 커널 내부 프로세스를 수천 번 반복하는 대신 딱 한 번만 통과했기 때문입니다. 마지막 단계에서 기계적으로 헤더를 복사하고 복사본을 만드는 작업만 수행하므로 CPU 효율성이 극대화됩니다.

3. TSO vs GSO 결정적 차이점

송신 가속 기술을 논할 때 항상 함께 등장하는 TSO와의 차이를 이해하면 GSO의 가치를 더 명확히 알 수 있습니다.

비교 항목 TSO (TCP Segmentation Offload) GSO (Generic Segmentation Offload)
구현 주체 NIC 하드웨어 칩셋 (Hardware) 리눅스 커널 네트워크 스택 (Software)
하드웨어 의존성 필수 (랜카드가 지원해야만 작동) 없음 (모든 랜카드에서 소프트웨어로 보장)
지원 프로토콜 대부분 IPv4 / TCP로 제한됨 IPv4, IPv6, UDP, GRE/VXLAN 터널링 등 범용 지원
최적화 매커니즘 연산 자체를 하드웨어로 이관 커널 프로토콜 스택 통과 오버헤드 최소화

TSO는 완벽한 하드웨어 가속이지만 랜카드 기종과 프로토콜 종류에 따라 작동하지 않는 치명적인 제약이 있습니다. 반면 GSO는 하드웨어 지원 여부와 상관없이 커널 레벨에서 ‘지연 분할’을 통해 범용적인 성능 향상을 보장하므로, 현대 리눅스 시스템의 표준 송신 가속 솔루션으로 자리 잡았습니다.

4. 실무 엔지니어를 위한 GSO 설정 및 모니터링

고성능 웹 서버나 가상화 하이퍼바이저(KVM) 환경을 운영 중이라면 GSO 상태를 최적화해야 합니다.

  • GSO 상태 확인: ethtool -k eth0 | grep generic-segmentation-offload 명령어로 활성화(on) 여부를 확인합니다.
  • GSO 활성화 튜닝: ethtool -K eth0 gso on 명령을 통해 수동으로 활성화할 수 있습니다. (현대 리눅스 배포판은 기본 활성화 상태)
  • 가상화 환경(VM)에서의 가치: GSO는 가상 서버 환경에서 특히 빛을 발합니다. 가상머신(VM)에서 호스트 OS로 데이터를 보낼 때, 쪼개지지 않은 대형 패킷(Super Packet) 상태로 가상 스위치를 통과하므로 컨텍스트 스위칭 비용이 극적으로 줄어들어 VM 간의 통신 속도가 기가비트 급 이상으로 치솟게 됩니다.

결론: 연산 타이밍의 전환이 만든 혁신

GSO(Generic Segmentation Offload)는 무조건 하드웨어에 의존하거나 복잡한 알고리즘을 도입하는 대신, “분할 연산의 타이밍을 마지막 순간으로 미룬다”는 단순하고도 정교한 아이디어로 CPU 부하를 혁신적으로 줄였습니다. 프로토콜 스택을 통과하는 패킷의 절대적인 개수를 줄임으로써 멀티 기가비트 네트워크 트래픽 속에서도 서버가 CPU 고갈 없이 본연의 비즈니스 로직(응용 프로그램 연산)에 집중할 수 있도록 돕습니다. 시스템 아키텍트와 백엔드 엔지니어라면 대규모 인프라 설계 시 GSO의 역학 관계를 명확히 이해하고 최적의 상태를 유지해야 합니다.

2026년 현재 보편화된 대규모 쿠버네티스(Kubernetes) 환경에서 가상 네트워크 플러그인(CNI) 간의 패킷 캡슐화(VxLAN, Geneve) 오버헤드는 지연의 주범입니다. 이때 GSO 계열의 가속 기술이 하부 레이어에서 캡슐화된 대형 패킷을 한 번에 처리해 주지 않으면 컨테이너 환경의 네트워크 성능이 급격히 무너질 수 있으므로, 플랫폼 엔지니어에게 GSO 튜닝은 필수 조건입니다.