程序在 docker 容器下运行时的性能:相同还是更慢?

smi*_*dha 6 docker

我正在使用基于 ubuntu 构建的 Docker 映像,其中包含我在未来几个月的工作中将需要的标准软件。

假设我有一个用 C++ 编写的耗时程序,用于对 10 亿个数字进行排序。假设我想比较我的笔记本电脑上的程序可执行文件的性能与在同一台笔记本电脑上的 ubuntu 容器内运行可执行文件时的性能。

总体来说,性能上会有什么区别吗?对于我尝试过的一些粗略实验,对于对一百万个数字进行排序,性能似乎没有差异。对于其他涉及数字运算或字符串处理的更一般的计算来说,这是真的吗?

我知道 docker 容器应该是“轻量级”的,因为它们启动速度很快(与虚拟机不同),但我不知道每个容器是否在金属和运行的代码之间施加了某种“障碍”容器内。如果最后一句话没有多大意义,我很抱歉,我不太熟悉容器和虚拟机。

Dav*_*aze 5

Ob免责声明:性能问题的唯一真正答案是实际编写、运行和测量基准测试。

Ob免责声明 2:在现代硬件上,除非绝对有理由,否则不要强调性能。人们一直在共享租赁硬件上的虚拟机上运行用解释语言编写的生产级工作负载,他们并没有真正注意到它比裸机上优化的 C 慢 100-200 倍。


对于您所描述的工作负载(受计算限制且数据集位于内存中),我预计裸机、Docker 和虚拟机之间的整体性能非常相似。

Docker 努力做到轻量级,并且在很大程度上依赖于内核级支持来发挥其魔力。如果您正在执行文件 I/O,则会有另一层间接层(主要位于内核内);如果您正在执行网络 I/O,Docker 会引入 NAT 层。(当您说“/foo/bar在 Docker 中读取时,内核会执行一些内部间接操作来表示“哦,您的意思是下面的这个文件/var/lib/docker”。)如果您可以测量这种差异并且它对您确实很重要,那么您需要在裸机;您的应用程序代码可能会获得更大的收益。

虚拟机必须模拟所有“硬件”,这可能会使它们变慢,尤其是对于磁盘绑定的工作负载。如果您正在执行文件或网络 I/O,它看起来就像是真正写入磁盘,但该磁盘设备是在软件中模拟的。同样,在过去的几十年里,我们做了很多工作来优化这一点,并且应用程序级缓存层可以在很大程度上改善事情(即使在裸机上,磁盘和网络是系统中最慢的部分) 。

无论哪种方式,纯算法代码都直接在处理器上运行,并且内存控制(确保您的进程/虚拟机的内存无法到达另一个进程/虚拟机)在硬件中实现。