我正在使用基于ubuntu构建的Docker映像,其中包含未来几个月我在工作中将需要的标准软件。
假设我有一个耗时的程序来对用C ++编写的十亿个数字进行排序。假设我想将可执行程序在同一台笔记本电脑上的ubuntu容器中运行时的性能与我的笔记本电脑上的可执行程序的性能进行比较。
总体而言,性能会有所不同吗?对于我尝试过的一些粗略实验,关于对一百万个数字进行排序,性能似乎没有差异。对于涉及数字运算或字符串处理的其他更通用的计算是否正确?
我知道docker容器应该是“轻量级”的,因为它们可以快速启动(与虚拟机不同),但是我不知道每个容器是否在金属容器和金属容器之间施加某种“屏障”在容器内运行的代码。抱歉,如果最后一句话没有多大意义,我对容器和虚拟机不是很精通。
答案 0 :(得分:1)
ObDisclaimer:对性能问题的唯一真正答案是实际编写,运行和衡量基准。
ObDisclaimer 2:在现代硬件上,除非绝对有理由,否则不要强调性能。人们始终在共享租用硬件上的虚拟机上运行用解释性语言编写的生产级工作负载,他们并没有真正注意到它比在裸机上优化的C慢100-200倍。
对于您正在描述的工作负载,它是受计算限制的,数据集位于内存中,我希望裸机,Docker和虚拟机之间的整体性能非常相似。
Docker努力做到轻量级,并在很大程度上依赖于内核级对其魔术的支持。如果您正在执行文件I / O,则大多数情况下,内核中将存在另一层间接寻址。如果您正在执行网络I / O,则Docker会引入NAT层。 (当您说“在Docker中读取/foo/bar
时,内核会做一些内部间接说明,说“哦,您的意思是该文件位于/var/lib/docker
下”。)如果您可以测量出这种差异,那么它 对您来说确实很重要,那么您需要在裸机上运行应用程序;在应用程序代码中可能会有更大的收获。
虚拟机必须模拟所有“硬件”,这会使它们变慢,尤其是对于磁盘绑定的工作负载而言。如果您正在执行文件或网络I / O,则看起来就像是对磁盘的真实写入,但是该磁盘设备是在软件中模拟的。同样,在过去的几十年中,有很多工作需要对此进行优化,并且应用程序级缓存层可以大大改善性能(即使在裸机上,磁盘和网络是系统中最慢的部分)
无论哪种方式,纯算法代码都直接在处理器上运行,并且内存控件(确保进程/ VM的内存不能到达另一个进程/ VM)是在硬件中实现的。