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

Luk*_*ten 458 performance docker

我想全面了解Docker容器的运行时性能开销.我发现网络的参考传闻速度慢了~100μs.

我还发现运行时成本的参考值"可以忽略不计"和"接近于零",但我想更准确地了解这些成本是多少.理想情况下,我想知道Docker正在以性能成本和抽象的东西进行抽象而没有性能成本.网络,CPU,内存等

此外,如果存在抽象成本,是否有办法绕过抽象成本.例如,也许我可以在Docker中直接安装磁盘.

Ham*_*amy 405

是一篇出色的2014年IBM研究论文,题为"虚拟机和Linux容器的更新性能比较",作者是Felter等人.它提供了裸机,KVM和Docker容器之间的比较.一般结果是Docker几乎与Native性能完全相同,并且在每个类别中都比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延迟开销

仅仅因为它是一篇非常有用的论文,这里有一些其他的数字.请下载它以获得完全访问权限.

看看磁盘IO:

IO docker vs kvm vs native

现在看看CPU开销:

docker cpu开销

现在一些内存的例子(详细阅读论文,内存可能会特别棘手)

码头记忆比较

  • 至于论文中给出的linpack数字......坦率地说,我发现它们很难相信(不是我不相信它们是linpack发出的,但我不相信测试真的只测量浮点性能执行).KVM的主要开销是用户空间硬件仿真组件(仅适用于_non-CPU_硬件); 内存分页周围有很大的开销......但原始浮点?我想看看那里到底发生了什么 - 可能是过多的上下文切换. (17认同)
  • 引用的IBM论文似乎过于关注网络IO.它从不处理上下文切换.我们研究了LXC并且由于增加了非自愿的上下文切换而导致应用程序处理性能下降,因此不得不迅速放弃它. (6认同)
  • 对 docker 与本机比 docker 与任何类型的虚拟机更感兴趣。 (4认同)
  • 当前Docker CLI语法的更正:用于NAT的--net = host(两个破折号)和-p 8080:8080(小写的'p')。 (2认同)
  • 我也对文件系统的操作感到好奇,例如,目录查找是我期望看到开销的地方。*没有**块级的读取,写入和查找(给定的图表着重于此)。 (2认同)
  • 我喜欢具有相同阴影颜色的图表。这么容易区分 (2认同)

Cha*_*ffy 91

Docker不是虚拟化的 - 相反,它是内核对不同进程命名空间,设备命名空间等的支持的抽象; 一个命名空间本身并不比另一个命名空间更昂贵或效率低,所以实际上使Docker产生性能影响的是这些命名空间中实际存在的问题.


泊坞窗的选择中如何配置命名空间为它的容器具有成本,但是这些成本都直接与利益相关的条款 - 你可以给他们了,但这样做也放弃了相关的好处:

  • 分层文件系统是昂贵的 - 正是成本与每一个变化(与泊坞支持多个后端),并与您的使用模式(合并多个大型目录,或合并了非常深刻的文件系统集合会特别贵),但他们'不自由.另一方面,Docker的大量功能 - 能够以写入时复制的方式将客人从其他客户身上建立起来,并且隐藏着相同的存储优势 - 可以支付这笔费用.
  • DNAT在规模上变得非常昂贵 - 但是您可以独立于主机配置访客的网络,并且只有一个方便的界面来转发您想要的端口.您可以将其替换为物理接口的桥接器,但同样会失去优势.
  • 能够以最方便的方式运行每个软件堆栈及其依赖项 - 独立于主机的发行版,libc和其他库版本 - 是一个很大的好处,但需要多次加载共享库(当它们的版本时)不同的)有你期望的成本.

等等.这些成本在您的环境中实际影响了多少 - 使用您的网络访问模式,内存限制等 - 是一个难以提供通用答案的项目.

  • @Vad,已达成共识协议,可追溯到几十年前(到IBM的早期非x86硬件实现!),直接在硬件层上提供抽象是毫不含糊的虚拟化.围绕内核级命名空间的术语达成共识会更加分散 - 我们每个人都可以指出有利于我们个人观点的来源 - 但坦率地说,有一些有用的技术差异(围绕安全性和性能特征)转移到单个术语会模糊不清所以我一直坚持我的立场,除非达成相反的行业共识. (9认同)
  • 当然.我的观点是,您发现的任何通用基准测试对任何特定应用程序的适用性都非常有限 - 但这并不是说我不同意尝试提供这些基准测试的人,而仅仅是他们应该使用大量的盐. (5认同)
  • 这是一个很好的答案,但我正在寻找更具体的数字和基准.我熟悉cgroup的成本,但Docker不仅如你所指出的那样.非常感谢你的回答. (2认同)

p4g*_*uru 19

这里的一些基准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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

这是使用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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 有了这么大的stddevs,这些测量值没有显示任何可表示的数据`avg 200.5 min 0.6 max 263.2 stddev 73.85` (12认同)
  • 这些结果是否在docker中使用主机网络或桥接网络? (4认同)
  • 他们比较了两种不同的 memcached 版本,其中一个在 docker 中,另一个在 docker 之外,不是吗? (2认同)