ユーザ用ツール

サイト用ツール


os:10gbps_のパケット転送

差分

このページの2つのバージョン間の差分を表示します。


os:10gbps_のパケット転送 [2023/11/02 19:25] (現在) – 作成 - 外部編集 127.0.0.1
行 1: 行 1:
 +====== 10Gbps のパケット転送 ======
  
 +10Gbps の NIC を挿してパケット転送をなるべく高速に行う際のポイントについて列挙します。
 +
 +===== FIB algorithm =====
 +
 +FreeBSD 13.0 から Fib の検索アルゴリズムが変わりました。
 +''options FIB_ALGO'' を付けてカーネルをビルドすると sysctl で次のように検索アルゴリズムを表示・選択できるようになります。
 +
 +<code>
 +net.route.algo.debug_level: 5
 +net.route.algo.inet.algo: bsearch4
 +net.route.algo.inet.algo_list: bsearch4, radix4_lockless, radix4
 +net.route.algo.inet6.algo: radix6_lockless
 +net.route.algo.inet6.algo_list: radix6_lockless, radix6
 +net.route.algo.fib_max_sync_delay_ms: 1000
 +net.route.algo.bucket_change_threshold_rate: 500
 +net.route.algo.bucket_time_ms: 50
 +</code>
 +
 +デフォルトで IPv4 はロックのかかるアルゴリズムになっていますので、経路表のエントリ数が多い(1万以上?)場合には lockless のアルゴリズムを選びましょう。
 +このあたりは、経路数、経路の更新頻度や通信量(経路表参照回数)に依存する部分なので、どれが良いとは一概に言えませんが、経路数が多いならば、bsearchよりRadix系を選択する方が良いことが多いと言えます。
 +
 +  * Lockless: bsearch4, radix[46]_lockless
 +  * Lockあり: radix[46]
 +
 +なお、FreeBSD-13.2-RELEASE 及び、FreeBSD-14.0-RELEASEでは ''Options FIB_ALGO'' は GENERIC カーネルに入っています。
 +
 +また、手元で確認した限りでは、FreeBSD-13.2以降は、IPv4 が bsearch4、IPv6ではradix6_locklessが標準となっています。
 +
 +==== RSS (Receive Side Scaling) ====
 +
 +Receive Side Scaling を有効にするには以下の全てを満たす必要があります。
 +
 +  -  multi-queue を持つ NIC を用意すること
 +  -  該当ドライバが multi-queue を扱えること
 +  -  `Options  RSS` を付けてビルドしたカーネルであること
 +  -  sysctl net.isr.maxthreads に NICの持つ queue 以上の数を指定すること (-1 で CPU Core数と同じ数になります)
 +  -  sysctl net.isr.bindthreads=1 を指定すること
 +
 +なお、FreeBSD-13.2-RELEASE/14.0-RELEASEでは、GENERIC kernelにはRSSは含まれていません。必要に応じてkernelをbuildする必要があります。
 +==== TSO & LRO ====
 +
 +10Gbps の NIC にはほとんどの場合、TSO (TCP Segment Offload) や LRO (Large Receive Offload) の機能がついています。
 +これらは大きなデータを転送する際にパケットの分割、統合を NIC 側で行ってくれるものです。
 +ルータとして構築する場合、TSO/LROはoffにするべきです。中継段でのパケットの再構成、分割を行うことは望ましくありません。
 +
 +ifconfig のオプションに ''-tso -lro -vlanhwtso'' を付けておきます。
 +
 +==== FreeBSD 12系以前の話 ====
 +
 +''sysctl net.inet.ip.redirect=0'' を設定すると fast forwarding するようになり高速にパケット転送されます。
 +
 +これは、12系以前では net.inet.ip.redirect=1 (デフォルト)だと fast forwarding のコードパスを通らないためです。
 +
 +以下の commit でこの動作が変更されました。
 +
 +https://cgit.freebsd.org/src/commit/?id=f389439f50fc4c27d15d3017b622270e25ba71c7
 +
 +IPv6 を転送する時には同様に ''net.inet6.ip6.redirect=0'' を設定します。
os/10gbps_のパケット転送.1698920393.txt.gz · 最終更新: 2023/11/02 19:20 (外部編集)

特に明示されていない限り、本Wikiの内容は次のライセンスに従います: 2-Clause BSD License
Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki