32
SeaStar 高高高高高高高高高高高高高高高高高高高高高高高高高高高高高高高高 @syuu1228

Seastar in 歌舞伎座.tech#8「C++初心者会」

Embed Size (px)

Citation preview

Page 1: Seastar in 歌舞伎座.tech#8「C++初心者会」

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

ワーク@syuu1228

Page 2: Seastar in 歌舞伎座.tech#8「C++初心者会」

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」を発表

Page 3: Seastar in 歌舞伎座.tech#8「C++初心者会」

Our Team

Page 4: Seastar in 歌舞伎座.tech#8「C++初心者会」

SEASTARとは

Page 5: Seastar in 歌舞伎座.tech#8「C++初心者会」

SeaStarとは

• http://www.seastar-project.org/

• 高スループットなサーバアプリケーションを記述するための新しいフレームワーク• 物理マシン/ VM上で動作、 Linux/ OSvに対応• シェアードナッシング、完全非同期モデル• オープンソース( Apache License)• 適用範囲の例:データベース、分散ファイルシステム、キャッシュ、プロクシなど

Page 6: Seastar in 歌舞伎座.tech#8「C++初心者会」

今日のプログラミングモデルの問題点

• CPUのクロック数はあまり向上しない• コア数は増えていくがソフトウェアで性能を出し切る事は難しい

• アプリがスケールしない

• ロックの使用は例え競合がなくてもコストが大きい• あるコアでアロケートされたデータは別のコアで使用されたりコピーされたりする• ソフトウェアが最近のハードウェアに最適化しきれていない

• SSD, >10GbE Ether, NUMA, etc

Kernel

Application

TCP/IPScheduler

queuequeuequeuequeuequeuethreads

NICQueues

Kernel

Memory

Page 7: Seastar in 歌舞伎座.tech#8「C++初心者会」

リニアにスケールする SeaStarフレームワーク

• SeaStarのエンジンを各コアで実行• データやステートはコア間で共有されず、別々に動作

• シェアードナッシング方式• 既存の分散型サーバアプリのモデルに適合

• カーネルをバイパスして自前のネットワークスタックを使用• ゼロコピーに対応• ファイル/ブロック IOはカーネルを使用

• no thread, no context switch, no locks

• 代わりに非同期にラムダ式の実行を行う

Application

TCP/IP

Task Schedulerqueuequeuequeuequeuequeuesmp queue

NICQueue

DPDK

Kernel (isn’t involved)

Userspace

Application

TCP/IP

Task Schedulerqueuequeuequeuequeuequeuesmp queue

NICQueue

DPDK

Kernel (isn’t involved)

Userspace

Application

TCP/IP

Task Schedulerqueuequeuequeuequeuequeuesmp queue

NICQueue

DPDK

Kernel (isn’t involved)

Userspace

Application

TCP/IP

Task Schedulerqueuequeuequeuequeuequeuesmp queue

NICQueue

DPDK

Kernel (isn’t involved)

Userspace

Page 8: Seastar in 歌舞伎座.tech#8「C++初心者会」

Before

Page 9: Seastar in 歌舞伎座.tech#8「C++初心者会」

After(※イメージです)

Page 10: Seastar in 歌舞伎座.tech#8「C++初心者会」

SEASTARの性能

Page 11: Seastar in 歌舞伎座.tech#8「C++初心者会」

パフォーマンス( httpd)

7M IOPS

Page 12: Seastar in 歌舞伎座.tech#8「C++初心者会」

パフォーマンス(memcached)

Page 13: Seastar in 歌舞伎座.tech#8「C++初心者会」

計測結果

• 20コア超までリニアにスケール• 250,000トランザクション /コア(memcached)• 計測値がクライアントによって律速されており、計測方法の改善を行っている• より細かいベンチマークやベンチマーク結果に基づくチューニングは後日実施予定

Page 14: Seastar in 歌舞伎座.tech#8「C++初心者会」

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

Page 15: Seastar in 歌舞伎座.tech#8「C++初心者会」

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

• C++14

• Future/Promise/Continuationモデルに基づく非同期 API

• リアクティブプログラミングモデルのサブセット

Page 16: Seastar in 歌舞伎座.tech#8「C++初心者会」

他の言語等で提供されている Promisesと大体同じJavaScriptの Promisesとか

function asyncFunction() { return new Promise(function (resolve, reject) { setTimeout(function () { resolve(‘Async Hello world’); }, 16); });}

asyncFunction().then(function (value) { console.log(value); // => ‘Async Hello world’}).catch(function (error) { console.log(error);});

「 JavaScript Promiseの本」より

Page 17: Seastar in 歌舞伎座.tech#8「C++初心者会」

C++11/boostの futures/promisesとの違い

• SeaStarの実装に特化された独自実装• ロックしない• メモリアロケーションしない• continuationsをサポート

Page 18: Seastar in 歌舞伎座.tech#8「C++初心者会」

簡単な 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 successfully\n”;

});

});

}

