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_entriesN で割った値に設定します。ここでの N は、デバイス上の受信キューの数です。たとえば、rps_flow_entries32768 に設定され、設定済みの受信キューが 16 ある場合、rps_flow_cnt2048 に設定します。単一キューデバイスでは、rps_flow_cntrps_sock_flow_entries の値と等しくなります。
単一の送信者から受信したデータは、複数の CPU には送信されません。単一送信者から受信したデータ量が 1 つの CPU が処理できる以上のものである場合、フレームサイズを大きく設定して割り込み数を減らすことで CPU の処理作業の量も減らすことができます。別の方法としては、NIC オフロードオプション かより高速の CPU を検討してください。
RFS と併せて numactl または taskset を使用してアプリケーションを特定のコア、ソケット、または NUMA ノードに固定することを検討してみてください。これにより、パケットが間違った順番で処理されることを防ぐことができます。