Linux 서버를 운영하다 보면 네트워크 트래픽이 증가할수록 특정 CPU 코어만 과부하가 발생하는 경우가 있습니다. 특히 고성능 웹 서버나 API 서버에서는 하나의 CPU 코어만 네트워크 패킷을 처리하면서 병목 현상이 발생할 수 있습니다.
이러한 문제를 해결하기 위해 Linux에서는 RPS(Receive Packet Steering) 기능을 제공합니다. RPS는 수신된 네트워크 패킷을 여러 CPU 코어로 분산하여 처리하도록 하는 기능으로, 멀티코어 CPU의 성능을 더욱 효율적으로 활용할 수 있도록 도와줍니다.
이번 글에서는 RPS의 개념부터 설정 방법, 성능 확인, 최적화 방법까지 실무에서 자주 사용하는 내용을 자세히 알아보겠습니다.
RPS(Receive Packet Steering)란?
RPS는 네트워크 카드(NIC)가 수신한 패킷을 하나의 CPU가 아닌 여러 CPU에서 SoftIRQ 방식으로 처리하도록 분산하는 Linux 커널 기능입니다.
기본적으로 RSS(Receive Side Scaling)를 지원하지 않는 네트워크 카드에서도 CPU 부하를 분산할 수 있다는 장점이 있습니다.
패킷 처리 과정은 다음과 같습니다.
NIC
↓
Interrupt 발생
↓
SoftIRQ
↓
RPS가 CPU 선택
↓
여러 CPU에서 패킷 처리
RPS는 네트워크 성능 향상뿐 아니라 특정 CPU 코어의 과부하를 줄이는 데 매우 효과적입니다.
RPS를 사용하는 대표적인 이유
다음과 같은 환경에서 많이 사용됩니다.
- 특정 CPU 코어 과부하
- 웹 서버 고트래픽
- API 서버
- Kubernetes 노드
- Docker Host
- Nginx 서버
- 고성능 Proxy 서버
- RSS 미지원 NIC
- 가상화 환경
- 대량 패킷 처리 서버
실무에서는 SoftIRQ 부하 분산을 위해 RPS를 적용하는 경우가 많습니다.
1. CPU 코어 확인하기
먼저 CPU 개수를 확인합니다.
nproc
또는
lscpu
CPU 개수에 따라 RPS 마스크를 설정합니다.
2. 현재 RPS 설정 확인하기
다음 명령으로 확인합니다.
cat /sys/class/net/eth0/queues/rx-0/rps_cpus
예시
00000000
00000000이면 RPS가 비활성화된 상태입니다.
3. RPS 활성화하기
예를 들어 CPU가 8개인 경우
echo ffffffff > /sys/class/net/eth0/queues/rx-0/rps_cpus
CPU가 4개인 경우
echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus
모든 CPU를 사용하도록 설정할 수 있습니다.
4. 여러 RX Queue 설정하기
NIC에 여러 RX Queue가 있다면 각각 설정합니다.
확인
ls /sys/class/net/eth0/queues/
각 Queue마다 적용
echo ffffffff > /sys/class/net/eth0/queues/rx-1/rps_cpus
모든 RX Queue에 동일하게 설정하는 것이 일반적입니다.
5. RPS Flow Count 설정하기
Flow Count도 함께 설정하는 것이 좋습니다.
echo 32768 > /proc/sys/net/core/rps_sock_flow_entries
Queue별 설정
echo 4096 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt
Flow 기반 패킷 분산 효율을 높일 수 있습니다.
6. SoftIRQ 확인하기
설정 전후를 비교합니다.
cat /proc/softirqs
또는
mpstat -P ALL 1
SoftIRQ가 여러 CPU에 분산되는지 확인합니다.
7. 인터럽트 확인하기
cat /proc/interrupts
또는
watch -n 1 cat /proc/interrupts
RPS는 인터럽트 자체보다 SoftIRQ 분산 효과를 확인하는 것이 중요합니다.
8. 네트워크 성능 측정하기
트래픽 확인
sar -n DEV 1
또는
iperf3 -c 서버IP
설정 전후의 처리량과 CPU 사용률을 비교합니다.
9. 영구 적용하기
재부팅 후에도 유지하려면 스크립트나 systemd 서비스를 사용합니다.
예시
echo ffffffff > /sys/class/net/eth0/queues/rx-0/rps_cpus
echo 32768 > /proc/sys/net/core/rps_sock_flow_entries
echo 4096 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt
부팅 시 자동 실행되도록 등록하면 됩니다.
10. RSS와 함께 사용하기
RSS를 지원하는 NIC라면 함께 사용하는 것이 좋습니다.
RSS 확인
ethtool -l eth0
또는
ethtool -x eth0
RSS와 RPS를 함께 사용하면 멀티코어 성능을 더욱 효율적으로 활용할 수 있습니다.
RPS 설정 확인 순서
실무에서는 다음 순서대로 진행하는 것이 좋습니다.
- CPU 개수 확인
- 현재 RPS 설정 확인
- RPS 활성화
- RX Queue 설정
- Flow Count 설정
- SoftIRQ 확인
- 인터럽트 확인
- 성능 테스트
- 영구 적용
- RSS 연동 확인
RPS 사용 시 주의사항
다음 사항을 함께 고려해야 합니다.
- CPU 수에 맞는 비트마스크 설정
- NUMA 환경 고려
- RSS 지원 여부 확인
- NIC 드라이버 확인
- irqbalance와 함께 사용
- SoftIRQ 사용률 모니터링
특히 NUMA 서버에서는 동일한 NUMA 노드의 CPU를 사용하는 것이 성능에 유리합니다.
자주 묻는 질문
RPS와 RSS의 차이는 무엇인가요?
RSS는 네트워크 카드가 하드웨어 수준에서 패킷을 여러 Queue로 분산하는 기능이고, RPS는 Linux 커널이 SoftIRQ 단계에서 CPU를 분산하는 기능입니다.
RSS를 지원하면 RPS는 필요 없나요?
반드시 그렇지는 않습니다. RSS를 지원하더라도 특정 환경에서는 RPS를 함께 사용하면 성능이 더 향상될 수 있습니다.
RPS는 모든 서버에서 활성화해야 하나요?
일반적인 서버에서는 도움이 되는 경우가 많지만, 초저지연 시스템이나 특수한 네트워크 환경에서는 성능 테스트 후 적용 여부를 결정하는 것이 좋습니다.
마무리
RPS(Receive Packet Steering)는 Linux 커널에서 네트워크 패킷을 여러 CPU 코어로 분산 처리하여 SoftIRQ 병목을 줄이고 시스템 성능을 향상시키는 중요한 기능입니다. rps_cpus, rps_flow_cnt, mpstat, iperf3 등을 활용하면 설정 효과를 쉽게 확인할 수 있으며, RSS 및 irqbalance와 함께 사용하면 고성능 네트워크 환경에서도 안정적인 성능을 유지할 수 있습니다.