Linux 서버에서 대량의 네트워크 트래픽을 처리하는 환경에서는 수신(Receive) 성능뿐만 아니라 송신(Transmit) 성능도 매우 중요합니다. 특히 웹 서버, API 서버, 프록시 서버처럼 응답 패킷이 많은 환경에서는 송신 패킷 처리가 특정 CPU 코어에 집중되면서 성능 저하가 발생할 수 있습니다.
이러한 문제를 해결하기 위해 Linux에서는 XPS(Transmit Packet Steering) 기능을 제공합니다. XPS는 송신 패킷을 여러 CPU 코어에 효율적으로 분산하여 CPU Cache 활용도를 높이고 네트워크 처리량을 향상시키는 기능입니다.
이번 글에서는 XPS의 개념부터 설정 방법, 확인 방법, 성능 최적화 방법까지 실무에서 자주 사용하는 내용을 자세히 알아보겠습니다.
XPS(Transmit Packet Steering)란?
XPS는 Transmit Packet Steering의 약자로, 네트워크 패킷을 송신할 때 어떤 CPU 코어가 해당 Queue를 사용할지 결정하는 Linux 커널 기능입니다.
패킷 처리 과정은 다음과 같습니다.
Application
↓
TCP/IP Stack
↓
XPS
↓
TX Queue 선택
↓
NIC 전송
XPS를 사용하면 송신 패킷이 여러 CPU 코어에 분산되어 특정 CPU에 부하가 집중되는 현상을 줄일 수 있습니다.
XPS를 사용하는 이유
다음과 같은 환경에서 효과가 큽니다.
- Nginx 웹 서버
- Apache 웹 서버
- API 서버
- HAProxy
- Kubernetes Node
- Docker Host
- Redis
- 게임 서버
- 대규모 TCP 서버
- CDN 서버
실무에서는 송신 트래픽이 많은 서버에서 CPU Cache 효율 향상을 위해 XPS를 적용하는 경우가 많습니다.
1. TX Queue 확인하기
먼저 NIC의 TX Queue를 확인합니다.
ls /sys/class/net/eth0/queues/
예시
rx-0
rx-1
tx-0
tx-1
TX Queue 개수를 먼저 확인해야 합니다.
2. 현재 XPS 설정 확인하기
현재 CPU 비트마스크를 확인합니다.
cat /sys/class/net/eth0/queues/tx-0/xps_cpus
예시
00000000
값이 00000000이면 XPS가 비활성화된 상태입니다.
3. XPS 활성화하기
CPU가 8개인 경우
echo ffffffff > /sys/class/net/eth0/queues/tx-0/xps_cpus
CPU가 4개인 경우
echo f > /sys/class/net/eth0/queues/tx-0/xps_cpus
여러 TX Queue가 있다면 각각 동일하게 설정합니다.
echo ffffffff > /sys/class/net/eth0/queues/tx-1/xps_cpus
4. CPU 사용률 확인하기
설정 전후 CPU 사용률을 비교합니다.
mpstat -P ALL 1
CPU 사용률이 여러 코어에 균등하게 분산되는지 확인합니다.
5. 인터럽트 확인하기
cat /proc/interrupts
또는
watch -n 1 cat /proc/interrupts
TX Queue와 IRQ 분산 상태를 함께 확인하면 더욱 정확하게 분석할 수 있습니다.
6. SoftIRQ 확인하기
송신 패킷 처리와 관련된 SoftIRQ를 확인합니다.
cat /proc/softirqs
다음 항목을 확인합니다.
- NET_TX
- NET_RX
NET_TX가 특정 CPU에 집중되지 않는지 확인합니다.
7. NIC Queue 정보 확인하기
NIC Queue 개수를 확인합니다.
ethtool -l eth0
Queue 변경이 가능한 경우
ethtool -L eth0 combined 8
하드웨어가 지원하는 범위 내에서 Queue 수를 조정할 수 있습니다.
8. 네트워크 성능 테스트
송신 성능을 확인합니다.
iperf3 -c 서버IP
또는
sar -n DEV 1
설정 전후 처리량과 CPU 사용률을 비교합니다.
9. RSS 및 RPS, RFS 확인하기
다음 기능과 함께 사용하는 것이 일반적입니다.
RSS 확인
ethtool -x eth0
RPS 확인
cat /sys/class/net/eth0/queues/rx-0/rps_cpus
RFS 확인
cat /proc/sys/net/core/rps_sock_flow_entries
이 기능들을 함께 적용하면 송수신 패킷을 모두 효율적으로 분산할 수 있습니다.
10. 영구 적용하기
재부팅 후에도 유지하려면 systemd 서비스 또는 부팅 스크립트에 등록합니다.
예시
echo ffffffff > /sys/class/net/eth0/queues/tx-0/xps_cpus
echo ffffffff > /sys/class/net/eth0/queues/tx-1/xps_cpus
운영 환경에서는 자동 적용 스크립트를 사용하는 것이 일반적입니다.
XPS 설정 확인 순서
실무에서는 다음 순서대로 진행하는 것이 좋습니다.
- TX Queue 확인
- 현재 XPS 설정 확인
- XPS 활성화
- CPU 사용률 확인
- 인터럽트 확인
- SoftIRQ 확인
- NIC Queue 확인
- 네트워크 성능 테스트
- RSS, RPS, RFS 설정 확인
- 영구 적용
XPS 사용 시 주의사항
다음 사항을 함께 고려해야 합니다.
- CPU 수에 맞는 비트마스크 사용
- NUMA 구조 고려
- RSS와 함께 사용
- RPS 및 RFS와 병행 적용
- NIC 드라이버 최신 버전 유지
- Queue 개수와 CPU 개수의 균형 유지
특히 NUMA 환경에서는 동일한 NUMA 노드의 CPU와 Queue를 연결하는 것이 성능 향상에 도움이 됩니다.
자주 묻는 질문
XPS와 RPS의 차이는 무엇인가요?
RPS는 수신(Receive) 패킷을 여러 CPU에 분산하는 기능이며, XPS는 송신(Transmit) 패킷을 여러 CPU에 분산하는 기능입니다.
XPS를 반드시 설정해야 하나요?
일반적인 서버에서는 필수는 아닙니다. 하지만 대량의 송신 트래픽을 처리하는 서버에서는 성능 향상 효과를 기대할 수 있습니다.
RSS, RPS, RFS, XPS를 모두 사용하는 것이 좋나요?
고성능 서버에서는 함께 사용하는 경우가 많습니다. 다만 서버 환경과 NIC 성능에 따라 최적의 설정이 달라질 수 있으므로 성능 테스트를 병행하는 것이 좋습니다.
마무리
XPS(Transmit Packet Steering)는 Linux 커널에서 송신 패킷을 여러 CPU 코어에 효율적으로 분산하여 CPU Cache 활용도와 네트워크 성능을 향상시키는 핵심 기능입니다. xps_cpus, mpstat, /proc/softirqs, iperf3, ethtool 등을 활용하면 설정 효과를 확인할 수 있으며, RSS·RPS·RFS와 함께 구성하면 대규모 트래픽 환경에서도 안정적이고 높은 네트워크 성능을 유지할 수 있습니다.