9.2. TX 큐 잠금 경합 방지: 패킷 이동
NIC(Multi-queue Network Interface Controller)가 있는 호스트의 경우 XPS(Transmit Packet Steering)는 여러 큐에 걸쳐 발신 패킷 처리를 배포합니다. 이를 통해 여러 CPU가 트래픽을 처리할 수 있으므로 전송 대기열 잠금 경합 및 패킷 드롭이 방지됩니다.
ixgbe,i40e 및 mlx5 와 같은 특정 드라이버는 XPS를 자동으로 구성합니다. 드라이버가 이 기능을 지원하는지 확인하려면 NIC 드라이버 설명서를 참조하십시오. 드라이버가 XPS 자동 튜닝을 지원하지 않는 경우 전송 큐에 CPU 코어를 수동으로 할당할 수 있습니다.
Red Hat Enterprise Linux는 CPU 코어에 전송 대기열을 영구적으로 할당할 수 있는 옵션을 제공하지 않습니다. 인터페이스가 활성화되면 실행되는 NetworkManager 디스패치 스크립트의 명령을 사용합니다. 자세한 내용은 Red Hat Knowledgebase 솔루션에서 NetworkManager 디스패처 스크립트를 작성하여 인터페이스 시작 시 명령을 적용하는 방법을 참조하십시오.
Linux 네트워킹 스택의 스케일링에 대한 자세한 내용은 kernel-doc 패키지에서 제공하는 /usr/share/doc/kernel-doc- <version> /Documentation/networking/scaling.rst 파일을 참조하십시오.
사전 요구 사항
- 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사전 설정 최대값섹션에서는 총 대기열 수와현재 하드웨어 설정을수신, 전송, 기타 또는 결합된 큐에 현재 할당한 대기열 수를 보여줍니다.선택 사항: 특정 채널에 대기열이 필요한 경우 그에 따라 큐를 할당합니다. 예를 들어, 4개의 대기열을
Combined채널에 할당하려면 다음을 입력합니다.# ethtool -L enp1s0 combined 4NIC가 할당되는 NUMA(Non-Uniform Memory Access) 노드를 표시합니다.
# cat /sys/class/net/enp1s0/device/numa_node 0파일이 없거나 명령이
-1을 반환하면 호스트는 NUMA 시스템이 아닙니다.호스트가 NUMA 시스템인 경우 어떤 NUMA 노드에 할당되는 CPU를 표시합니다.
# 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_cpusCPU 코어 및 전송(TX) 대기열의 수가 동일한 경우 1~1 매핑을 사용하여 TX 대기열의 모든 종류의 경합을 방지합니다. 그렇지 않으면 동일한 TX 큐에 여러 CPU를 매핑하는 경우 다른 CPU에서 작업을 전송하면 TX 대기열 잠금 경합이 발생하고 전송 처리량에 부정적인 영향을 미칩니다.
CPU의 코어 번호를 포함하는 비트맵을 큐에 전달해야 합니다. 다음 명령을 사용하여 비트맵을 계산합니다.
# printf %x $((1 << <core_number> ))
검증
트래픽을 전송하는 서비스의 프로세스 ID(PID)를 식별합니다.
# pidof <process_name> 12345 98765XPS를 사용하는 코어에 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 ...큐 카운터가더 이상 상당한 속도로 증가하지 않으면 TX 큐 잠금 경합이 더 이상 발생하지 않습니다.