我想全面了解Docker容器的运行时性能成本。我发现对网络的引用实际上慢了约100µs。
我还发现运行时成本“可以忽略不计”且“接近零”,但我想更准确地知道这些成本是多少。理想情况下,我想知道Docker正在以性能成本进行抽象,而抽象是在没有性能成本的情况下进行的。网络,CPU,内存等
此外,如果存在抽象成本,是否有办法解决抽象成本。例如,也许我可以直接安装磁盘,而实际上可以在Docker中安装磁盘。
我想全面了解Docker容器的运行时性能成本。我发现对网络的引用实际上慢了约100µs。
我还发现运行时成本“可以忽略不计”且“接近零”,但我想更准确地知道这些成本是多少。理想情况下,我想知道Docker正在以性能成本进行抽象,而抽象是在没有性能成本的情况下进行的。网络,CPU,内存等
此外,如果存在抽象成本,是否有办法解决抽象成本。例如,也许我可以直接安装磁盘,而实际上可以在Docker中安装磁盘。
Answers:
Felter等人在2014年发表的一篇出色的IBM研究论文“ 虚拟机和Linux容器的更新性能比较 ”中。提供了裸机,KVM和Docker容器之间的比较。总体结果是:Docker在所有类别中几乎与本地性能相同,并且比KVM更快。
Docker的NAT是一个例外,如果您使用端口映射(例如docker run -p 8080:8080),则可以期望延迟稍有下降,如下所示。但是,您现在可以docker run --net=host在启动Docker容器时使用主机网络堆栈(例如),其性能与Native列相同(如Redis延迟结果所示)。

他们还对Redis等一些特定服务进行了延迟测试。您可以看到,在20个以上的客户端线程上,最大的延迟开销是Docker NAT,然后是KVM,然后是Docker主机/本地主机之间的粗略关系。

仅仅因为这是一篇非常有用的论文,所以这里还有其他一些数字。请下载以获得完全访问权限。
看一下磁盘I / O:

现在查看CPU开销:

现在来看一些内存示例(有关详细信息,请阅读纸张,内存可能会更加棘手):

--net=host两个破折号)和-p 8080:8080(小写的'p')用于NAT。
                    Docker本身不是虚拟化的,而是基于内核对不同进程名称空间,设备名称空间等的支持的一种抽象。一个命名空间本质上并不比另一个命名空间昂贵或效率低下,因此,实际上使Docker对性能产生影响的是这些命名空间中实际存在的问题。
Docker在如何为其容器配置名称空间方面的选择是有成本的,但是这些成本都直接与收益相关联—您可以放弃它们,但这样做还可以放弃相关的收益:
依此类推。这些成本实际上对您的环境有多大影响,包括您的网络访问模式,内存限制等,这是一个很难提供通用答案的项目。
这里的一些基准为Docker based memcached server与host native memcached server使用Twemperf基准测试工具https://github.com/twitter/twemperf与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_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
              avg 200.5 min 0.6 max 263.2 stddev 73.85