本文へ移動

これはセクションの複数ページ印刷用ビューです。 .

このページの通常のビューに戻る.

ベンチマーク

etcdの性能測定

ベンチマーク

etcdのベンチマークは定期的に公開され、以下の各リリースについて追跡されます。

メモリー使用量のベンチマーク

さまざまなシナリオで想定されるメモリー使用量を記録します。

1 - ストレージのメモリー使用量ベンチマーク

etcdストレージ(インメモリーインデックスとページキャッシュ)の性能測定

etcdのストレージでは、2つの構成要素が物理メモリーを消費します。etcdプロセスは、キーの検索を高速化するためにインメモリーインデックスを割り当てます。また、オペレーティングシステムが管理するプロセスのページキャッシュには、最近ディスクから読み込んだデータが保存され、すばやく再利用できます。

インメモリーインデックスは、ディスク上のデータ(値)へのポインターとともに、すべてのキーをB木 のデータ構造で保持します。B木の各キーには、値の異なるバージョンを指す複数のポインターが含まれる場合があります。そのため、インメモリーインデックスの理論上のメモリー消費量は、次の式で近似できます。

N * (c1 + avg_key_size) + N * (avg_versions_of_key) * (c2 + size_of_pointer)

ここで、c1はキーのメタデータのオーバーヘッド、c2はバージョンのメタデータのオーバーヘッドです。

次の図は、インメモリーインデックスのB木の詳細な構造を示します。



                                In mem index

                               +------------+
                               | key || ... |
  +--------------+             |     ||     |
  |              |             +------------+
  |              |             | v1  || ... |
  |   disk    <----------------|     ||     | Tree Node
  |              |             +------------+
  |              |             | v2  || ... |
  |           <----------------+     ||     |
  |              |             +------------+
  +--------------+       +-----+    |   |   |
                         |     |    |   |   |
                         |     +------------+
                         |
                         |
                         ^
                      ------+
                      | ... |
                      |     |
                      +-----+
                      | ... | Tree Node
                      |     |
                      +-----+
                      | ... |
                      |     |
                      ------+

ページキャッシュのメモリー はオペレーティングシステムが管理するため、このドキュメントでは詳しく扱いません。

テスト環境

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のウォッチャーの性能測定
注記

監視機能は活発に開発されているため、開発が進むにつれてメモリー使用量が変わる可能性があります。ただし、以下の数値を大幅に超えて増えることは想定していません。

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)未満に収まるはずです。

                                          +-------+
                                          | watch |
                              +---------> | foo   |
                              |           +-------+
                       +------+-----+
                       |   stream   |
      +--------------> |            |
      |                +------+-----+     +-------+
      |                       |           | watch |
      |                       +---------> | bar   |
+-----+------+                            +-------+
|            |         +------------+
|   conn     +-------> |   stream   |
|            |         |            |
+-----+------+         +------------+
      |
      |
      |
      |                +------------+
      +--------------> |   stream   |
                       |            |
                       +------------+

監視の理論上のメモリー消費量は、次の式で近似できます。 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のベンチマーク

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のベンチマーク

etcd v2.2.0-rc-memoryの性能測定

物理マシン

GCE n1-standard-2マシンタイプ

  • /var/lib/etcdにマウントした専用ローカルSSD × 1
  • OS用の専用低速ディスク × 1
  • メモリー7.5 GB
  • CPU × 2

etcd

etcd Version: 2.2.0-rc.0+git
Git SHA: 103cb5c
Go Version: go1.5
Go OS/Arch: linux/amd64

テスト

各メンバーが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のベンチマーク

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つを、それぞれ別のマシンで実行します。

バージョンの詳細:

etcd Version: 2.2.0-alpha.1+git
Git SHA: 59a5a7e
Go Version: go1.4.2
Go OS/Arch: linux/amd64

比較の基準となる性能を測るため、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のベンチマーク

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 Version: 2.2.0
Git SHA: e4561dd
Go Version: go1.5
Go OS/Arch: linux/amd64

テスト

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のベンチマーク

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