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

新手上路,请多包涵

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

我还发现对运行时成本的引用“可以忽略不计”和“接近于零”,但我想更准确地知道这些成本是什么。理想情况下,我想知道 Docker 以性能成本抽象了什么,以及在没有性能成本的情况下抽象的东西。网络、CPU、内存等

此外,如果有抽象成本,有没有办法绕过抽象成本。例如,也许我可以直接挂载磁盘而不是在 Docker 中虚拟挂载。

原文由 Luke Hoersten 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

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

Docker 的 NAT 是个例外——如果您使用端口映射(例如 docker run -p 8080:8080 ),那么您可以预期延迟会受到轻微影响,如下所示。但是,您现在可以在启动 Docker 容器时使用主机网络堆栈(例如 docker run --net=host ),这将与 Native 列相同(如下面的 Redis 延迟结果所示)。

Docker NAT 开销

他们还对一些特定服务(例如 Redis)进行了延迟测试。您可以看到超过 20 个客户端线程,延迟开销最高的是 Docker NAT,然后是 KVM,然后是 Docker 主机/本机之间的粗略联系。

Docker Redis 延迟开销

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

看一下磁盘 I/O:

Docker vs. KVM vs. Native I/O 性能

现在查看 CPU 开销:

Docker CPU 开销

现在一些内存示例(阅读论文了解详细信息,内存可能特别棘手):

Docker 内存比较

原文由 Hamy 发布,翻译遵循 CC BY-SA 4.0 许可协议

Docker 本身并不是虚拟化——相反,它是内核对不同进程命名空间、设备命名空间等的支持之上的抽象;一个命名空间本质上并不比另一个命名空间更昂贵或效率低下,因此真正使 Docker 对性能产生影响的原因 在于 这些命名空间中的实际内容。


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

  • 分层文件系统很昂贵——确切地说,每个文件系统的成本都不同(Docker 支持多个后端),以及您的使用模式(合并多个大目录,或合并一组非常深的文件系统将特别昂贵),但它们’不是免费的。另一方面,Docker 的大量功能——能够以写时复制的方式从其他来宾构建来宾,并获得其中隐含的存储优势——依赖于支付这笔费用。
  • DNAT 在规模上变得昂贵——但给您带来的好处是能够独立于主机配置访客的网络,并有一个方便的接口,只在它们之间转发您想要的端口。您可以将其替换为物理接口的桥接,但同样失去了好处。
  • 能够以最方便的方式运行每个安装了依赖项的软件堆栈——独立于主机的发行版、libc 和其他库版本——是一个很大的好处,但需要多次加载共享库(当它们的版本不同)具有您期望的成本。

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

原文由 Charles Duffy 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题