31.9. 수신 대기 대기열 잠금 경합 방지
큐 잠금 경합으로 인해 패킷이 감소하고 CPU 사용량이 증가할 수 있으므로 대기 시간이 길어집니다. 애플리케이션을 조정하고 패킷 라이틀링을 사용하여 수신(RX) 및 전송(TX) 대기열에서 대기열 잠금 경합을 방지할 수 있습니다.
31.9.1. RX 대기열 잠금 방지: SO_REUSEPORT 및 SO_REUSEPORT_BPF 소켓 옵션
멀티 코어 시스템에서는 애플리케이션이 SO_REUSEPORT
또는 SO_REUSEPORT_BPF
소켓 옵션을 사용하여 포트를 여는 경우 다중 스레드 네트워크 서버 애플리케이션의 성능을 향상시킬 수 있습니다. 애플리케이션에서 이러한 소켓 옵션 중 하나를 사용하지 않는 경우 모든 스레드는 들어오는 트래픽을 수신하기 위해 단일 소켓을 공유해야 합니다. 단일 소켓 원인을 사용하여 다음을 수행합니다.
- 수신 버퍼의 상당한 경합으로 인해 패킷이 감소하고 CPU 사용량이 증가할 수 있습니다.
- CPU 사용량이 크게 증가
- 패킷이 삭제될 수 있습니다.
SO_REUSEPORT
또는 SO_REUSEPORT_BPF
소켓 옵션을 사용하면 한 호스트의 여러 소켓이 동일한 포트에 바인딩될 수 있습니다.
Red Hat Enterprise Linux는 커널 소스에서 SO_REUSEPORT
소켓 옵션을 사용하는 방법에 대한 코드 예제를 제공합니다. 코드 예제에 액세스하려면 다음을 수행합니다.
rhel-9-for-x86_64-baseos-debug-rpms
리포지토리를 활성화합니다.# subscription-manager repos --enable rhel-9-for-x86_64-baseos-debug-rpms
kernel-debuginfo-common-x86_64
패키지를 설치합니다.# dnf install kernel-debuginfo-common-x86_64
-
코드 예제는 이제
/usr/src/debug/kernel- <version> /linux-<version>/tools/testing/selftests/net/reuseport_bpf_cpu.c
파일에서 사용할 수 있습니다.
추가 리소스
-
시스템의
socket(7)
도움말 페이지 -
/usr/src/debug/kernel- <version> /linux-<version>/tools/testing/selftests/net/reuseport_bpf_cpu.c
31.9.2. TX 대기열 잠금 경합 방지: 패킷 작동 전송
여러 큐를 지원하는 NIC(네트워크 인터페이스 컨트롤러)가 있는 호스트에서 송신된 네트워크 패킷 처리(XPS)는 여러 큐 간에 발신 네트워크 패킷을 배포합니다. 이를 통해 여러 CPU가 발신 네트워크 트래픽을 처리하고 대기열 잠금 경합 전송을 방지할 수 있으므로 패킷이 삭제됩니다.
ixgbe
,i40e
및 mlx5
와 같은 특정 드라이버는 XPS를 자동으로 구성합니다. 드라이버가 이 기능을 지원하는지 확인하려면 NIC 드라이버 설명서를 참조하십시오. NIC 드라이버의 설명서를 참조하여 드라이버가 이 기능을 지원하는지 확인합니다. 드라이버가 XPS 자동 튜닝을 지원하지 않는 경우 CPU 코어를 전송 대기열에 수동으로 할당할 수 있습니다.
Red Hat Enterprise Linux는 CPU 코어에 전송 대기열을 영구적으로 할당할 수 있는 옵션을 제공하지 않습니다. 스크립트에서 명령을 사용하고 시스템이 부팅될 때 실행합니다.
사전 요구 사항
- NIC는 여러 큐를 지원합니다.
-
numactl
패키지가 설치되어 있어야 합니다.
절차
사용 가능한 대기열 수를 표시합니다.
# ethtool -l enp1s0 Channel parameters for enp1s0: Pre-set maximums: RX: 0 TX: 0 Other: 0 Combined: 4 Current hardware settings: RX: 0 TX: 0 Other: 0 Combined: 1
Pre-set maximums
섹션에는 총 대기열 수와현재
수신, 전송, 기타 또는 결합된 대기열에 할당된 대기열 수가 설정되어 있습니다.선택 사항: 특정 채널에서 대기열이 필요한 경우 적절하게 할당합니다. 예를 들어 4개의 대기열을
Combined
채널에 할당하려면 다음을 입력합니다.# ethtool -L enp1s0 combined 4
NIC가 할당된 NUMA(Non-Uniform Memory Access) 노드에 표시합니다.
# cat /sys/class/net/enp1s0/device/numa_node 0
파일을 찾을 수 없거나 명령이
-1
을 반환하는 경우 호스트는 NUMA 시스템이 아닙니다.호스트가 NUMA 시스템인 경우 어떤 CPU가 어떤 NUMA 노드에 할당되는지 표시합니다.
# lscpu | grep NUMA NUMA node(s): 2 NUMA node0 CPU(s): 0-3 NUMA node1 CPU(s): 4-7
위의 예에서 NIC에는 4개의 대기열이 있으며 NIC는 NUMA 노드 0에 할당됩니다. 이 노드는 CPU 코어 0-3을 사용합니다. 결과적으로 각 전송 큐를 0-3에서 CPU 코어 중 하나에 매핑합니다.
# echo 1 > /sys/class/net/enp1s0/queues/tx-0/xps_cpus # echo 2 > /sys/class/net/enp1s0/queues/tx-1/xps_cpus # echo 4 > /sys/class/net/enp1s0/queues/tx-2/xps_cpus # echo 8 > /sys/class/net/enp1s0/queues/tx-3/xps_cpus
CPU 코어 수와 전송(TX) 대기열 수가 동일한 경우 1에서 1개의 매핑을 사용하여 TX 대기열의 경합을 방지합니다. 그렇지 않으면 동일한 TX 큐에 여러 CPU를 매핑하면 서로 다른 CPU에 대한 전송 작업으로 인해 TX 대기열 잠금 경합이 발생하고 전송 처리량에 부정적인 영향을 미칩니다.
CPU의 코어 번호가 포함된 비트맵을 큐에 전달해야 합니다. 다음 명령을 사용하여 비트맵을 계산합니다.
# printf %x $((1 << <core_number> ))
검증
트래픽을 전송하는 서비스의 프로세스 ID(PID)를 식별합니다.
# pidof <process_name> 12345 98765
XPS를 사용하는 코어에 PID를 고정합니다.
# numactl -C 0-3 12345 98765
프로세스에서 트래픽을 보내는 동안
requeues
카운터를 모니터링합니다.# tc -s qdisc qdisc fq_codel 0: dev enp10s0u1 root refcnt 2 limit 10240p flows 1024 quantum 1514 target 5ms interval 100ms memory_limit 32Mb ecn drop_batch 64 Sent 125728849 bytes 1067587 pkt (dropped 0, overlimits 0 requeues 30) backlog 0b 0p requeues 30 ...
Requeue
s
카운터가 더 이상 상당한 속도로 증가하지 않으면 TX 대기열 잠금 경합이 더 이상 발생하지 않습니다.
추가 리소스
-
/usr/share/doc/kernel-doc-_<version>/Documentation/networking/scaling.rst
31.9.3. UDP 트래픽이 높은 서버에서 Generic Receive Offload 기능 비활성화
고속 UDP 대량 전송을 사용하는 애플리케이션은 UDP 소켓에서 UDP GRO(Generic Receive Offload)를 활성화하고 사용해야 합니다. 그러나 다음 조건이 적용되는 경우 GRO를 비활성화하여 처리량을 늘릴 수 있습니다.
- 애플리케이션이 GRO를 지원하지 않으며 기능을 추가할 수 없습니다.
TCP 처리량은 중요하지 않습니다.
주의GRO를 비활성화하면 TCP 트래픽의 수신 처리량이 크게 저하됩니다. 따라서 TCP 성능이 관련된 호스트에서 GRO를 비활성화하지 마십시오.
사전 요구 사항
- 호스트는 주로 UDP 트래픽을 처리합니다.
- 애플리케이션에서 GRO를 사용하지 않습니다.
- 호스트는 VXLAN과 같은 UDP 터널 프로토콜을 사용하지 않습니다.
- 호스트에서 VM(가상 머신) 또는 컨테이너를 실행하지 않습니다.
절차
선택 사항: NetworkManager 연결 프로필을 표시합니다.
# nmcli connection show NAME UUID TYPE DEVICE example f2f33f29-bb5c-3a07-9069-be72eaec3ecf ethernet enp1s0
연결 프로필에서 GRO 지원을 비활성화합니다.
# nmcli connection modify example ethtool.feature-gro off
연결 프로필을 다시 활성화합니다.
# nmcli connection up example
검증
GRO가 비활성화되어 있는지 확인합니다.
# ethtool -k enp1s0 | grep generic-receive-offload generic-receive-offload: off
- 서버의 처리량을 모니터링합니다. 설정이 호스트의 다른 애플리케이션에 부정적인 영향을 미치는 경우 NetworkManager 프로필에서 GRO를 다시 활성화합니다.