Dockerコンテナの実行時パフォーマンスコストはどれくらいですか?


512

Dockerコンテナーの実行時パフォーマンスコストを包括的に理解したいと思います。ネットワーキングへの言及が偶発的に〜100µs遅くなることがわかりました。

また、実行時コストが「無視できる」「ゼロに近い」との言及もありましたが、これらのコストがどの程度かをもっと正確に知りたいのです。理想的には、Dockerがパフォーマンスコストで抽象化しているものと、パフォーマンスコストなしで抽象化されているものを知りたいです。ネットワーク、CPU、メモリなど

さらに、抽象化コストがある場合、抽象化コストを回避する方法はありますか。たとえば、ディスクを直接マウントすることも、Dockerで仮想的にマウントすることもできます。



1
@GoloRodenその質問は似ていますが、まったく同じではありません。「ネットワーキングが追加のレイヤーを通過する」などの理由でレイテンシーコストを探していますが、その質問の受け入れられる答えは、コンテナー+アプリのコストを測定することに関するものです。
ルークホルステン、2014

1
はい、そうです。私は最終投票を取り消しました。
Golo Roden

8
投稿してもらえてよかったです。その質問は私の検索では思いつかなかった。Measurement / metricsの記事は非常に便利です:blog.docker.io/2013/10/gathering-lxc-docker-containers-metrics
Luke Hoersten '19

1
:ドッキングウィンドウを比較することにより、パフォーマンスメトリックを言って、KVM VMおよびベアメタル-これは、「クラウドのためのNextGenの仮想化のLinuxコンテナ」と題し良いセッションでyoutube.com/watch?v=a4oOAVhNLjU
shawmzhu

回答:


449

Felter et al。による2014年のIBMの優れた研究論文「仮想マシンとLinuxコンテナの更新されたパフォーマンス比較」。ベアメタル、KVM、およびDockerコンテナーの比較を提供します。一般的な結果は次のとおりです。Dockerはネイティブパフォーマンスとほぼ同じで、すべてのカテゴリでKVMより高速です。

これの例外は、DockerのNATです。ポートマッピング(例:)を使用する場合docker run -p 8080:8080、以下に示すように、レイテンシにわずかな影響が予想されます。ただし、docker run --net=hostDockerコンテナーの起動時にホストネットワークスタック(など)を使用できるようになりました。これは、Native列と同じように実行されます(Redisレイテンシの結果が下に示されているように)。

Docker NATオーバーヘッド

また、Redisなどのいくつかの特定のサービスでレイテンシテストを実行しました。20クライアントスレッドを超えると、レイテンシのオーバーヘッドが最も高くなるのはDocker NAT、次にKVM、次にDockerホスト/ネイティブ間の大まかな関係になります。

Docker Redisの待ち時間オーバーヘッド

それが本当に役に立つ論文であるという理由だけで、ここにいくつかの他の数字があります。フルアクセスするにはダウンロードしてください。

ディスクI / Oを見てみましょう。

Docker対KVM対ネイティブI / Oパフォーマンス

次に、CPUオーバーヘッドを確認します。

Docker CPUオーバーヘッド

次に、メモリの例をいくつか示します(詳細については紙を読んでください。メモリは非常に扱いにくい場合があります)。

Dockerメモリの比較


20
論文に記載されているlinpackの数値については...率直に言って、信じがたいことがわかります(linpackが出力したものであるとは思わないが、テストでは浮動小数点のパフォーマンスのみを正確に測定しているとは思わない)実行されます)。KVMの主なオーバーヘッドは、ユーザースペースのハードウェアエミュレーションコンポーネント(非CPUハードウェアにのみ適用される)にあります。メモリページングにはかなりのオーバーヘッドがありますが、生の浮動小数点ですか?実際にそこで何が起こっているのか、おそらく過度のコンテキスト切り替えを確認したいと思います。
Charles Duffy、2015年

