More Related Content Similar to Seastar in 歌舞伎座.tech#8「C++初心者会」 Similar to Seastar in 歌舞伎座.tech#8「C++初心者会」 (20) More from Takuya ASADA (20) Seastar in 歌舞伎座.tech#8「C++初心者会」2. Cloudius Systems
• イスラエルのスタートアップ企業
• Office: Herzliya, Israel
• Linux KVMを開発したQumranet(RedHatに買収)の元メンバーを中心とする
• CEO : Dor Laor, CTO : Avi Kivity
• 半数の開発者がイスラエル以外の国からリモート開発で参加
• 18名・9ヶ国(イスラエル在住は9名)
• IaaS環境に特化したOS「OSv」を開発
• 2015/02のLinux Foundation Collaboration Summitにて「SeaStar」を発表
7. リニアにスケールするSeaStarフレームワーク
• SeaStarのエンジンを各コアで実行
• データやステートはコア間で共有されず、別々に動作
• シェアードナッシング方式
• 既存の分散型サーバアプリのモデルに適合
• カーネルをバイパスして自前のネットワークスタックを使用
• ゼロコピーに対応
• ファイル/ブロックIOはカーネルを使用
• no thread, no context switch, no locks
• 代わりに非同期にラムダ式の実行を行う
Application
TCP/IP
Task Scheduler
queuequeuequeuequeuequeuesmp queue
NIC
Queue
DPDK
Kernel
(isn’t
involved)
Userspace
Application
TCP/IP
Task Scheduler
queuequeuequeuequeuequeuesmp queue
NIC
Queue
DPDK
Kernel
(isn’t
involved)
Userspace
Application
TCP/IP
Task Scheduler
queuequeuequeuequeuequeuesmp queue
NIC
Queue
DPDK
Kernel
(isn’t
involved)
Userspace
Application
TCP/IP
Task Scheduler
queuequeuequeuequeuequeuesmp queue
NIC
Queue
DPDK
Kernel
(isn’t
involved)
Userspace
18. 簡単なfuture/promiseの例
future<int> get(); // 最終的にintが生成される事をpromiseする
future<> put(int) // intを入力する事をpromiseする
void f() {
get().then([] (int value) { // get()が実行完了した後の処理
put(value + 1).then([] { // put(int)が完了した後の処理
std::cout << “value stored successfullyn”;
});
});
}
25. カーネルバイパスの必要性
• 従来のネットワークスタック(ソケットAPI、カーネルネットワーク
スタック)だと…
• Zerocopyできない・やりずらい
• パケットごとにコピーが発生→大きなオーバヘッドに
• ソケット&プロセス側とプロトコル処理側のコンテキストが別
• CPUが別の事も多い
• キャッシュ競合
• レイテンシが増大
• プロトコルスタック内のロック競合
• システムコール、コンテキストスイッチのオーバヘッド
Process(User)
Process(Kernel)
HW Intr Handler
SW Intr Handler
割り 込みハンド ラ
プロト コ ル処理
ソ ケッ ト
受信処理
ユーザ
プログラム
user
b uffe
r
socket
queue
システムコ ール
プロセス起床
ハード ウェ ア割り 込み
ユーザ空間へコ ピー
パケッ トパケッ トパケッ ト
ソ フ ト ウェ ア割り 込みスケジュ ール
パケッ ト が無く なる
まで繰り 返し
パケッ ト 受信
28. 余談:NAT adapter for SeaStar
• DPDKを有効化するとNICのドライバがアンロードされてネットワークが使えなくなる
• NICが1つの環境だとすごく不便
• 性能が多少落ちても元通りにネットワークが使いたい、SSHとかしたい
• TAPデバイスを経由してLinuxカーネルのネットワークスタックとパケットを送受信しよう!
30. Process(User)
アプリ 固有処理
パケッ トパケッ トパケッ ト
パケッ ト 受信
処理するパケッ ト が無く なっ たら
ポーリ ング
パケッ ト が無く なる
まで繰り 返し
プロト コ ル処理
Process(User)
Process(Kernel)
HW Intr Handler
SW Intr Handler
割り 込みハンド ラ
プロト コ ル処理
ソ ケッ ト
受信処理
SSHDと かuser
b uffe
r
socket
queue
システムコ ール
プロセス起床
ハード ウェ ア割り 込み
ユーザ空間へコ ピー
パケッ トパケッ トパケッ ト
ソ フ ト ウェ ア割り 込みスケジュ ール
パケッ ト が無く なる
まで繰り 返し
パケッ ト 受信
割り 込みハンド ラ
TAP
SeaStarアプリ に関係ない
パケッ ト をTAPに転送