Linux 서버에서 네트워크 성능을 높이기 위해 RPS(Receive Packet Steering)를 설정했는데도 CPU 사용률이 기대만큼 개선되지 않는 경우가 있습니다. 이는 패킷은 여러 CPU로 분산되지만, 실제 애플리케이션이 실행되는 CPU와 패킷을 처리하는 CPU가 서로 다르기 때문입니다.
이러한 문제를 해결하기 위해 Linux에서는 RFS(Receive Flow Steering) 기능을 제공합니다. RFS는 패킷을 단순히 여러 CPU에 분산하는 것이 아니라, 애플리케이션이 실행 중인 CPU 코어로 패킷을 전달하여 CPU Cache 효율을 높이는 기능입니다.
이번 글에서는 Linux의 RFS 개념부터 설정 방법, 확인 방법, 성능 최적화까지 실무에서 자주 사용하는 내용을 자세히 알아보겠습니다.
RFS(Receive Flow Steering)란?
RFS는 Receive Flow Steering의 약자로, 네트워크 패킷을 해당 애플리케이션이 실행 중인 CPU 코어에서 처리하도록 유도하는 Linux 커널 기능입니다.
패킷 처리 과정은 다음과 같습니다.
NIC
↓
IRQ
↓
SoftIRQ
↓
RPS
↓
RFS
↓
애플리케이션이 실행 중인 CPU
이 방식은 CPU Cache Hit율을 높여 패킷 처리 성능을 향상시키고, CPU 간 데이터 이동(Cache Miss)을 줄여줍니다.
RFS를 사용하는 이유
다음과 같은 환경에서 효과가 큽니다.
- 웹 서버(Nginx, Apache)
- API 서버
- Kubernetes 노드
- Docker Host
- Redis
- MySQL
- PostgreSQL
- 고성능 Proxy 서버
- 대규모 TCP 연결 서버
- 게임 서버
실무에서는 동일한 CPU에서 패킷 처리와 애플리케이션 실행이 이루어질수록 성능이 향상됩니다.
1. 현재 RFS 설정 확인하기
먼저 Flow Entry 설정을 확인합니다.
cat /proc/sys/net/core/rps_sock_flow_entries
예시
0
값이 0이면 RFS가 비활성화된 상태입니다.
2. RFS 활성화하기
예를 들어 전체 Flow Entry를 32768개로 설정합니다.
echo 32768 > /proc/sys/net/core/rps_sock_flow_entries
이 값은 전체 시스템에서 사용할 Flow Table 크기를 의미합니다.
3. RX Queue별 Flow Count 설정하기
Queue별로 설정합니다.
echo 4096 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt
Queue가 여러 개라면 각각 설정합니다.
예시
echo 4096 > /sys/class/net/eth0/queues/rx-1/rps_flow_cnt
모든 RX Queue에 동일한 값을 설정하는 것이 일반적입니다.
4. 현재 Queue 확인하기
NIC Queue를 확인합니다.
ls /sys/class/net/eth0/queues/
예시
rx-0
rx-1
rx-2
rx-3
Queue 개수에 맞게 설정해야 합니다.
5. CPU 사용률 확인하기
mpstat -P ALL 1
CPU 사용률이 여러 코어에 고르게 분산되는지 확인합니다.
6. SoftIRQ 확인하기
cat /proc/softirqs
특히 다음 항목을 확인합니다.
- NET_RX
- NET_TX
RFS 적용 후 SoftIRQ가 특정 CPU에만 집중되지 않는지 확인합니다.
7. 네트워크 성능 확인하기
트래픽 확인
sar -n DEV 1
또는
iperf3 -c 서버IP
설정 전후 처리량과 CPU 사용률을 비교합니다.
8. IRQ 분산 상태 확인하기
cat /proc/interrupts
또는
watch -n 1 cat /proc/interrupts
IRQ와 RFS를 함께 확인하면 병목 구간을 찾기 쉽습니다.
9. RSS 및 RPS 설정 확인하기
RSS 확인
ethtool -l eth0
RPS 확인
cat /sys/class/net/eth0/queues/rx-0/rps_cpus
RFS는 RPS 위에서 동작하므로 RPS가 먼저 활성화되어 있어야 합니다.
10. 영구 적용하기
재부팅 후에도 유지하려면 /etc/sysctl.conf에 다음을 추가합니다.
net.core.rps_sock_flow_entries = 32768
Queue 설정은 systemd 서비스나 부팅 스크립트를 이용하여 적용합니다.
RFS 설정 확인 순서
실무에서는 다음 순서대로 진행하는 것이 좋습니다.
- Flow Entry 확인
- RFS 활성화
- RX Queue 설정
- Queue 개수 확인
- CPU 사용률 확인
- SoftIRQ 확인
- 네트워크 성능 확인
- 인터럽트 확인
- RSS 및 RPS 설정 확인
- 영구 적용
RFS 사용 시 주의사항
다음 사항을 함께 고려해야 합니다.
- RPS가 먼저 활성화되어 있어야 함
- RSS와 함께 사용 시 효과 증가
- Queue 개수에 맞게 Flow Count 설정
- NUMA 환경 고려
- CPU Cache 구조 고려
- NIC 드라이버 최신 버전 유지
특히 NUMA 서버에서는 동일한 NUMA 노드 내 CPU를 사용하는 것이 성능 향상에 도움이 됩니다.
자주 묻는 질문
RFS와 RPS의 가장 큰 차이는 무엇인가요?
RPS는 패킷을 여러 CPU에 분산하는 기능이고, RFS는 애플리케이션이 실행 중인 CPU로 패킷을 전달하여 CPU Cache 효율을 높이는 기능입니다.
RFS만 활성화하면 되나요?
아닙니다. RFS는 RPS를 기반으로 동작하므로 일반적으로 RPS도 함께 활성화해야 합니다.
RFS는 모든 서버에서 사용해야 하나요?
웹 서버나 API 서버처럼 네트워크 트래픽이 많은 환경에서는 효과가 크지만, 트래픽이 적은 서버에서는 성능 차이가 거의 없을 수도 있습니다.
마무리
RFS(Receive Flow Steering)는 Linux 커널에서 패킷을 애플리케이션이 실행 중인 CPU 코어로 전달하여 CPU Cache 활용도를 높이는 중요한 성능 최적화 기능입니다. rps_sock_flow_entries, rps_flow_cnt, mpstat, iperf3 등을 활용하면 설정 효과를 확인할 수 있으며, RPS와 RSS를 함께 사용하면 대규모 네트워크 환경에서도 더욱 안정적인 성능을 유지할 수 있습니다.