2
現在のDocker CLI構文の修正:--net=host(2つのダッシュ)および-p 8080:8080(小文字の 'p')NAT。
bk0

6
引用されたIBMのペーパーは、ネットワークIOに焦点を合わせすぎているようです。コンテキストの切り替えには対処しません。LXCを調べたところ、非自発的なコンテキストスイッチが増加し、その結果、アプリケーション処理が低下したため、LXCをすぐに中止する必要がありました。
エリック

3
また、ファイルシステムの操作についても知りたいと思います。たとえば、ディレクトリルックアップは、オーバーヘッドが予想される場所です。ブロックレベルの読み取り、書き込み、およびシーク(特定のグラフではこれに重点を置いています)はできません
Charles Duffy

12
同じ色のチャートが大好きです。区別がとても簡単
Viktor

104

つまり、Dockerは仮想化ではなく、さまざまなプロセスの名前空間やデバイスの名前空間などに対するカーネルのサポートを抽象化したものです。ある名前空間は別の名前空間よりも本質的に高価または非効率的ではないため、実際にDockerがパフォーマンスに影響を与えるのは、これらの名前空間に実際にあるものの問題です。


コンテナーの名前空間を構成する方法に関するDockerの選択にはコストがかかりますが、それらのコストはすべて直接利益に関連付けられています。

  • 階層化されたファイルシステムは高価です-コストはそれぞれ(およびDockerは複数のバックエンドをサポートします)、および使用パターン(複数の大きなディレクトリのマージ、または非常に深いファイルシステムのセットのマージは特に高価になります)によって異なりますが、無料ではありません。一方、多くのDockerの機能-コピーオンライト方式で他のゲストからゲストを構築でき、ストレージの利点を暗黙のうちに得ることができます-このコストを支払うことに乗ります。
  • DNATは大規模に高価になりますが、ホストのホストとは独立してゲストのネットワークを構成でき、ホスト間で必要なポートのみを転送するための便利なインターフェイスを持つという利点があります。これを物理インターフェースへのブリッジに置き換えることができますが、やはり利点が失われます。
  • ホストのディストリビューション、libc、およびその他のライブラリバージョンに関係なく、依存関係を最も便利な方法でインストールして各ソフトウェアスタックを実行できることは大きなメリットですが、共有ライブラリを複数回ロードする必要があります(バージョンが異なる)あなたが期待するだろうコストを持っています。

などなど。これらのコストが実際に環境にどの程度影響するか(ネットワークアクセスパターンやメモリの制約など)は、一般的な答えを提供することが難しい項目です。


2
これは良い答えですが、より具体的な数値とベンチマークを探しています。私はcgroupsのコストに精通していますが、あなたが指摘したように、Dockerはそれ以上のものです。答えてくれてありがとう。
Luke Hoersten、2015

6
承知しました。私の指摘は、あなたが見つけた一般化されたベンチマークは特定のアプリケーションへの適用が非常に限られているということです-しかし、それらを提供しようとする人々に同意しないというわけではなく、単に塩の山盛りで取られるべきだということです。
Charles Duffy

1
このように、KVMは「仮想化ではなく、単にx86仮想テクノロジーの呼び出しを抽象化したもの」と言えます。
Vad

10
@Vad、数十年前(IBMの初期の非x86ハードウェア実装に!)に合意して、ハードウェアレイヤーに直接抽象化を提供することは明確な仮想化であるという合意があります。カーネルレベルのネームスペースに関する用語のコンセンサスはかなり断片化されています-個々のビューを支持するソースをそれぞれ指摘することができます-率直に言って、単一の用語に移動すると不明瞭になるという有用な技術的な違いがあります(セキュリティとパフォーマンスの両方の特性)。 、私は反対の業界コンセンサスに達するまで、そしてそうでない限り、私の立場を保持しています。
Charles Duffy

