具有主机networking的Docker容器的networking性能非常低

我遇到了Docker容器和主机networking之间的networking性能不佳的问题。 我在Docker的论坛上问了这个问题,但到目前为止还没有收到答案。

问题

设置:同一本地networking上的两台Mac; 第一个运行MQTT经纪人(mosquitto); 第二个运行Mac的Docker。 两台C ++程序在第二台Mac上运行,并使用Paho MQTT C库通过MQTT代理(第一台Mac)多次交换数据。

本机运行:当我本机运行两个C ++程序时,networking性能非常好,如预期的那样。 这些程序是用XCode 7.3编译的。

Docker运行:当我在Docker中运行任一C ++程序或两者时,networking性能急剧下降,大约比本机运行慢30倍。 Docker镜像基于ubuntu:latest,程序由gcc(Ubuntu 5.4.0-6ubuntu1〜16.04.1)5.4.0 20160609构build。

我试图使用主机networking( – 在Docker运行–network =“主机”),但没有帮助。 我也尝试在第二台Mac上运行MQTT代理(以便代理和容器在同一台主机上运行); 问题依然存在。 我的工作局域网和家庭networking上都存在这个问题。

从理论上讲,Docker容器中的C ++程序一般来说可能会很慢。 但是我怀疑是这样的,因为根据我的经验,Docker中C ++代码的一般性能和本地环境一样快。

造成这个问题的原因是什么? 在Docker中有没有可以解决这个问题的设置?

Mac上的虚拟化层的开销虽然比它更好,但仍将增加任何networking的成本。 当使用VirtualBox 20-30x的惩罚并不less见。 他们确实说过,从testing版11开始,NFS已经得到了支持,并不完全确定如何确保它使用它: https : //docs.docker.com/docker-for-mac/release-notes/#/beta-11-release- 2016-05-10-1-11-1-beta11

我怀疑容器的内存和CPU的默认分配可能不是您尝试实现的那种networking性能的最佳select。

  1. 使用标准工具(如top,htop,strace等)调查容器内资源的使用情况。或者,当这些实例处于峰值操作时,您可以使用docker stat命令$ docker stats node1 node2 CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O node1 0.07% 796 KB/64 MB 1.21% 788 B/648 B node2 0.07% 2.746 MB/64 MB 4.29% 1.266 KB/648 B
  2. 那么你可能想要修改docker run可用的各种资源分配参数。 在这里输入图像说明

    1. 编辑:另一件要检查的将是实际系统接口的MTU和泊坞接口上的设置。 使用--mtu=BYTES来设置您的--mtu=BYTES值的MTU以匹配您的系统接口的MTU值