# 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オフロード]] のようなハードウェアオフロードとは補完関係にある。
## 横断的知見
- 今後の取り込みで、複数ソース間の関係を追記する。
## 未解決の問い
- この概念をどのソース群で継続的に検証するか。