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

Post on 26-Jul-2015

2.283 Views

Category:

Technology

8 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

ワーク@syuu1228

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

Our Team

SEASTARとは

SeaStarとは

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

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

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

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

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

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

• SSD, >10GbE Ether, NUMA, etc

Kernel

Application

TCP/IPScheduler

queuequeuequeuequeuequeuethreads

NICQueues

Kernel

Memory

リニアにスケールする 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

Before

After(※イメージです)

SEASTARの性能

パフォーマンス( httpd)

7M IOPS

パフォーマンス(memcached)

計測結果

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

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

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

• C++14

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

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

他の言語等で提供されている 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の本」より

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

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

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

});

});

}

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";

});

}

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

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

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

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

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

提供される API

• Future/Promise/Continuation

• ネットワーク IO

• ファイル IO

• タイマー• HTTP

• JSON(swagger)

• RPC

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

サンプルアプリ

• HTTPD(swagger対応 )

• memcached

• “seawreck” HTTP benchmark tool

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

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

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

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

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

• キャッシュ競合

• レイテンシが増大

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

DPDK

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

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

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

SeaStarネットワークスタック

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

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

余談: NAT adapter for SeaStar

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

要件

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

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

SeaStar Hands-on

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

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

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

@CloudiusSystems

top related