我想全面了解一个 Docker 容器的运行时性能成本。我发现对网络的引用据说慢了约 100µs。
我还发现对运行时成本的引用“可以忽略不计”和“接近于零”,但我想更准确地知道这些成本是什么。理想情况下,我想知道 Docker 以性能成本抽象了什么,以及在没有性能成本的情况下抽象的东西。网络、CPU、内存等
此外,如果有抽象成本,有没有办法绕过抽象成本。例如,也许我可以直接挂载磁盘而不是在 Docker 中虚拟挂载。
我想全面了解一个 Docker 容器的运行时性能成本。我发现对网络的引用据说慢了约 100µs。
我还发现对运行时成本的引用“可以忽略不计”和“接近于零”,但我想更准确地知道这些成本是什么。理想情况下,我想知道 Docker 以性能成本抽象了什么,以及在没有性能成本的情况下抽象的东西。网络、CPU、内存等
此外,如果有抽象成本,有没有办法绕过抽象成本。例如,也许我可以直接挂载磁盘而不是在 Docker 中虚拟挂载。
一篇出色的 2014 年 IBM 研究论文“<a href="http://domino.research.ibm.com/library/cyberdig.nsf/papers/0929052195DD819C85257D2300681E7B/$File/rc25482.pdf" rel="noreferrer">An Updated Performance Felter 等人的《虚拟机和 Linux 容器的比较》。提供了裸机、KVM 和 Docker 容器之间的比较。总体结果是:Docker 几乎与原生性能相同,并且在每个类别中都比 KVM 更快。
Docker 的 NAT 是个例外——如果您使用端口映射(例如,docker run -p 8080:8080
),那么您可以预期延迟会受到轻微影响,如下所示。但是,您现在可以docker run --net=host
在启动 Docker 容器时使用主机网络堆栈(例如,),这将与 Native 列相同(如下面的 Redis 延迟结果所示)。
他们还对一些特定服务(例如 Redis)进行了延迟测试。您可以看到超过 20 个客户端线程,延迟开销最高的是 Docker NAT,然后是 KVM,然后是 Docker 主机/本机之间的粗略联系。
仅仅因为它是一篇非常有用的论文,这里有一些其他的数字。请下载它以获得完全访问权限。
看一下磁盘 I/O:
现在查看 CPU 开销:
现在一些内存示例(阅读论文了解详细信息,内存可能特别棘手):
Docker 本身并不是虚拟化——相反,它是内核对不同进程命名空间、设备命名空间等的支持之上的抽象;一个命名空间本质上并不比另一个命名空间更昂贵或效率低下,因此真正使 Docker 对性能产生影响的原因在于这些命名空间中的实际内容。
Docker 在如何为其容器配置命名空间方面的选择是有成本的,但这些成本都与收益直接相关——你可以放弃它们,但这样做你也放弃了相关的收益:
等等。这些成本在您的环境中对您的实际影响有多大——包括网络访问模式、内存限制等——是一个很难提供通用答案的项目。
这是与使用 Twemperf 基准测试工具https://github.com/twitter/twemperf相比的更多基准,具有 5000 个连接和 20k 连接率Docker based memcached server
host native memcached server
基于 docker 的 memcached 的连接时间开销似乎与上述白皮书一致,大约是本机速度的两倍。
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 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