More Related Content
Similar to マルチコアとネットワークスタックの高速化技法
Similar to マルチコアとネットワークスタックの高速化技法 (20)
More from Takuya ASADA (14)
マルチコアとネットワークスタックの高速化技法
- 12. Interrupt Moderation
on ixgbe(4)
• hw.ixgbe.enable_aim
流量に応じ動的に割り込み頻度を調整
• hw.ixgbe.max_interrupt_rate
割り込み頻度を指定
• hw.intr_storm_threshold
割り込みが多すぎると警告が出るようにな
っているので、警告上限を上げる必要がある
13年4月23日火曜日
- 13. Interrupt Moderationを切っ
てみる
• Linux, ixgbeで実験
• modprobe ixgbe InterruptThrottleRate=0,0
• iperf -s / iperf -c <IP>
• 24000 - 31000 interrupts/sec for 1CPU
(これでも後述のハイブリッド方式の為、
ソフト的に割り込み抑制をかけている)
13年4月23日火曜日
- 18. netisr direct dispatch
• LinuxのNAPIと同様
• 割り込みコンテキストから
直接プロトコル処理を実行
• Ringバッファにパケットが
ある間、NICの割り込みを
禁止
• Ringバッファが空になった
ら割り込み再開
Process(User)
Process(Kernel)
HW Intr Handler
パケット受信
プロトコル処理
ソケット
受信処理
ユーザ
プログラム
user
buffer
socket
queue
パケット
システムコール
プロセス起床
ハードウェア割り込み
ユーザ空間へコピー
13年4月23日火曜日
- 19. Low latency interrupt
• ハードウェアでの対応
• Interrupt Coalescingを行った結果レイテ
ンシが増大
• 低レイテンシで処理したいパケットを
判別
Coalescingを無視して即時割り込み
13年4月23日火曜日
- 20. LLI on ixgbe
• 以下のようなフィルタで即時割り込みするパケットを指定
• 5-tuple(protocol, IP address, port)
• TCP flags
• frame size
• Ethertype
• VLAN priority
• FCoE packet
• 但しFreeBSDのixgbeドライバでは非サポート
13年4月23日火曜日
- 24. TOE
(TCP Offload Engine)
• NIC上のTCP/IPスタックへプロトコル処理をフルオフロード
• デメリット
• セキュリティ:TOEにセキュリティホールが生じても、OS側から対処
が出来ない
• 複雑性:OSのネットワークスタックをTOEで置き換えるにはかなり広
範囲の変更が必要
メーカによってTOEの実装が異なり、TOE用の共通APIを作るのが困難
OSのプロトコル処理をバイパスするのでパケットフィルタと相性が悪
い
• 対応NICは少ない
13年4月23日火曜日
- 28. FreeBSDでの
Checksum Offloading
• ifconfig -m ix0|grep capabilities
どんな種類のchecksum offloadingをサポ
ートしているか確認
• ifconfig ix0 rxcsum txcsum rxcsum6
txcsum6
checksum offloadingの有効化
• TOEと異なり多くのNICが対応している
13年4月23日火曜日
- 31. FreeBSDでの
Large Segment Offload
• ifconfig -m ix0|grep capabilities
TSO4が表示されていればTCPv4
TSO6が表示されていればTCPv6のLSOに対応
• ifconfig ix0 tso4 tso6
Large Segment Offloadの有効化
• カーネルからはMTUサイズがとても大きな
NICへパケットを送信しているように見える
13年4月23日火曜日
- 34. FreeBSDでの
Large Receive Offload
• ifconfig -m ix0|grep capabilities
LROが表示されていれば対応
• ifconfig ix0 lro
Large Receive Offloadの有効化
• カーネルからはMTUサイズがとても大き
なNICからパケットが送られてきているよ
うに見える
13年4月23日火曜日
- 43. Intel Data Direct I/O
Technology
• 従来、NICはメモリにパケットを書き込み、CPUはメ
モリからキャッシュにパケットを読み込んでからアク
セスしていた
• DDIOではNICがCPUのキャッシュへDMAを行えるよ
うにする
→メモリアクセス分のレイテンシを削減
• 新しいXeonと10GbEでサポート
• OS側での対応は不要な模様
13年4月23日火曜日
- 55. Receive Side Scaling
• (Multi Queue NICとも呼ばれる)
• パケットヘッダのハッシュ値を元にパケットを複数
の受信キューへ振り分け
→同一フローは同じキューへ
• 振り分け先キューはハッシュテーブルの値に基づく
• 受信キューはそれぞれIRQを持ち、別々のCPUへ割
り込む(キュー数がコア数より少ない事もある)
13年4月23日火曜日
- 57. MultiQueue NIC on
FreeBSD (dmesg)
igb5: <Intel(R) PRO/1000 Network Connection version - 2.0.7> port
0x1000-0x101f mem 0xb2400000-0xb241ffff,0xb1c00000-0xb1ffffff,0xb2440000-
igb5: Using MSIX interrupts with 9 vectors
igb5: [ITHREAD]
igb5: [ITHREAD]
igb5: [ITHREAD]
igb5: [ITHREAD]
igb5: [ITHREAD]
igb5: [ITHREAD]
igb5: [ITHREAD]
igb5: [ITHREAD]
igb5: [ITHREAD]
igb5: Ethernet address: 00:1b:21:81:e9:57
MSI-Xによって複数の割り込みベクタが確保されて
いる
13年4月23日火曜日
- 58. MultiQueue NIC on
FreeBSD (vmstat -i)
# vmstat -i | grep ix0
irq256: ix0:que 0 3555342 10305
irq257: ix0:que 1 3120223 9044
irq258: ix0:que 2 3408333 9879
irq259: ix0:que 3 3279717 9506
irq260: ix0:link 4 0
キュー毎にIRQが割り当てられている
13年4月23日火曜日
- 61. Receive Side Scalingの制限
• 例えばIntel 82599 10GbE Controllerだと:
• Redirection Tableは128エントリ
• ハッシュ値は下位4bitのみ使用
• フローが多いとハッシュ衝突する為、特
定フローを特定CPUへキューするのには
あまり向いていない
13年4月23日火曜日
- 62. Intel Ethernet Flow
Director(ixgbe)
• フローとキューの対応情報を完全に記録
• 32kのハッシュテーブルの先にリンクドリスト
• 2つのFilter mode
• Signature Mode:ハッシュ値→最大32k個
• Perfect Match Mode:ヘッダの完全マッチ(dst-
ip, dst-port, src-ip, src-port, protocol)→最大8k個
13年4月23日火曜日
- 63. Intel Ethernet Flow Director
のフィルタ更新方法
proce
ss
送信処理
システムコール
ソケット
プロトコル
スタック
ドライバ
Txq
NIC
フィルタ
更新
Flow
Director
Filters
プロセスコンテキストからのパケット送出時に送信
元CPUとパケットヘッダを用いてフィルタを更新
13年4月23日火曜日