Dockerコンテナの実行時のパフォーマンスコストを包括的に理解したいのですが。 ネットワーキングへの参照が逸話的に〜100μs遅くなっているのを見つけました 。
また、ランタイムコストが「無視できる」「ゼロに近い」という言及もありましたが、それらのコストとは何かをもっと正確に知りたいのです。理想的には、Dockerがパフォーマンスコストで抽象化しているものと、パフォーマンスコストなしで抽象化されているものを知りたいのです。ネットワーク、CPU、メモリなど.
さらに、抽象化コストがある場合、抽象化コストを回避する方法はありますか。たとえば、Dockerではなく、ディスクを直接マウントできます。
ここ は、Felter et alによる「仮想マシンとLinuxコンテナの最新のパフォーマンス比較」というタイトルの2014年IBM研究論文です。それはベアメタル、KVM、そしてDockerコンテナの間の比較を提供します。 一般的な結果として、Dockerはネイティブパフォーマンスとほぼ同じであり、すべてのカテゴリでKVMより高速です。
これに対する例外はDockerのNATです - もしポートマッピング(例えばdocker run -p 8080:8080
)を使っているのであれば、以下に示すように、レイテンシのわずかな低下が予想されます。ただし、Dockerコンテナを起動するときに、ホストネットワークスタック(例:docker run --net=Host
)を使用できるようになりました。これは、Native
列と同じように実行されます(Redis待ち時間の結果が下に表示されます)。
彼らはまたRedisのような少数の特定のサービスの待ち時間テストを走らせた。 20を超えるクライアントスレッドでは、最大の遅延オーバーヘッドがDocker NAT、次にKVM、次にDocker Host/native間の大まかな結びつきになることがわかります。
本当に役に立つ論文だからこそ、他にも図があります。フルアクセスのためにそれをダウンロードしてください。
ディスクIOを見てください。
今CPUオーバーヘッドを見て:
今メモリのいくつかの例(詳細については論文を読んで、メモリは余分なトリッキーになることができます)
Dockerは仮想化ではありません。その代わりに、さまざまなプロセスの名前空間、デバイスの名前空間などに対するカーネルのサポートに加えて抽象化されています。ある名前空間は本質的に他の名前空間よりも高価でも非効率的でもないので、実際にDockerがパフォーマンスに影響を与えるのは、実際に in それらの名前空間が何であるかの問題です。
コンテナーの名前空間を構成する方法に関するDockerの選択にはコストがかかりますが、それらのコストはすべて直接利益に関連付けられます - それらを放棄することはできますが、その際には関連する利益も放棄します。
などなど。ネットワークアクセスパターン、メモリの制約など、これらのコストが実際に環境にどの程度影響を与えるかは、一般的な答えを提供するのが難しい項目です。
ここでは、Twemperfベンチマークツールを使用したDocker based memcached server
とHost native memcached server
の ベンチマーク _接続数5000、接続数20kの場合 https://github.com/Twitter/twemperf
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 benchmark toolを使ったベンチマーク です
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