33.9.2. TX キューのロック競合の回避: 送信パケットステアリング


マルチキューネットワークインターフェイスコントローラー(NIC)を備えたホストの場合、Transmit Packet Steering (XPS)は送信パケット処理を複数のキューに分散します。これにより、複数の CPU がトラフィックを処理できるようになり、送信キューのロック競合とパケットドロップを防ぐことができます。

ixgbei40emlx5 などの特定のドライバーは、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 パッケージがインストールされている。

手順

  1. 使用可能なキューの数を表示します。

    # 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 セクションにはキューの総数が表示され、Current hardware settings には受信キュー、送信キュー、その他のキュー、または結合されたキューに現在割り当てられているキューの数が表示されます。

  2. オプション: 特定のチャネルにキューが必要な場合は、それに応じてキューを割り当てます。たとえば、4 つのキューを Combined チャネルに割り当てるには、次のように入力します。

    # ethtool -L enp1s0 combined 4
  3. NIC がどの Non-Uniform Memory Access (NUMA) ノードに割り当てられているかを表示します。

    # cat /sys/class/net/enp1s0/device/numa_node
    0

    ファイルが見つからない場合、またはコマンドが -1 を返す場合は、ホストは NUMA システムではありません。

  4. ホストが NUMA システムの場合は、どの CPU がどの NUMA ノードに割り当てられているかを表示します。

    # lscpu | grep NUMA
    NUMA node(s):       2
    NUMA node0 CPU(s):  0-3
    NUMA node1 CPU(s):  4-7
  5. 上の例では、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_cpus

    CPU コアと送信 (TX) キューの数が同じ場合は、TX キューで何らかの競合が発生するのを避けるために、1 対 1 マッピングを使用してください。複数の CPU を同じ TX キューにマップすると、各 CPU の送信操作によって TX キューのロック競合が発生し、送信スループットに悪影響が発生します。

    CPU のコア番号を含むビットマップをキューに渡す必要があることに注意してください。次のコマンドを使用してビットマップを計算します。

    # printf %x $((1 << <core_number> ))

検証

  1. トラフィックを送信するサービスのプロセス ID (PID) を特定します。

    # pidof <process_name>
    12345 98765
  2. XPS を使用するコアに PID を固定します。

    # numactl -C 0-3 12345 98765
  3. プロセスがトラフィックを送信している間、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 キューロックの競合は発生しなくなります。

Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

Red Hat ドキュメントについて

Legal Notice

Theme

© 2026 Red Hat
トップに戻る