Page 19: Seastar in 歌舞伎座.tech#8「C++初心者会」

Chaining

future<int> get();

future<> put(int);

void f() {

get().then([] (int value) {

return put(value + 1);

}).then([] { // get().then() が終了した後の処理std::cout << "value stored successfully\n";

});

}

Page 20: Seastar in 歌舞伎座.tech#8「C++初心者会」

Seastarのスケジューリング機構(タスクの実行)

• future/promiseで書かれたラムダ式は、実行される条件とペアにされてスケジューラのランキューに登録される

• 非同期処理エンジンは条件が実行可能になったものから順に実行していく(条件以外の実行順序は保証されていない)

• ランキューもシェアードナッシングなので CPU間でジョブはマイグレーションされない

Promise

Task

Promise

Task

Promise

Task

Promise

Task

CPU

Promise

Task

Promise

Task

Promise

Task

Promise

Task

CPU

Promise

Task

Promise

Task

Promise

Task

Promise

Task

CPU

Promise

Task

Promise

Task

Promise

Task

Promise

Task

CPU

Promise

Task

Promise

Task

Promise

Task

Promise

Task

CPU

Promise is a pointer to eventually computed value

Task is a pointer to a lambda function

Page 21: Seastar in 歌舞伎座.tech#8「C++初心者会」

Future/Promise以外の SeaStarプログラミングルール

• アプリケーションはブロックしないように書かなければならない• 非同期 IOの完了待ちには Future/Promiseが使える• ファイル IOなどにもラッパー APIが提供されている

• ポインタはスマートポインタを含めてなるべく使わない• コピーがふさわしくない時は std::move()

• CPU間での共有データ・ロックは使わない、代わりに CPU間で非同期通信を行う

Page 22: Seastar in 歌舞伎座.tech#8「C++初心者会」

提供される API

• Future/Promise/Continuation

• ネットワーク IO

• ファイル IO

• タイマー• HTTP

• JSON(swagger)

• RPC

• POSIX APIラッパー• collectdクライアント

Page 23: Seastar in 歌舞伎座.tech#8「C++初心者会」

サンプルアプリ

• HTTPD(swagger対応 )

• memcached

• “seawreck” HTTP benchmark tool

Page 24: Seastar in 歌舞伎座.tech#8「C++初心者会」

SEASTARとユーザランドネットワークスタック

Page 25: Seastar in 歌舞伎座.tech#8「C++初心者会」

カーネルバイパスの必要性

• 従来のネットワークスタック(ソケット API、カーネルネットワークスタック)だと…

• Zerocopyできない・やりずらい• パケットごとにコピーが発生→大きなオーバヘッドに

• ソケット&プロセス側とプロトコル処理側のコンテキストが別• CPUが別の事も多い

• キャッシュ競合

• レイテンシが増大

• プロトコルスタック内のロック競合• システムコール、コンテキストスイッチのオーバヘッド

Page 26: Seastar in 歌舞伎座.tech#8「C++初心者会」

DPDK

• カーネルをバイパスして高速に通信を行うためのフレームワーク

• ユーザランドドライバから直接ハードウェアアクセス• ドライバでのパケット受信からアプリケーション処理まで同一プロセスの同一コンテキストで実行

• ゼロコピー• 但し、ネットワークスタックは持たない

Page 27: Seastar in 歌舞伎座.tech#8「C++初心者会」

SeaStarネットワークスタック

• ネットワークスタックを提供• SeaStarのシェアードナッシングモデルで記述されており高性能

• ソケット APIと同等のレベルに抽象化された APIを提供• ゼロコピー可能な APIを提供• ソケット API非互換、独自 API

Page 28: Seastar in 歌舞伎座.tech#8「C++初心者会」

余談: NAT adapter for SeaStar

• DPDKを有効化すると NICのドライバがアンロードされてネットワークが使えなくなる• NICが1つの環境だとすごく不便• 性能が多少落ちても元通りにネットワークが使いたい、 SSHとかしたい• TAPデバイスを経由して Linuxカーネルのネットワークスタックとパケットを送受信しよう!

Page 29: Seastar in 歌舞伎座.tech#8「C++初心者会」

要件

• IPは SeaStarと共有したい• MACアドレスは SeaStarと共有したい• Linuxネットワークスタックで使用する TCP/ UDPポート番号が SeaStarアプリと競合したら

NATテーブルで書き換えて対応したい

Page 30: Seastar in 歌舞伎座.tech#8「C++初心者会」
Page 31: Seastar in 歌舞伎座.tech#8「C++初心者会」

SeaStar Hands-on

• 2015/05/24(日) Seastar ・ OSv Hands-on #1

• http://connpass.com/event/15004/

Page 32: Seastar in 歌舞伎座.tech#8「C++初心者会」

Thank youhttp://www.seastar-project.org/

@CloudiusSystems