14
WHAT IS GOOGLE SUMMER OF CODE? @SYUU1228

Multiqueue BPF support and other BPF feature

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Multiqueue BPF support and other BPF feature

WHAT IS GOOGLE SUMMER OF CODE?@SYUU1228

Page 2: Multiqueue BPF support and other BPF feature

GOOGLE SUMMER OF CODE とは“Google Summer of Code は、いくつかのオープンソース / フリーソフトウェアの開発プロジェクトに指導者 ( メンター ) になってもらい、学生のみなさんに実践的なプログラミングを経験してもらおうという企画です“ (Google 日本 blog より )

金が出る• 成果をあげたプロジェクトに $5000

(学生 $4500 、メンター組織 $500 )規模

• 学生: 1116 人• メンター組織: 175• $5000 x 1116 = $6138000

Page 3: Multiqueue BPF support and other BPF feature

JAPANESE STUDENTS IN GSOC2011

Multiqueue BPF support and other BPF features - Takuya ASADA

Program Execution Diagrams and Search Visualization - Yusuke Nakano

Implement faster OpenMP Task for libgomp - Sho Nakatani

Implement the RPS/RFS in FreeBSD - Kazuya GODA

Implement HFSPlus Journal on Linux – Naohiro Aota

Page 4: Multiqueue BPF support and other BPF feature

MULTIQUEUE BPF SUPPORT AND OTHER BPF FEATURES@SYUU1228

Page 5: Multiqueue BPF support and other BPF feature

WHAT IS BPF?

BPF とは?• BSD 系 OS 上で、生のパケットをアプリケーションに取り込

む為のインタフェース• 生のパケット?

→ NIC を出入りしている全てのパケットをヘッダ付きで見れる

• こんなアプリで使われてます• パケットキャプチャ: tcpdump, Wireshark• IDS: snort

• 通常 libpcap というライブラリを通して使う(アブストラクションレイヤ)

Page 6: Multiqueue BPF support and other BPF feature

MULTICORE SUPPORT ON NIC

従来の NIC

• NIC 1ポートに対し受信キュー/割り込みは一つだけ→割り込みを受け付けている CPU に負荷が集中The S100Kps problem (そふらぼ古橋くんが命名)

改善された NIC

• 複数の受信キュー/割り込みを持つ、各 CPU へ1:1に割り付け

• パケットヘッダからハッシュ値を計算、ルックアップテーブルを引いてキュー先を決定( Receive Side Scaling )→負荷をフロー毎に複数の CPU へ分散出来る

Page 7: Multiqueue BPF support and other BPF feature

RECEIVE SIDE SCALING

Page 8: Multiqueue BPF support and other BPF feature

SCALABLE NETWORK STACK

ネットワークスタックに求められる事• 複数の CPU で並行してネットワークスタックを稼働出来る• なるべくロックで処理をブロックしない• 同じフローのパケットは同じ CPU で処理する

Page 9: Multiqueue BPF support and other BPF feature

SCALABLE NETWORK STACK

Page 10: Multiqueue BPF support and other BPF feature

BPF DOESN’T SCALE

BPF がスケールしない• そもそもファイルディスクリプタを一つ開いて read() してい

るだけなので、アプリケーション側が通常1スレッドしかない

• 折角 RSS で複数の CPU へパケットを分散していても、そんな事は関係なしにパケットを集約して1つのバッファにまとめてしまう

• パケットを BPF へ渡す所で、粒度がネットワークインタフェース毎のロックをかけている→ RSS していると同時に1つの CPU しか入れない、残りは待たされる

Page 11: Multiqueue BPF support and other BPF feature

BPF DOESN’T SCALE

Page 12: Multiqueue BPF support and other BPF feature

MULTIQUEUE BPF

BPF の Multiqueue サポート• アプリケーション側でキュー数分のスレッドを立て、各ス

レッドはどのキューからパケットを受け取るか指定• BPF はアプリケーションへ各 NIC のキュー情報を提供• インターフェース毎ロックでブロックされないようにする

Page 13: Multiqueue BPF support and other BPF feature

MULTIQUEUE BPF

Page 14: Multiqueue BPF support and other BPF feature

TODO

BPF の Multiqueue サポート• ioctl でキュー割り当てを指定出来るようにする• 指定されたキューのパケットだけをアプリケーションへ流す• NIC からキュー情報を拾って BPF の ioctl から取り出せるよ

うにする• インターフェース毎ロックでブロックされないようにする• テスト用に仮想 Multiqueue インタフェースを実装( tap を改

造)