# RFS(Receive Flow Steering) RFS(Receive Flow Steering)とは、Linux カーネルのネットワーク受信スタックにおいて、[[RPS(Receive Packet Steering)]] を拡張し、アプリケーションプロセスの CPU キャッシュ局所性(cache locality)を考慮してパケット処理 CPU を選択する仕組みである。Linux 2.6.35 で導入された。 ## 動機 [[RPS(Receive Packet Steering)]] はパケットを他 CPU コアに分散できるが、パケットを処理する CPU と、そのフローのソケット(アプリケーション)を実行している CPU が異なる場合、データが CPU キャッシュに載っておらず余分なキャッシュミスが発生する。RFS はフローテーブルで「プロセスが最後に実行されたコア」を記録し、ネットワーク処理とアプリケーション処理を同じコアで実行する。 ## 設定方法 ```bash # 分散先 CPU コアのビットマスク(例: 4 コア全部有効) echo "f" > /sys/class/net/eth0/queues/rx-0/rps_cpus # NIC キューごとのフローテーブルエントリ数 echo 4096 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt # グローバルソケットフローテーブルのエントリ数 echo 32768 > /proc/sys/net/core/rps_sock_flow_entries ``` `rps_sock_flow_entries` は同時接続数 × 2 程度が目安。`rps_flow_cnt` は通常 `rps_sock_flow_entries` を NIC キュー数で割った値にする。 ## RSS・RPS との比較 | 手法 | ハードウェア依存 | キャッシュ局所性考慮 | 導入 | |---|---|---|---| | [[RSS(Receive Side Scaling)]] | NIC ハードウェア + ドライバ必須 | なし | NIC ファームウェア依存 | | [[RPS(Receive Packet Steering)]] | なし(ソフトウェア実装) | なし | Linux 2.6.35 | | RFS(本ページ) | なし(ソフトウェア実装) | あり | Linux 2.6.35 | ## 効果 [[Yuuki Tsubouchi]] による実験(16 コアシステム)では、RFS 有効化により: - CPU0 の softirq 集中が解消され、複数コアに分散 - Starlet(Perl 非同期フレームワーク)ベースのアプリケーションで約 10% の応答速度向上 HAProxy・pgpool・Varnish・memcached で副作用なく動作確認済み。 ## 位置づけ RFS はハードウェア非依存かつ設定が簡潔(3 パラメータ)であり、シングルキュー NIC 環境での高トラヒック処理を改善する最もコストパフォーマンスに優れたチューニング手法の一つ。[[スマートNICオフロード]] のようなハードウェアオフロードとは補完関係にある。 ## 横断的知見 - 今後の取り込みで、複数ソース間の関係を追記する。 ## 未解決の問い - この概念をどのソース群で継続的に検証するか。