Seastar
- OS開発 カーネル開発
- LinuxとかでC言語やってるけどC++やらされることになった。
- 半数の開発者はリモート開発で参加
IaaS環境に特化したOS OSvを開発
カーネルなのにboostが使える
KVM開発者とか有名ドコロが多い
SeaStarとは
- 高スループットなサーバアプリケーションの為の新しいフレームワーク
- 非同期
- Apacheライセンス
- DB 分散ファイルシステムなどに使える
問題点
- CPUのクロック数があまり向上しない
- コア数は増えるけどソフトウェアが性能を出し切るのは難しい
- ロックの仕様はたとえ競合がなくてもコストが大きい
あるコアでアロケートされたデータは別のコアで使用されたりコピーされたりする
ので、ソフトウェアの性能を出し切れていない
シェアードナッシングにしよう
- リニアにスケールするSeaStarフレームワーク
- SeaStarのエンジンを各コアで実行
- データやステートはコア間で共有されず別々に動作
- 分散ファイルシステムとかをイメージ
- カーネルをバイパスして自前のネットワークスタックを使用
- ゼロコピー対応
- ファイル/ブロックIOはカーネルを使用
- スレッドなし、コンテキストスイッチなし、ロックもない
- 非同期!
SeaStarの性能
リニアにスケール
性能結果
- 20コア超までリニアにスケール
- 250,000 トランザクションコア(memcached)
SeaStarのプログラミングモデル
- C++14を使う
- Future/Promise/Contiuationを使う
Promise自体は他の言語とあまり変わらない(JSにもあるし)が、SeaStarの実装に特化された独自実装を用いている。
- ロックしない
- メモリアロケーションしない
など。
簡単なfuture/promiseの例
Chaining
SeaStaのrスケジューリング機構
- ラムダ式は実行される条件とペアにされてスケジューラのランキューに登録
- 実行可能になったものから実行されている
- ランキューもシェアードナッシング
ルール
- 非同期なのでブロックしてはいけない(ブロックが終わるまで何も実行できないから)
- future/promiseを使おう
- ファイルIOなどにもラッパーAPIが提供されている
- ポインタはスマートポインタも使わない
- コピーがふさわしくないときはstd:move()
- CPU間での共有データ ロックは使わず、CPU間で非同期通信を行う
- スケジューリング機構を使ってラムダ式とパラメータを渡す
提供されるAPI
- future/promise/continuation
- ネットワークIO
- ファイルIO
- タイマー
- HTTP
- JSON
- RPC
- Posix APIラッパー
- collectdクライアント
サンプルアプリ
- httpd
- memcached
- HTTP benchmark tool
- 各APIのテストコード
ネットワークスタック
- カーネルバイパスの必要性
- 従来のネットワークスタックだと…
- ソケットAPIとかだとゼロコピー出来ない
- パケットごとにコピーが発生して大きなオーバーヘッドに
- ソケット&プロセス側と、プロトコル側のコンテキストが別
- CPUが別のことも多い
- キャッシュ競合
- レイテンシが増大
- プロトコル・スタック内のロック競合
- システムコール、コンテキストスイッチのオーバーヘッド
DPDK
- カーネルをバイパスして高速に通信を行うフレームワーク
- ユーザランドドライバから直接ハードウェアアクセス
- ドライバでのパケット通信からアプリケーション処理まで同一プロセスの同一コンテキストで実行
- ゼロコピー
- ネットワークスタックは持たない
- これでアプリを書くのはつらい
SeaStarネットワークスタック
- ネットワークスタックを提供
- SeaStarのシェアードナッシングモデルで記述されており高性能
- ソケットAPIと同等のレベルに抽象化されたAPIを提供
- ゼロコピー可能なAPIを提供
余談
DPDKを有効化するとNICのドライバをアンロードされてネットワークが使えなくなる→NICが1つだとアクセスが一切できなくなるのでシリアルコンソールでごにょごにょするしかなくなるのでSSH接続すらできなくなる。
- IPはSeaStarと共有したい
- MACアドレスはSeaStarと共有したい