什么是Docker容器的运行时性能成本
我想全面了解Docker容器的运行时性能成本。 我发现参考networking轶事慢〜100μs 。
我还发现引用运行时成本是“微不足道”和“接近于零”,但我想更确切地知道这些成本是什么。 理想情况下,我想知道Docker是以抽象的性能成本抽象出来的,还是抽象出没有性能成本的东西。 networking,CPU,内存等
而且,如果有抽象成本,是否有办法绕过抽象成本。 例如,也许我可以直接在Docker上装载一个磁盘。
这是Felter等人在 2014年出版的一篇名为“虚拟机和Linux容器的更新性能比较”的杰出研究论文。 提供裸机,KVM和Docker容器之间的比较。 一般的结果是,Docker与Native性能几乎相同,在每个类别中都比KVM更快。
这个例外是Docker的NAT – 如果你使用端口映射(例如docker run -p 8080:8080
),那么你可以期待在延迟上有一点点击,如下所示。 但是,现在您可以在启动Docker容器时使用主机networking堆栈(例如docker run --net=host
),Docker容器的执行方式与Native
列相同(如下面的Redis延迟结果所示)。
他们还对一些特定的服务(如Redis)进行了延迟testing。 你可以看到20个以上的客户端线程,最高的延迟开销是Docker NAT,然后是KVM,然后是Docker主机/本地的一个粗略的关系。
只是因为这是一个非常有用的论文,这里还有一些其他的数字。 请下载完整的访问权限。
看看磁盘IO:
现在看CPU的开销:
现在一些内存的例子(阅读文件的细节,内存可以额外棘手)
Docker不是虚拟化,而是在内核支持不同进程命名空间,设备命名空间等的基础上进行抽象化。 一个命名空间本质上并不比另一个命名空间更昂贵或效率低下,所以实际上Docker对性能的影响实际上是在这些命名空间中的问题。
Docker的select是如何为容器configuration命名空间,但这些成本都直接与好处相关 – 你可以放弃,但是这样做也可以放弃相关的好处:
- 分层的文件系统是非常昂贵的 – 每个成本都不一样(而且Docker支持多个后端),而且你的使用模式(合并多个大目录,或者合并一个非常深的文件系统将是特别昂贵的),但是它们不是免费的。 另一方面,Docker的许多function – 能够以写入方式从其他客人那里build立客人,并获得隐含的存储优势 – 来支付这笔费用。
- DNAT的规模很大 – 但是可以让你独立于你的主机来configuration你的客户的networking,并且有一个方便的接口来转发你想要的端口。 您可以将其replace为物理接口的桥接,但是又会失去优势。
- 能够以最方便的方式运行每个软件堆栈(独立于主机的发行版,libc和其他库版本),这是一个很大的好处,但是需要多次加载共享库(当它们的版本不同)有你所期望的成本。
等等。 这些成本在您的环境中实际上会对您造成多大影响 – 您的networking访问模式,内存限制等 – 是一个难以提供通用答案的项目。
以下是Docker based memcached server
与使用Twemperf基准工具https://github.com/twitter/twemperf的; host native memcached server
更多基准testing: 5000个连接和20k个连接速率
基于Docker的memcached连接时间开销似乎与上述白皮书大致相同,速度大约是原来的两倍。
Twemperf Docker Memcached
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
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
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
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