Docker容器的运行时性能成本是多少?


511

我想全面了解Docker容器的运行时性能成本。我发现对网络的引用实际上慢了约100µs

我还发现运行时成本“可以忽略不计”且“接近零”,但我想更准确地知道这些成本是多少。理想情况下,我想知道Docker正在以性能成本进行抽象,而抽象是在没有性能成本的情况下进行的。网络,CPU,内存等

此外,如果存在抽象成本,是否有办法解决抽象成本。例如,也许我可以直接安装磁盘,而实际上可以在Docker中安装磁盘。



1
@GoloRoden该问题相似,但不完全相同。我正在寻找延迟成本,原因是诸如“网络正在通过额外的层传递”,而该问题的可接受答案更多是关于衡量容器+应用程序的成本。
卢克·霍尔斯顿

1
好的,是的。我撤回了我的密切投票。
Golo Roden 2014年

8
很高兴您发布了它。我的搜索中没有出现这个问题。Measurement
Luke Hoersten 2014年

1
这是一个很好的会议,标题为“ Linux容器-下一代云虚拟化”,通过比较docker,KVM VM和裸机来讲述性能指标:youtube.com/watch?
v=a4oOAVhNLjU

Answers:


449

Felter等人在2014年发表的一篇出色的IBM研究论文“ 虚拟机和Linux容器的更新性能比较 ”中。提供了裸机,KVM和Docker容器之间的比较。总体结果是:Docker在所有类别中几乎与本地性能相同,并且比KVM更快。

Docker的NAT是一个例外,如果您使用端口映射(例如docker run -p 8080:8080),则可以期望延迟稍有下降,如下所示。但是,您现在可以docker run --net=host在启动Docker容器时使用主机网络堆栈(例如),其性能与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硬件)。内存分页周围有大量开销...但是原始浮点数?我想看看那里到底发生了什么-可能是过多的上下文切换。
查尔斯·达菲

2
当前Docker CLI语法的更正:(--net=host两个破折号)和-p 8080:8080(小写的'p')用于NAT。
bk0

6
引用的IBM论文似乎过于关注网络IO。它从不处理上下文切换。我们研究了LXC,由于非自愿上下文切换的增加导致应用程序处理质量下降,不得不迅速放弃它。
埃里克

3
我也对文件系统的操作感到好奇,例如,目录查找是我期望看到开销的地方。块级的读取,写入和查找(给定的图表重点关注)不是
查尔斯·达菲

12
我喜欢具有相同阴影颜色的图表。区分起来非常容易
维克托·乔拉斯

104

Docker本身不是虚拟化的,而是基于内核对不同进程名称空间,设备名称空间等的支持的一种抽象。一个命名空间本质上并不比另一个命名空间昂贵或效率低下,因此,实际上使Docker对性能产生影响的是这些命名空间中实际存在的问题。


Docker在如何为其容器配置名称空间方面的选择是有成本的,但是这些成本都直接与收益相关联—您可以放弃它们,但这样做还可以放弃相关的收益:

  • 分层的文件系统非常昂贵-每个服务器的成本各不相同(Docker支持多个后端)以及使用模式(合并多个大目录或合并非常深的文件系统会特别昂贵),但是它们却非常昂贵。不是免费的。另一方面,Docker的大量功能-能够以写时复制的方式从其他来宾上建立来宾,并获得隐含的存储优势-就是为此付出了代价。
  • DNAT的价格昂贵,但它给您带来的好处是能够独立于主机配置来宾网络,并具有方便的接口,仅在它们之间转发所需的端口。您可以用到物理接口的桥代替它,但是再次失去了好处。
  • 能够以最方便的方式运行每个软件堆栈并安装其依赖项(独立于主机的发行版,libc和其他库版本)是一个很大的好处,但是需要多次加载共享库(当它们的版本时)有所不同)。

依此类推。这些成本实际上对您的环境有多大影响,包括您的网络访问模式,内存限制等,这是一个很难提供通用答案的项目。


2
这是一个很好的答案,但我正在寻找更具体的数字和基准。我熟悉cgroup的成本,但是Docker不仅如您所指出的那样。非常感谢您的回答。
卢克·霍尔斯顿

6
当然。我的观点是,您找到的任何通用基准都将非常有限地适用于任何特定的应用程序-但这并不是说我不同意尝试提供这些基准的人,而只是将它们与一大汤匙的盐一起使用。
Charles Duffy 2015年

1
这样,您可以说KVM“不是虚拟化,它只是x86虚拟技术调用之上的抽象”。
瓦德(Vad)

10
@Vad,已有数十年的共识协议(可以追溯到IBM的早期非x86硬件实现!),直接在硬件层提供抽象无疑是虚拟化。关于内核级命名空间的术语的共识更加零散-我们每个人都可以指向支持我们个人观点的资源-但坦率地说,存在有用的技术区别(围绕安全性和性能特征),转移到单个术语会模糊不清,因此我一直保持自己的立场,除非达成相反的行业共识。
查尔斯·达菲

@LukeHoersten,...对,代价不是很大的cgroup,更多的是网络和文件系统名称空间的内容。但是这些费用多少几乎完全取决于Docker的配置方式-您正在使用的特定后端。桥接多,比多克的默认NAT便宜,例如; 而且各种文件系统后端的性能开销也相差很大(在某些情况下,开销量取决于使用模式;对于通过多层f / e修改的大目录,overlayfs变体的价格可能会高得多)。
Charles Duffy

20

这里的一些基准Docker based memcached serverhost native memcached server使用Twemperf基准测试工具https://github.com/twitter/twemperf与5000个连接和20K连接速率

基于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基准测试工具标志

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构建,并且其中一个在docker中,另一个在docker之外,不是吗?

4
这些结果与Docker中的主机网络还是桥接网络有关?
akaHuman16年

13
使用如此大的stddev,这些测量结果无法显示任何可表示的数据avg 200.5 min 0.6 max 263.2 stddev 73.85
Sergey Zhukov
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.