Red Hat Training

A Red Hat training course is available for RHEL 8

31.6. Receive Flow Steering

RFS(Receive Flow Steering)は、RPS(Receive Packet Steering)の動作を拡張し、CPUキャッシュのヒット率を高めることで、ネットワークのレイテンシーを低減します。RPS はキューの長さのみに基づいてパケットを転送し、RFS は RPS バックエンドを使用して最も適切な CPU を算出します。次にパケットを消費するアプリケーションの場所に基づいてパケットを転送します。これにより、CPU キャッシュの効率が上がります。

1 つの送信者から受信したデータは複数の CPU に送信されません。1 つの送信元から受信するデータ量が 1 つの CPU が処理できるものよりも大きい場合は、割り込みの数や CPU の処理量を減らすために、より大きなフレームサイズを設定します。NIC オフロードオプションまたは高速 CPU について検討してください。

numactl または taskset を RFS と併用して、アプリケーションを特定のコア、ソケット、または NUMA ノードに固定することを検討してください。これにより、パケットが順番に処理されるようにします。

31.6.1. Receive Flow Steering の有効化

デフォルトでは、RFS (Receive Flow Steering) は無効になっています。この手順では、RFS を有効にする方法を説明します。

手順

  1. net.core.rps_sock_flow_entries カーネル値の値を、同時にアクティブな接続の最大数に設定します。

    # echo "net.core.rps_sock_flow_entries=32768" > /etc/sysctl.d/95-enable-rps.conf
    注記

    Red Hat は、サーバーの負荷に応じて 32768 を推奨します。入力されたすべての値は、実際には 2 の最も近い累乗に丸められます。

  2. net.core.rps_sock_flow_entries の値を永続的に設定します。

    # sysctl -p /etc/sysctl.d/95-enable-rps.conf
  3. sys/class/net/device/queues/rx-queue/rps_flow_cnt ファイルの値を (rps_sock_flow_entries/N) の値に一時的に設定します。ここでの N は、デバイスの受信キューの数です。

    # echo 2048 > /sys/class/net/device/queues/rx-queue/rps_flow_cnt

    deviceは設定したいネットワーク機器の名前(例:enp1s0)、rx-queueは設定したい受信キュー(例:rx-0)に置き換えてください。

    Nは設定された受信キューの数に置き換えてください。たとえば、rps_flow_entries32768 に設定され、16 の設定済み受信キューがある場合、rps_flow_cnt = 32786/16= 2048 (rps_flow_cnt = rps_flow_enties/N) です。

    単一キューデバイスの場合は、rps_flow_cnt の値は、rps_sock_flow_entries の値と同じです。

  4. すべてのネットワークデバイスで RFS を永続的に有効にし、/etc/udev/rules.d/99-persistent-net.rules ファイルを作成し、次のコンテンツを追加します。

    SUBSYSTEM=="net", ACTION=="add", RUN{program}+="/bin/bash -c 'for x in /sys/$DEVPATH/queues/rx-*; do echo 2048 > $x/rps_flow_cnt;  done'"
  5. 必要に応じて、特定のネットワークデバイスで RPS を有効にするには、以下を実行します。

    SUBSYSTEM=="net", ACTION=="move", NAME="device name" RUN{program}+="/bin/bash -c 'for x in /sys/$DEVPATH/queues/rx-*; do echo 2048 > $x/rps_flow_cnt; done'"

    device name を、実際のネットワークデバイス名に置き換えます。

検証手順

  • RFS が有効かどうかを確認します。

    # cat /proc/sys/net/core/rps_sock_flow_entries
    32768
    
    # cat /sys/class/net/device/queues/rx-queue/rps_flow_cnt
    2048

関連情報

  • sysctl(8)man ページ