読者です 読者をやめる 読者になる 読者になる

by shigemk2

当面は技術的なことしか書かない

Seastar 高スループットなサーバアプリケーションの為の新しいフレームワーク #kbkz_tech

C++ 勉強会

Seastar

  • OS開発 カーネル開発
  • LinuxとかでC言語やってるけどC++やらされることになった。
  • 半数の開発者はリモート開発で参加
  • IaaS環境に特化したOS OSvを開発

  • カーネルなのにboostが使える

  • KVM開発者とか有名ドコロが多い

SeaStarとは

www.seastar-project.org

  • 高スループットなサーバアプリケーションの為の新しいフレームワーク
  • 非同期
  • Apacheライセンス
  • DB 分散ファイルシステムなどに使える

問題点

  • CPUのクロック数があまり向上しない
  • コア数は増えるけどソフトウェアが性能を出し切るのは難しい
  • ロックの仕様はたとえ競合がなくてもコストが大きい
  • あるコアでアロケートされたデータは別のコアで使用されたりコピーされたりする

  • ので、ソフトウェアの性能を出し切れていない

シェアードナッシングにしよう

  • リニアにスケールするSeaStarフレームワーク
  • SeaStarのエンジンを各コアで実行
  • データやステートはコア間で共有されず別々に動作
  • 分散ファイルシステムとかをイメージ
  • カーネルをバイパスして自前のネットワークスタックを使用
  • ゼロコピー対応
  • ファイル/ブロックIOはカーネルを使用
  • スレッドなし、コンテキストスイッチなし、ロックもない
  • 非同期!

SeaStarの性能

http://www.seastar-project.org/img/http-perf.png

リニアにスケール

性能結果

  • 20コア超までリニアにスケール
  • 250,000 トランザクションコア(memcached)

SeaStarのプログラミングモデル

  • C++14を使う
  • Future/Promise/Contiuationを使う

Promise自体は他の言語とあまり変わらない(JSにもあるし)が、SeaStarの実装に特化された独自実装を用いている。

  • ロックしない
  • メモリアロケーションしない

など。

簡単なfuture/promiseの例

Chaining

f:id:shigemk2:20150517140519p:plain

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と共有したい

OSvハンズオン計画してます。

connpass.com