これはセクションの複数ページ印刷用ビューです。 .
ベンチマーク
- 1: ストレージのメモリー使用量ベンチマーク
- 2: 監視のメモリー使用量ベンチマーク
- 3: etcd v3のベンチマーク
- 4: etcd v2.2.0-rc-memoryのベンチマーク
- 5: etcd v2.2.0-rcのベンチマーク
- 6: etcd v2.2.0のベンチマーク
- 7: etcd v2.1.0のベンチマーク
ベンチマーク
etcdのベンチマークは定期的に公開され、以下の各リリースについて追跡されます。
メモリー使用量のベンチマーク
さまざまなシナリオで想定されるメモリー使用量を記録します。
1 - ストレージのメモリー使用量ベンチマーク
etcdのストレージでは、2つの構成要素が物理メモリーを消費します。etcdプロセスは、キーの検索を高速化するためにインメモリーインデックスを割り当てます。また、オペレーティングシステムが管理するプロセスのページキャッシュには、最近ディスクから読み込んだデータが保存され、すばやく再利用できます。
インメモリーインデックスは、ディスク上のデータ(値)へのポインターとともに、すべてのキーをB木 のデータ構造で保持します。B木の各キーには、値の異なるバージョンを指す複数のポインターが含まれる場合があります。そのため、インメモリーインデックスの理論上のメモリー消費量は、次の式で近似できます。
N * (c1 + avg_key_size) + N * (avg_versions_of_key) * (c2 + size_of_pointer)
ここで、c1はキーのメタデータのオーバーヘッド、c2はバージョンのメタデータのオーバーヘッドです。
次の図は、インメモリーインデックスのB木の詳細な構造を示します。
ページキャッシュのメモリー はオペレーティングシステムが管理するため、このドキュメントでは詳しく扱いません。
テスト環境
etcdのバージョン
GCEのn1-standard-2マシンタイプ
- メモリー:7.5 GB
- CPU:2基
インメモリーインデックスのメモリー使用量
このテストでは、インメモリーインデックスのメモリー使用量のみを測定します。目的は、前述のc1とc2を求め、ストレージのメモリー消費量の厳密な限界を把握することです。
Goのruntime.ReadMemStatsを使い、インデックス作成前後の総割り当てバイト数の差から、メモリー消費量を算出します。インメモリーインデックス自体の使用量を完全に反映するわけではありませんが、おおよその消費傾向を把握できます。
| N | バージョン数 | キーサイズ | メモリー使用量 |
|---|---|---|---|
| 100K | 1 | 64bytes | 22MB |
| 100K | 5 | 64bytes | 39MB |
| 1M | 1 | 64bytes | 218MB |
| 1M | 5 | 64bytes | 432MB |
| 100K | 1 | 256bytes | 41MB |
| 100K | 5 | 256bytes | 65MB |
| 1M | 1 | 256bytes | 409MB |
| 1M | 5 | 256bytes | 506MB |
結果から、c1=120bytes、c2=30bytesと計算できます。式の未知数はこの2つだけなので、c1とc2の算出には2組のデータだけが必要です。c1=120bytesとc2=30bytesは、計算した4組のc1とc2の平均値です。小さなキー・バリューペアに対しては、キーのメタデータのオーバーヘッドは依然として無視できない大きさ(50%)です。しかし、少なくとも1000%のオーバーヘッドがあった旧ストアからは大幅に改善しています。
全体のメモリー使用量
全体のメモリー使用量は、ストレージを含めたetcdのRSS消費量を測定したものです。値はディスクに保存し、頻繁に使う値だけをOSのページキャッシュで管理するメモリーに保持するため、値のサイズがetcd全体のメモリー使用量に与える影響はごく小さいはずです。
| N | バージョン数 | キーサイズ | 値のサイズ | メモリー使用量 |
|---|---|---|---|---|
| 100K | 1 | 64bytes | 256bytes | 40MB |
| 100K | 5 | 64bytes | 256bytes | 89MB |
| 1M | 1 | 64bytes | 256bytes | 470MB |
| 1M | 5 | 64bytes | 256bytes | 880MB |
| 100K | 1 | 64bytes | 1KB | 102MB |
| 100K | 5 | 64bytes | 1KB | 164MB |
| 1M | 1 | 64bytes | 1KB | 587MB |
| 1M | 5 | 64bytes | 1KB | 836MB |
結果から、値のサイズはメモリー消費量に大きな影響を与えないことがわかります。OSのページキャッシュに保持されるデータが増えるため、わずかな増加は見られます。
2 - 監視のメモリー使用量ベンチマーク
監視機能は活発に開発されているため、開発が進むにつれてメモリー使用量が変わる可能性があります。ただし、以下の数値を大幅に超えて増えることは想定していません。
etcdの主な目標の1つは、非常に多くのウォッチャーが膨大な数の監視を行えるようにすることです。etcdは、O(10k)のクライアント、O(100K)の監視ストリーム(クライアントあたりO(10)ストリーム)、合計O(10M)の監視(ストリームあたりO(100)の監視)への対応を目指しています。個々の監視が消費するメモリーは、etcd全体の使用量の中で最も大きな割合を占めるため、現在および今後の最適化の重点となっています。
etcdの監視では、関連する3つの構成要素、すなわち各grpc.Conn、各監視ストリーム、各監視インスタンスが物理メモリーを消費します。grpc.Connは実際のTCP接続とその他のgRPC接続状態を保持します。各grpc.ConnはO(10kb)のメモリーを消費し、複数の監視ストリームが接続されることがあります。
各監視ストリームは独立したHTTP2接続で、さらにO(10kb)のメモリーを消費します。 複数の監視で1つの監視ストリームを共有できます。
監視インスタンスは、キー・バリューストアの変更を追跡する実際の構造体です。各監視のメモリー消費量はO(1kb)未満に収まるはずです。
監視の理論上のメモリー消費量は、次の式で近似できます。
memory = c1 * number_of_conn + c2 * avg_number_of_stream_per_conn + c3 * avg_number_of_watch_stream
テスト環境
etcdのバージョン
GCEのn1-standard-2マシンタイプ
- メモリー:7.5 GB
- CPU:2基
全体のメモリー使用量
全体のメモリー使用量は、クライアントのウォッチャーを接続したetcdが消費するRSS を測定したものです。結果には最大10%程度のばらつきがありますが、おおよそのメモリー使用量と割り当ての傾向を把握するという目的には意味があります。
ベンチマーク結果から、おおよそc1 = 17kb、c2 = 18kb、c3 = 350bytesと計算できます。つまり、クライアント接続を1つ追加すると17kb、ストリームを1つ追加すると18kbのメモリーを消費しますが、監視を1つ追加したときの消費量はわずか350bytesです。通常、1台のetcdサーバーで、数GBのメモリーを使って数百万の監視を維持できます。
| クライアント数 | クライアントあたりのストリーム数 | ストリームあたりの監視数 | 監視の総数 | メモリー使用量 |
|---|---|---|---|---|
| 1k | 1 | 1 | 1k | 50MB |
| 2k | 1 | 1 | 2k | 90MB |
| 5k | 1 | 1 | 5k | 200MB |
| 1k | 10 | 1 | 10k | 217MB |
| 2k | 10 | 1 | 20k | 417MB |
| 5k | 10 | 1 | 50k | 980MB |
| 1k | 50 | 1 | 50k | 1001MB |
| 2k | 50 | 1 | 100k | 1960MB |
| 5k | 50 | 1 | 250k | 4700MB |
| 1k | 50 | 10 | 500k | 1171MB |
| 2k | 50 | 10 | 1M | 2371MB |
| 5k | 50 | 10 | 2.5M | 5710MB |
| 1k | 50 | 100 | 5M | 2380MB |
| 2k | 50 | 100 | 10M | 4672MB |
| 5k | 50 | 100 | 25M | OOM |
3 - etcd v3のベンチマーク
物理マシン
GCE n1-highcpu-2マシンタイプ
- /var/lib/etcdにマウントした専用ローカルSSD × 1
- OS用の専用低速ディスク × 1
- メモリー1.8 GB
- CPU × 2
- etcdバージョン2.2.0
etcdクラスター
v3デモモードで稼働するetcdメンバー1つ
テスト
etcd v3ベンチマークツール を使用します。
性能
単一キーの読み取り
| キーサイズ(バイト) | クライアント数 | 読み取りQPS | 90パーセンタイルのレイテンシー(ms) |
|---|---|---|---|
| 256 | 1 | 2716 | 0.4 |
| 256 | 64 | 16623 | 6.1 |
| 256 | 256 | 16622 | 21.7 |
空のサーバーハンドラーを使用した場合と、ほぼ同じ性能です。
書き込み後の単一キーの読み取り
| キーサイズ(バイト) | クライアント数 | 読み取りQPS | 90パーセンタイルのレイテンシー(ms) |
|---|---|---|---|
| 256 | 1 | 2269 | 0.5 |
| 256 | 64 | 13582 | 8.6 |
| 256 | 256 | 13262 | 47.5 |
空のサーバーハンドラーを使用した場合、1回のputによって性能は変わりません。したがって、性能低下の原因はストレージパッケージにあると考えられます。
4 - etcd v2.2.0-rc-memoryのベンチマーク
物理マシン
GCE n1-standard-2マシンタイプ
- /var/lib/etcdにマウントした専用ローカルSSD × 1
- OS用の専用低速ディスク × 1
- メモリー7.5 GB
- CPU × 2
etcd
テスト
各メンバーが2コアを使用する3メンバーのetcdクラスターを起動します。
キー名の長さは常に64バイトとします。これは、キーの平均的なバイト長として妥当な長さです。
最大メモリー使用量
- フォロワーの1つが停止し、リーダーがスナップショットを送信し続けると、etcdのメモリー使用量が最大になる場合があります。
max RSSは、3回の実行で記録された最大メモリー使用量です。
| 値のバイト数 | キー数 | データサイズ(MB) | 最大RSS(MB) | リーダーの最大RSSとデータサイズの比率 |
|---|---|---|---|---|
| 128 | 50000 | 6 | 433 | 72x |
| 128 | 100000 | 12 | 659 | 54x |
| 128 | 200000 | 24 | 1466 | 61x |
| 1024 | 50000 | 48 | 1253 | 26x |
| 1024 | 100000 | 96 | 2344 | 24x |
| 1024 | 200000 | 192 | 4361 | 22x |
データサイズのしきい値
- etcdのデータサイズがしきい値に達すると、リーダー選出が起こりやすくなり、提案の一部が破棄される場合があります。
- ほとんどの場合、しきい値に達していなければetcdクラスターは問題なく動作するはずです。リソース不足によって正常に動作しない場合は、データサイズを減らしてください。
| 値のバイト数 | キー数の上限 | 推奨データサイズしきい値(MB) | 使用RSS(MB) |
|---|---|---|---|
| 128 | 400K | 48 | 2400 |
| 1024 | 300K | 292 | 6500 |
5 - etcd v2.2.0-rcのベンチマーク
物理マシン
GCEのn1-highcpu-2マシンタイプ
- /var/lib/etcdにマウントした専用ローカルSSD:1台
- OS用の専用低速ディスク:1台
- メモリー:1.8 GB
- CPU:2基
etcdクラスター
etcd 2.2.0-rcメンバー3つを、それぞれ別のマシンで実行します。
バージョンの詳細:
比較の基準となる性能を測るため、alpha段階のetcd 2.1.0メンバー3つでもクラスターを構成します。etcdのコミットはc7146bd5 で、etcd 2.1のベンチマーク で使用したものと同じです。
テスト
別のマシンを起動し、hey HTTPベンチマークツール を使って各etcdメンバーにリクエストを送信します。詳しい手順はベンチマーク開発ガイド を参照してください。
性能
単一キーの読み取り
| キーサイズ(バイト) | クライアント数 | 対象のetcdサーバー | 読み取りQPS | 90パーセンタイルレイテンシー(ms) |
|---|---|---|---|---|
| 64 | 1 | リーダーのみ | 2804 (-5%) | 0.4 (+0%) |
| 64 | 64 | リーダーのみ | 17816 (+0%) | 5.7 (-6%) |
| 64 | 256 | リーダーのみ | 18667 (-6%) | 20.4 (+2%) |
| 256 | 1 | リーダーのみ | 2181 (-15%) | 0.5 (+25%) |
| 256 | 64 | リーダーのみ | 17435 (-7%) | 6.0 (+9%) |
| 256 | 256 | リーダーのみ | 18180 (-8%) | 21.3 (+3%) |
| 64 | 64 | 全サーバー | 46965 (-4%) | 2.1 (+0%) |
| 64 | 256 | 全サーバー | 55286 (-6%) | 7.4 (+6%) |
| 256 | 64 | 全サーバー | 46603 (-6%) | 2.1 (+5%) |
| 256 | 256 | 全サーバー | 55291 (-6%) | 7.3 (+4%) |
単一キーの書き込み
| キーサイズ(バイト) | クライアント数 | 対象のetcdサーバー | 書き込みQPS | 90パーセンタイルレイテンシー(ms) |
|---|---|---|---|---|
| 64 | 1 | リーダーのみ | 76 (+22%) | 19.4 (-15%) |
| 64 | 64 | リーダーのみ | 2461 (+45%) | 31.8 (-32%) |
| 64 | 256 | リーダーのみ | 4275 (+1%) | 69.6 (-10%) |
| 256 | 1 | リーダーのみ | 64 (+20%) | 16.7 (-30%) |
| 256 | 64 | リーダーのみ | 2385 (+30%) | 31.5 (-19%) |
| 256 | 256 | リーダーのみ | 4353 (-3%) | 74.0 (+9%) |
| 64 | 64 | 全サーバー | 2005 (+81%) | 49.8 (-55%) |
| 64 | 256 | 全サーバー | 4868 (+35%) | 81.5 (-40%) |
| 256 | 64 | 全サーバー | 1925 (+72%) | 47.7 (-59%) |
| 256 | 256 | 全サーバー | 4975 (+36%) | 70.3 (-36%) |
性能変化の説明
-
ほとんどのシナリオで、読み取りQPSが5~8%低下しています。これは、etcdがストア操作ごとにストアのメトリクスを記録するためです。メトリクスは監視やデバッグに重要なため、この低下は許容できると考えています。
-
リーダーに対する書き込みQPSが20~30%増加しています。raftのメインループとエントリー適用ループを分離し、互いの処理をブロックしないようにしたためです。
-
全サーバーに対する書き込みQPSが30~80%増加しています。フォロワーが最新のコミットインデックスをより早く受信し、提案をより速くコミットできるようになったためです。
6 - etcd v2.2.0のベンチマーク
物理マシン
GCEのn1-highcpu-2マシンタイプ
- etcdのデータディレクトリとしてマウントした専用ローカルSSD:1台
- OS用の専用低速ディスク:1台
- メモリー:1.8 GB
- CPU:2基
etcdクラスター
etcd 2.2.0メンバー3つを、それぞれ別のマシンで実行します。
バージョンの詳細:
テスト
etcdクラスターの外部に別のマシンを起動し、接続再利用のパッチを適用したhey HTTPベンチマークツール
を実行して、各etcdクラスターメンバーにリクエストを送信します。パッチと測定手順の再現方法は、ベンチマークの手順
を参照してください。
性能は100回のベンチマーク結果から算出します。
性能
単一キーの読み取り性能
| キーサイズ(バイト) | クライアント数 | 対象のetcdサーバー | 平均読み取りQPS | 読み取りQPSの標準偏差 | 90パーセンタイルレイテンシーの平均(ms) | レイテンシーの標準偏差 |
|---|---|---|---|---|---|---|
| 64 | 1 | リーダーのみ | 2303 | 200 | 0.49 | 0.06 |
| 64 | 64 | リーダーのみ | 15048 | 685 | 7.60 | 0.46 |
| 64 | 256 | リーダーのみ | 14508 | 434 | 29.76 | 1.05 |
| 256 | 1 | リーダーのみ | 2162 | 214 | 0.52 | 0.06 |
| 256 | 64 | リーダーのみ | 14789 | 792 | 7.69 | 0.48 |
| 256 | 256 | リーダーのみ | 14424 | 512 | 29.92 | 1.42 |
| 64 | 64 | 全サーバー | 45752 | 2048 | 2.47 | 0.14 |
| 64 | 256 | 全サーバー | 46592 | 1273 | 10.14 | 0.59 |
| 256 | 64 | 全サーバー | 45332 | 1847 | 2.48 | 0.12 |
| 256 | 256 | 全サーバー | 46485 | 1340 | 10.18 | 0.74 |
単一キーの書き込み性能
| キーサイズ(バイト) | クライアント数 | 対象のetcdサーバー | 平均書き込みQPS | 書き込みQPSの標準偏差 | 90パーセンタイルレイテンシーの平均(ms) | レイテンシーの標準偏差 |
|---|---|---|---|---|---|---|
| 64 | 1 | リーダーのみ | 55 | 4 | 24.51 | 13.26 |
| 64 | 64 | リーダーのみ | 2139 | 125 | 35.23 | 3.40 |
| 64 | 256 | リーダーのみ | 4581 | 581 | 70.53 | 10.22 |
| 256 | 1 | リーダーのみ | 56 | 4 | 22.37 | 4.33 |
| 256 | 64 | リーダーのみ | 2052 | 151 | 36.83 | 4.20 |
| 256 | 256 | リーダーのみ | 4442 | 560 | 71.59 | 10.03 |
| 64 | 64 | 全サーバー | 1625 | 85 | 58.51 | 5.14 |
| 64 | 256 | 全サーバー | 4461 | 298 | 89.47 | 36.48 |
| 256 | 64 | 全サーバー | 1599 | 94 | 60.11 | 6.43 |
| 256 | 256 | 全サーバー | 4315 | 193 | 88.98 | 7.01 |
性能の変化
-
etcdがAPI呼び出しごとにメトリクスを記録するようになったため、ほとんどのシナリオで読み取りQPSがわずかに低下しているようです。得られる監視・デバッグ情報の広がりを考慮し、この小さな性能への影響は妥当なものと判断しました。
-
クラスターのリーダーに対する書き込みQPSは、わずかに増加しているようです。これは、etcdのraft処理でメインループとエントリー適用ループを分離し、両者の間で発生していたいくつかのブロックを解消したためです。
-
全メンバーに対する書き込みQPSは、大幅に増加しているようです。フォロワーが最新のコミットインデックスをより早く受信し、提案をより速くコミットできるようになったためです。
7 - etcd v2.1.0のベンチマーク
物理マシン
GCEのn1-highcpu-2マシンタイプ
- /var/lib/etcdにマウントした専用ローカルSSD:1台
- OS用の専用低速ディスク:1台
- メモリー:1.8 GB
- CPU:2基
- etcdバージョン:2.1.0 alpha
etcdクラスター
etcdメンバー3つを、それぞれ別のマシンで実行します。
テスト
別のマシンを起動し、hey HTTPベンチマークツール を使って各etcdメンバーにリクエストを送信します。詳しい手順はベンチマーク開発ガイド を参照してください。
性能
単一キーの読み取り
| キーサイズ(バイト) | クライアント数 | 対象のetcdサーバー | 読み取りQPS | 90パーセンタイルレイテンシー(ms) |
|---|---|---|---|---|
| 64 | 1 | リーダーのみ | 1534 | 0.7 |
| 64 | 64 | リーダーのみ | 10125 | 9.1 |
| 64 | 256 | リーダーのみ | 13892 | 27.1 |
| 256 | 1 | リーダーのみ | 1530 | 0.8 |
| 256 | 64 | リーダーのみ | 10106 | 10.1 |
| 256 | 256 | リーダーのみ | 14667 | 27.0 |
| 64 | 64 | 全サーバー | 24200 | 3.9 |
| 64 | 256 | 全サーバー | 33300 | 11.8 |
| 256 | 64 | 全サーバー | 24800 | 3.9 |
| 256 | 256 | 全サーバー | 33000 | 11.5 |
単一キーの書き込み
| キーサイズ(バイト) | クライアント数 | 対象のetcdサーバー | 書き込みQPS | 90パーセンタイルレイテンシー(ms) |
|---|---|---|---|---|
| 64 | 1 | リーダーのみ | 60 | 21.4 |
| 64 | 64 | リーダーのみ | 1742 | 46.8 |
| 64 | 256 | リーダーのみ | 3982 | 90.5 |
| 256 | 1 | リーダーのみ | 58 | 20.3 |
| 256 | 64 | リーダーのみ | 1770 | 47.8 |
| 256 | 256 | リーダーのみ | 4157 | 105.3 |
| 64 | 64 | 全サーバー | 1028 | 123.4 |
| 64 | 256 | 全サーバー | 3260 | 123.8 |
| 256 | 64 | 全サーバー | 1033 | 121.5 |
| 256 | 256 | 全サーバー | 3061 | 119.3 |