33.9.2. TX キューのロック競合の回避: 送信パケットステアリング
マルチキューネットワークインターフェイスコントローラー(NIC)を備えたホストの場合、Transmit Packet Steering (XPS)は送信パケット処理を複数のキューに分散します。これにより、複数の CPU がトラフィックを処理できるようになり、送信キューのロック競合とパケットドロップを防ぐことができます。
ixgbe、i40e、mlx5 などの特定のドライバーは、XPS を自動的に設定します。ドライバーがこの機能をサポートしているかどうかを確認するには、NIC ドライバーのドキュメントを参照してください。ドライバーが XPS 自動チューニングをサポートしていない場合は、CPU コアを送信キューに手動で割り当てることができます。
Red Hat Enterprise Linux には、送信キューを CPU コアに永続的に割り当てるオプションがありません。インターフェイスがアクティブ化されたときに実行される NetworkManager ディスパッチャースクリプト内のコマンドを使用してください。詳細は、Red Hat ナレッジベースのソリューション How to write a NetworkManager dispatcher script to apply commands on interface start を参照してください。
前提条件
- 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: 1Pre-set maximumsセクションにはキューの総数が表示され、Current hardware settingsには受信キュー、送信キュー、その他のキュー、または結合されたキューに現在割り当てられているキューの数が表示されます。オプション: 特定のチャネルにキューが必要な場合は、それに応じてキューを割り当てます。たとえば、4 つのキューを
Combinedチャネルに割り当てるには、次のように入力します。# ethtool -L enp1s0 combined 4NIC がどの Non-Uniform Memory Access (NUMA) ノードに割り当てられているかを表示します。
# 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 コアの 1 つにマッピングします。
# 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) キューの数が同じ場合は、TX キューで何らかの競合が発生するのを避けるために、1 対 1 マッピングを使用してください。複数の CPU を同じ TX キューにマップすると、各 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 ...requeuesカウンターが大幅な速度で増加しなくなると、TX キューロックの競合は発生しなくなります。