What is the runtime performance cost of a Docker container?
我想全面了解码头集装箱的运行时性能成本。我发现有人说网络的速度慢了大约100微秒。
我还发现运行时成本是"可忽略的"和"接近于零",但我想更准确地知道这些成本是什么。理想情况下,我想知道Docker以性能成本抽象的是什么,以及不以性能成本抽象的东西。网络、CPU、内存等。
此外,如果有抽象成本,有没有办法规避抽象成本。例如,也许我可以直接安装一个磁盘,而实际上可以在Docker中安装。
下面是Felter等人的一篇优秀的2014年IBM研究论文,题为"虚拟机和Linux容器的更新性能比较"。这提供了裸金属、KVM和Docker容器之间的比较。一般的结果是docker几乎与本机性能相同,并且在每个类别中都比kvm快。
这一点的例外是Docker的NAT——如果您使用端口映射(例如
他们还对一些特定的服务(如Redis)运行延迟测试。您可以看到,超过20个客户机线程的延迟开销最高的是Docker NAT,然后是KVM,然后是Docker主机/本机之间的一个粗略的连接。
因为这是一篇非常有用的论文,这里还有一些其他的数字。请下载以获得完全访问权限。
查看磁盘IO:
现在看一下CPU开销:
现在,一些记忆的例子(阅读文章了解细节,记忆可能是非常棘手的)
Docker不是虚拟化,相反,它是内核对不同进程名称空间、设备名称空间等的支持之上的抽象;一个名称空间本身并不比另一个更昂贵或效率更低,因此Docker对性能的影响实际上取决于这些名称空间中的实际内容。
Docker在如何为其容器配置名称空间方面的选择是有成本的,但是这些成本都与收益直接相关——您可以放弃它们,但这样做的同时,您也放弃了相关的收益:
- 分层的文件系统是昂贵的——确切地说,每一个文件系统的成本是不同的(Docker支持多个后端),以及您的使用模式(合并多个大目录,或者合并一组非常深的文件系统将是特别昂贵的),但它们不是免费的。另一方面,Docker的许多功能——能够以一种拷贝一写的方式构建客户,并获得隐含的存储优势——依赖于支付这个成本。
- dnat在规模上变得昂贵——但是它让您能够独立于主机配置客户的网络,并且有一个方便的接口,只转发您想要的端口。您可以用一个到物理接口的桥接器来替换它,但同样会失去它的好处。
- 能够以最方便的方式(独立于主机的发行版、libc和其他库版本)运行每个软件栈及其依赖项,这是一个很大的好处,但是需要多次加载共享库(当它们的版本不同时)会产生您所期望的成本。
诸如此类。这些成本实际上对您的环境有多大的影响——您的网络访问模式、内存限制等等——是一个很难提供一般答案的项目。
以下是使用twempef基准测试工具https://github.com/twitter/twempef(5000个连接和20k个连接速率)对
基于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 |
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
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 |
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 |