@LukeHoersten、そうですね、コストが大きいのはcgroupではなく、ネットワークとファイルシステムの名前空間の内容です。しかし、これらのコストがどのくらいかは、Dockerがどのように構成されているか、つまり使用している特定のバックエンドにほぼ完全に依存します。たとえば、ブリッジはDockerのデフォルトのNATよりもはるかに安価です。また、さまざまなファイルシステムバックエンドのパフォーマンスオーバーヘッドも大幅に変動します(場合によっては、オーバーヘッドの量は使用パターンに依存します。overlayfsバリアントは、大きなディレクトリを複数のレイヤーf / eで変更すると、はるかに高価になる場合があります)。
チャールズダフィー、

20

ここではいくつかのより多くのだベンチマークのためのDocker based memcached serverhost native memcached serverTwemperfベンチマークツール使用してhttps://github.com/twitter/twemperfを 5000の接続および20K接続率とは

Dockerベースのmemcachedの接続時間オーバーヘッドは、上記のホワイトペーパーとネイティブ速度の約2倍で一致するようです。

Twemperf Docker Memcached

Connection rate: 9817.9 conn/s
Connection time [ms]: avg 341.1 min 73.7 max 396.2 stddev 52.11
Connect time [ms]: avg 55.0 min 1.1 max 103.1 stddev 28.14
Request rate: 83942.7 req/s (0.0 ms/req)
Request size [B]: avg 129.0 min 129.0 max 129.0 stddev 0.00
Response rate: 83942.7 rsp/s (0.0 ms/rsp)
Response size [B]: avg 8.0 min 8.0 max 8.0 stddev 0.00
Response time [ms]: avg 28.6 min 1.2 max 65.0 stddev 0.01
Response time [ms]: p25 24.0 p50 27.0 p75 29.0
Response time [ms]: p95 58.0 p99 62.0 p999 65.0

Twemperf Centmin Mod Memcached

Connection rate: 11419.3 conn/s
Connection time [ms]: avg 200.5 min 0.6 max 263.2 stddev 73.85
Connect time [ms]: avg 26.2 min 0.0 max 53.5 stddev 14.59
Request rate: 114192.6 req/s (0.0 ms/req)
Request size [B]: avg 129.0 min 129.0 max 129.0 stddev 0.00
Response rate: 114192.6 rsp/s (0.0 ms/rsp)
Response size [B]: avg 8.0 min 8.0 max 8.0 stddev 0.00
Response time [ms]: avg 17.4 min 0.0 max 28.8 stddev 0.01
Response time [ms]: p25 12.0 p50 20.0 p75 23.0
Response time [ms]: p95 28.0 p99 28.0 p999 29.0

ここにmemtierベンチマークツールを使用したbencmarksがあります

memtier_benchmark docker Memcached

4         Threads
50        Connections per thread
10000     Requests per thread
Type        Ops/sec     Hits/sec   Misses/sec      Latency       KB/sec
------------------------------------------------------------------------
Sets       16821.99          ---          ---      1.12600      2271.79
Gets      168035.07    159636.00      8399.07      1.12000     23884.00
Totals    184857.06    159636.00      8399.07      1.12100     26155.79

memtier_benchmark Centmin Mod Memcached

4         Threads
50        Connections per thread
10000     Requests per thread
Type        Ops/sec     Hits/sec   Misses/sec      Latency       KB/sec
------------------------------------------------------------------------
Sets       28468.13          ---          ---      0.62300      3844.59
Gets      284368.51    266547.14     17821.36      0.62200     39964.31
Totals    312836.64    266547.14     17821.36      0.62200     43808.90

1
彼らはmemcachedの2つの異なるビルドを比較し、それらの1つをDocker内で、他をDockerの外部で比較しませんか?
さん

4
これらの結果は、Dockerのホストネットワークまたはブリッジネットワークで発生しますか?
akaHuman 2016年

13
そのような大きな標準偏差では、これらの測定値は表現可能なデータを示していませんavg 200.5 min 0.6 max 263.2 stddev 73.85
セルゲイジューコフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.