Docker容器的运行时性能成本是多少?

What is the runtime performance cost of a Docker container?

我想全面了解码头集装箱的运行时性能成本。我发现有人说网络的速度慢了大约100微秒。

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

此外,如果有抽象成本,有没有办法规避抽象成本。例如,也许我可以直接安装一个磁盘,而实际上可以在Docker中安装。


下面是Felter等人的一篇优秀的2014年IBM研究论文,题为"虚拟机和Linux容器的更新性能比较"。这提供了裸金属、KVM和Docker容器之间的比较。一般的结果是docker几乎与本机性能相同,并且在每个类别中都比kvm快。

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

Docker NAT overhead

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

docker Redis latency overhead

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

查看磁盘IO:

IO docker vs kvm vs native

现在看一下CPU开销:

docker cpu overhead

现在,一些记忆的例子(阅读文章了解细节,记忆可能是非常棘手的)

docker memory comparison


Docker不是虚拟化,相反,它是内核对不同进程名称空间、设备名称空间等的支持之上的抽象;一个名称空间本身并不比另一个更昂贵或效率更低,因此Docker对性能的影响实际上取决于这些名称空间中的实际内容。

Docker在如何为其容器配置名称空间方面的选择是有成本的,但是这些成本都与收益直接相关——您可以放弃它们,但这样做的同时,您也放弃了相关的收益:

  • 分层的文件系统是昂贵的——确切地说,每一个文件系统的成本是不同的(Docker支持多个后端),以及您的使用模式(合并多个大目录,或者合并一组非常深的文件系统将是特别昂贵的),但它们不是免费的。另一方面,Docker的许多功能——能够以一种拷贝一写的方式构建客户,并获得隐含的存储优势——依赖于支付这个成本。
  • dnat在规模上变得昂贵——但是它让您能够独立于主机配置客户的网络,并且有一个方便的接口,只转发您想要的端口。您可以用一个到物理接口的桥接器来替换它,但同样会失去它的好处。
  • 能够以最方便的方式(独立于主机的发行版、libc和其他库版本)运行每个软件栈及其依赖项,这是一个很大的好处,但是需要多次加载共享库(当它们的版本不同时)会产生您所期望的成本。

诸如此类。这些成本实际上对您的环境有多大的影响——您的网络访问模式、内存限制等等——是一个很难提供一般答案的项目。


以下是使用twempef基准测试工具https://github.com/twitter/twempef(5000个连接和20k个连接速率)对Docker based memcached serverhost native memcached server进行的更多基准测试

基于Docker的memcached的连接时间开销似乎与上面的白皮书以大约两倍的本地速度一致。

Twemperf Docker Memcached

1
2
3
4
5
6
7
8
9
10
Connection rate: 9817.9 conn/s
Connection time [ms]: avg 341.1 min 73.7 max 396.2 stddev 52.11
Connect time [ms]: avg 55.0 min 1.1 max 103.1 stddev 28.14
Request rate: 83942.7 req/s (0.0 ms/req)
Request size [B]: avg 129.0 min 129.0 max 129.0 stddev 0.00
Response rate: 83942.7 rsp/s (0.0 ms/rsp)
Response size [B]: avg 8.0 min 8.0 max 8.0 stddev 0.00
Response time [ms]: avg 28.6 min 1.2 max 65.0 stddev 0.01
Response time [ms]: p25 24.0 p50 27.0 p75 29.0
Response time [ms]: p95 58.0 p99 62.0 p999 65.0

Twemperf Centmin Mod Memcached

1
2
3
4
5
6
7
8
9
10
Connection rate: 11419.3 conn/s
Connection time [ms]: avg 200.5 min 0.6 max 263.2 stddev 73.85
Connect time [ms]: avg 26.2 min 0.0 max 53.5 stddev 14.59
Request rate: 114192.6 req/s (0.0 ms/req)
Request size [B]: avg 129.0 min 129.0 max 129.0 stddev 0.00
Response rate: 114192.6 rsp/s (0.0 ms/rsp)
Response size [B]: avg 8.0 min 8.0 max 8.0 stddev 0.00
Response time [ms]: avg 17.4 min 0.0 max 28.8 stddev 0.01
Response time [ms]: p25 12.0 p50 20.0 p75 23.0
Response time [ms]: p95 28.0 p99 28.0 p999 29.0

以下是使用Memtier基准测试工具的Bencmarks

memtier_benchmark docker Memcached

1
2
3
4
5
6
7
8
4         Threads
50        Connections per thread
10000     Requests per thread
Type        Ops/sec     Hits/sec   Misses/sec      Latency       KB/sec
------------------------------------------------------------------------
Sets       16821.99          ---          ---      1.12600      2271.79
Gets      168035.07    159636.00      8399.07      1.12000     23884.00
Totals    184857.06    159636.00      8399.07      1.12100     26155.79

memtier_benchmark Centmin Mod Memcached

1
2
3
4
5
6
7
8
4         Threads
50        Connections per thread
10000     Requests per thread
Type        Ops/sec     Hits/sec   Misses/sec      Latency       KB/sec
------------------------------------------------------------------------
Sets       28468.13          ---          ---      0.62300      3844.59
Gets      284368.51    266547.14     17821.36      0.62200     39964.31
Totals    312836.64    266547.14     17821.36      0.62200     43808.90