我想全面了解Docker容器的运行时性能成本.我找到了networking anecdotally being ~100µs slower条参考文献.

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

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

推荐答案

An excellent 2014 IBM research paper “An Updated Performance Comparison of Virtual Machines and Linux Containers” by Felter et al. provides a comparison between bare metal, KVM, and Docker containers. The general result is: Docker is nearly identical to native performance and faster than KVM in every category.

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

Docker NAT开销

他们还对一些特定的服务进行了延迟测试,比如Redis.您可以看到,在20个客户机线程以上,延迟开销最高的是Docker NAT,然后是KVM,然后是Docker主机/本机之间的粗略连接.

Docker Redis延迟开销

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

看看磁盘I/O:

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

现在来看CPU开销:

Docker CPU开销

下面是一些关于记忆的例子(阅读本文了解细节,记忆可能非常棘手):

Docker内存比较

Linux相关问答推荐

使用awk以相同的时间戳重新排列

C++ kill()使Linux崩溃到登录屏幕

Flutter 构建错误:';DART:JS_interop';在此平台上不可用

使用 grep 时如何跳过第一行和最后一行?

使用 bash 命令将文件从子文件夹复制到另一个

Google Cloud Ops Agent Mongo 集成错误 - AuthenticationFailed:SCRAM 身份验证失败,storedKey 不匹配

在 bash 中获取目录或文件的基本名称的快速且正确的方法

如何为命令的所有选项启用无密码 sudo?

从 .war 文件外部化 Tomcat webapp 配置

使用 rc.local 运行脚本:脚本有效,但在启动时无效

在 bash 中检测公共 IP 地址的方法

polkitd未注册身份验证代理的解释

何时使用管道与何时使用共享内存

使用sudo apt-get install build-essentials

zsh:找不到命令 laravel

是否有git sed或类似功能?

如何自动化 HTML 到 PDF 的转换?

在 shell 脚本的 for 循环中迭代行而不是单词

Vim 增量搜索

libaio.so.1:无法打开共享对象文件