docker 个容器之间缺少 UDP 数据包

Missing UDP packets between docker containers

我正在开发一个项目,我需要在同一主机上的 2 个 docker 容器之间交换 UDP 数据包。主机是新的专用服务器 运行 ubuntu server 14.04LTS (Dell PowerEdge R410, 32 GB RAM, Intel Xeon CPU E5640 @ 2.67GHz).

在开发我的项目时,我注意到我在 2 个 docker 容器之间丢失数据包,因此我开发了以下场景来演示我的问题:

我在同一主机上从 ubuntu:14.04 运行 创建了 3 个 docker 容器,我们称它们为容器 #1、容器 #2 和容器 #3。 Docker 版本为 1.11.1(构建 5604cbe)。

60 秒后,容器 #1 报告发送了 2786350 个数据报。

容器 #2 报告:

Interval      Transfer      Bandwidth       Jitter   Lost/Total Datagrams
0.0-60.0 sec  3.81 GBytes   546 Mbits/sec   0.001 ms 2250/2786349 (0.081%) 

容器 #3 报告:

2770477 packets captured
2786351 packets received by filter
15874   packets dropped by kernel

所以,有几个问题:

  1. 为什么容器 #2 和 #3 不报告相同数量的接收数据包(容器 #2 少了 1 个数据报,而容器 #3 多了 1 个)?

  2. 如果这是一个受控的虚拟网络,为什么丢包的数量会有很大的不同?另外,"packets dropped by kernel"是什么意思?

  3. 为什么我一开始就丢包了?再次声明,这是一个受控的虚拟环境,没有使用任何网络设备。

提前致谢。

packets ``dropped by kernel'' (this is the number of packets that were dropped, due to a lack of buffer space, by the packet capture mechanism in the OS on which tcpdump is running, if the OS reports that information to applications; if not, it will be reported as 0).

内核将捕获的数据写入特殊缓冲区,tcpdump 从该缓冲区读取数据。如果缓冲区已满,则丢弃数据包。

网络通常比磁盘快,这意味着有时您不能只捕获所有数据包。但是由于 packed dropped 的数量很少,这不是你的情况,所以你可以执行以下操作。

  1. 增加 tcpdump 的缓冲区,-B--buffer-size 选项,大小以 KB 为单位。默认为 2048KB。
  2. sudo nice -10 tcpdump - 给 tcpdump 额外的优先级(甚至 -20)
  3. if you on linux sudo nice -10 ionice -c 1 tcpdump 附加磁盘写入优先级