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

在docker容器下运行的程序性能:相同还是较慢?,docker,Docker,我正在使用一个基于ubuntu的Docker镜像,其中包含了我在未来几个月的工作中将需要的标准软件 假设我有一个耗时的程序来排序十亿个用C++编写的数字。假设我想比较我的笔记本电脑上的可执行程序的性能,与在同一台笔记本电脑上的ubuntu容器中运行可执行程序的性能 总的来说,性能会有什么不同吗?对于我尝试过的一些粗略的实验,关于对一百万个数字进行排序,在性能上似乎没有什么差别。对于其他更一般的计算,比如数字运算或字符串处理,这是真的吗 我知道docker容器应该是“轻量级”的,因为它们启动很快(

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

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

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


我知道docker容器应该是“轻量级”的,因为它们启动很快(不像虚拟机),但我不知道每个容器是否在金属和容器内运行的代码之间设置了某种“屏障”。抱歉,如果最后一句话没有什么意义,我对容器和虚拟机不是很精通

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

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


对于您描述的工作负载,它是计算绑定的,数据集位于内存中,我希望裸机、Docker和虚拟机之间的总体性能非常相似

Docker努力做到非常轻量级,并在很大程度上依赖内核级支持来实现其魔力。如果您正在进行文件I/O,那么在内核中会有另一层间接寻址;如果您正在进行网络I/O,Docker将引入NAT层。(当您在Docker中说“read
/foo/bar
时,内核会执行一些内部间接操作,说“哦,您是指
/var/lib/Docker
下的这个文件”。)如果您可以测量这种差异,并且它对您来说确实很重要,那么您需要在裸机上运行应用程序;应用程序代码中可能会有更大的收益

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

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