测试Docker多主机网络性能

麦小麦秸 3年前
   <p>本文探讨Docker多主机网络的性能。</p>    <p>在过去的博文里,我测试过 <a href="/misc/goto?guid=4958988776970881197" rel="nofollow,noindex">Docker的网络</a> 。 <a href="/misc/goto?guid=4959676991964658077" rel="nofollow,noindex">MySQL服务器团队</a> 提供了他们自己的结果,和我的观察是一致的。</p>    <p>本文里一系列的测试,想更多关注使用多主机的Docker网络。因为当我们搭建高可用(HA)环境(比如,使用Percona XtraDB Cluster)时,就会期望实例运行在不同的主机上。</p>    <p>本文测试的另一个原因是Docker最近发布了1.12版本,支持Swarm Mode。Swarm Mode本身很有意思——在这个版本里,Docker决定在编排部署领域更深入,从而和Kubernetes以及Apache Mesos竞争。我认为Swarm Mode还很粗糙(毕竟是第一个版本),但是我确信Docker会在接下来的几个版本里继续优化这个特性。</p>    <p>Swarm Mode还假定用户在不同的物理主机上运行服务,并且服务通过Docker的网络通信。我想了解在多主机上使用Docker网络时性能如何。</p>    <p>网络性能对于像Percona XtraDB Cluster 和MySQL Group Replication(刚刚发布了另一个 <a href="/misc/goto?guid=4959676992058850760" rel="nofollow,noindex">Lab版本</a> )这样的集群来说尤为重要。</p>    <p>在我的环境里,使用了两台物理服务器,之间通过10GB网络连接。这两台服务器各有56个核的Intel CPU。</p>    <p>Sysbench环境:数据在内存里,仅仅使用主键查找。网络测试中网络往返很严重,但是能够更清楚得看到对性能的影响。</p>    <p>如下是Docker网络的可选方案:</p>    <p>- 没有Docker容器(在下面的结果里标记成“direct”)</p>    <p>- Docker容器使用“host”网络(标记为“host”)</p>    <p>- Docker容器使用“bridge”网络,这里服务端口通过端口转发来暴露(标记为“bridge”)</p>    <p>- Docker容器使用“overlay”网络,客户端和服务器都在通过overlay网络连接的容器里启动(结果里标记为“overlay”)。对于“overlay”网络,可以使用第三方插件,使用不同的网络实现,最知名的是:</p>    <p>- Calico network <a href="/misc/goto?guid=4959676992144099410" rel="nofollow,noindex">https://github.com/projectcalico/calico-containers</a></p>    <p>- Weave network <a href="/misc/goto?guid=4958987076517068147" rel="nofollow,noindex">https://github.com/weaveworks/weave</a></p>    <p>对于多主机网络搭建,只有“overlay”(以及插件实现)可用。我使用“direct”,“host”和“bridge”作为参考以及比对,来衡量overlay实现的额外消耗。</p>    <p>我观察到的结果如下:</p>    <p>观察</p>    <p><img src="https://simg.open-open.com/show/c0a843cc2c78a7e40dde805e3eda1b07.jpg"></p>    <ul>     <li>“Bridge”网络会增加额外消耗,大概12%,这和我之前的benchmark是一致的。但是我想知道这是Docker的额外消耗,还是Linux bridge网络实现的额外消耗。Docker应该使用的是我在《 <a href="/misc/goto?guid=4959676992239443176" rel="nofollow,noindex">在相同主机上使用Linux Network命名空间运行Percona XtraDB Cluster节点</a> 》一文里讲述的搭建方式,我怀疑Linux网络命名空间和bridge也会带来额外消耗。需要更多的测试来验证这一点。</li>     <li>原生的“Overlay”Docker网络受性能问题困扰。我用ksoftirq在一个CPU内核使用100%时观察到了问题,并且看到了类似的报告。似乎Docker“overlay”里的网络中断并没有适当分布到多个CPU里。“direct”和“bridge”配置里没有这样的问题。我认为这是Docker“overlay”网络的问题(期望这个问题最终能够解决)。</li>     <li>Weave网络结果非常糟糕。我看到了很多CPU分配给“weave”容器,因此我认为其实现有很严重的扩展性问题。</li>     <li>Calico插件在多主机容器场景下性能最佳,甚至比“bridge-bridge”网络更好。</li>    </ul>    <h3>结论</h3>    <p>如果你需要使用Docker“overlay”网络——如果想要部署多主机环境,或者使用Docker Swarm Mode,这是必须的——我推荐考虑使用Calico的Docker网络插件。原生的Docker“overlay”网络可以用来做原型设计或者快速测试,但是目前其在高端硬件上的性能有问题。</p>    <p>原文链接: <a href="/misc/goto?guid=4959676992322366822" rel="nofollow,noindex">Testing Docker multi-host network performance</a> (翻译:崔婧雯 校对:)</p>    <p>===========================</p>    <p>译者介绍</p>    <p>崔婧雯,现就职于IBM,高级软件工程师,负责IBM WebSphere业务流程管理软件的系统测试工作。曾就职于VMware从事桌面虚拟化产品的质量保证工作。对虚拟化,中间件技术,业务流程管理有浓厚的兴趣。</p>    <p> </p>    <p>来自:http://dockone.io/article/1635</p>    <p> </p>