我想全面了解一个Docker容器的运行时性能成本。我发现网络的参考文献要慢大约100µs。
我还发现对运行时成本的引用“可以忽略不计”和“接近于零”,但我想更准确地了解这些成本是什么。理想情况下,我想知道Docker抽象的是什么,但需要付出性能代价,以及抽象出来的东西不需要付出性能代价。联网、CPU、内存等。
此外,如果存在抽象成本,是否有方法绕过抽象成本。例如,也许我可以直接挂载磁盘,而不是在Docker中虚拟挂载磁盘。
一篇出色的2014年IBM研究论文“虚拟机和Linux容器的更新性能比较”,作者Felter等人。提供裸机、KVM和Docker容器之间的比较。一般的结果是:Docker几乎与原生性能相同,并且在每一个类别中都快于KVM。
Docker的NAT是一个例外--如果您使用端口映射(例如Docker run-p 8080:8080
),那么您可能会在延迟方面遇到一个小问题,如下所示。但是,您现在可以在启动Docker容器时使用主机网络堆栈(例如,Docker run--net=host
),这将与本机列执行相同(如下面的Redis延迟结果所示)。
他们还在一些特定的服务上运行延迟测试,比如Redis。您可以看到,在20个客户端线程以上,最大的延迟开销是Docker NAT,然后是KVM,然后是Docker主机/本机之间的大致平局。
正因为这是一篇真正有用的论文,这里还有一些其他的数字。请下载以获得全面访问。
看看磁盘I/O:
现在看看CPU开销:
现在有一些关于内存的例子(阅读论文了解详细信息,内存可能是额外的棘手的):