8.8. Receive Flow Steering (RFS)
Receive Flow Steering (RFS) は RPS の動作を拡張し、CPU キャッシュヒット率を高めることで、ネットワーク遅延を減らします。RPS がキューの長さのみに基づいてパケットを転送する部分で、RFS は RPS バックエンドを使用して最適な CPU を計算し、その後にパケットを消費するアプリケーションの場所に基づいてパケットを転送します。これにより、CPU キャッシュ効率が高まります。
RFS はデフォルトで無効になっています。RFS を有効にするには、以下の 2 つのファイルを編集する必要があります。
/proc/sys/net/core/rps_sock_flow_entries
- このファイルの値を同時にアクティブとなる接続数で予測される最大値に設定します。適度なサーバー負荷の場合は、
32768
に設定することが推奨されます。実際には、入力された値はすべて、直近の 2 の累乗に切り上げ/下げられます。 /sys/class/net/device/queues/rx-queue/rps_flow_cnt
- device を (
eth0
など) 設定するネットワークデバイス名に、rx-queue を (rx-0
など) 設定する受信キューに置き換えます。このファイルの値をrps_sock_flow_entries
をN
で割った値に設定します。ここでのN
は、デバイス上の受信キューの数です。たとえば、rps_flow_entries
が32768
に設定され、設定済みの受信キューが 16 ある場合、rps_flow_cnt
を2048
に設定します。単一キューデバイスでは、rps_flow_cnt
はrps_sock_flow_entries
の値と等しくなります。
単一の送信者から受信したデータは、複数の CPU には送信されません。単一送信者から受信したデータ量が 1 つの CPU が処理できる以上のものである場合、フレームサイズを大きく設定して割り込み数を減らすことで CPU の処理作業の量も減らすことができます。別の方法としては、NIC オフロードオプション
かより高速の CPU を検討してください。
RFS と併せて
numactl
または taskset
を使用してアプリケーションを特定のコア、ソケット、または NUMA ノードに固定することを検討してみてください。これにより、パケットが間違った順番で処理されることを防ぐことができます。