首页 文章

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

提问于
浏览
377

我'd like to comprehensively understand the run-time performance cost of a Docker container. I'已找到对networking anecdotally being ~100µs slower的引用 .

我还发现运行时成本的参考值“可以忽略不计”和“接近于零”,但我想更准确地了解这些成本是多少 . 理想情况下,我想知道Docker正在以性能成本和抽象的东西进行抽象而没有性能成本 . 网络,CPU,内存等

此外,如果存在抽象成本,是否有办法绕过抽象成本 . 例如,也许我可以在Docker中直接安装磁盘 .

3 回答

  • 70

    Docker不是内核之上的抽象's support for different process namespaces, device namespaces, etc.; one namespace isn' t本质上比另一个更昂贵或效率更低,因此实际上使Docker产生性能影响的是这些命名空间中实际存在的问题 .


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

    • 分层文件系统很昂贵 - 确切地说每个文件系统的成本各不相同(而Docker支持多个后端),并且使用您的使用模式(合并多个大型目录,或合并一组非常深的文件系统将特别昂贵),但是他们的功能 - 能够以书写形式的方式与其他客人 Build 客人,并且隐含相同的存储优势 - 支付这笔费用 .

    • DNAT在规模上变得昂贵 - 但是为您提供了能够配置您的guest 's networking independently of your host'并且具有方便的接口以便仅转发它们之间所需的端口的好处 . 您可以将其替换为物理接口的桥接器,但同样会失去优势 .

    • 能够以最方便的方式运行每个软件堆栈及其依赖项 - 独立于主机's distro, libc, and other library versions -- is a great benefit, but needing to load shared libraries more than once (when their versions differ) has the cost you' d expect .

    等等 . 这些成本在您的环境中实际影响了多少 - 使用您的网络访问模式,内存限制等 - 是一个难以提供通用答案的项目 .

  • 15

    使用Twemperf基准工具https://github.com/twitter/twemperf以及5000个连接和20k连接速率,使用 Docker based memcached server 对比 host native memcached server 更多benchmarks

    基于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
    

    这是bencmarks using memtier benchmark tool

    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
    
  • 341

    Here是由Felter等人撰写的2014年IBM研究论文题为"An Updated Performance Comparison of Virtual Machines and Linux Containers"的优秀论文 . 它提供了裸机,KVM和Docker容器之间的比较 . The general result is that 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 ),该容器将与 Native 列完全相同(如Redis延迟结果中所示) .

    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

相关问题