在Docker容器之间缺lessUDP数据包

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

在开发我的项目的时候,我注意到我在两个docker容器之间丢包,所以我开发了下面的场景来演示我的问题:

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

  • 容器#1正在运行iperfiperf -c 225.2.2.2 -u -T 32 -t 60 -i 1 -b 700M (它产生UDP数据包并以700Mbit / sec的带宽进行60秒的多播)。

  • 容器#2正在运行iperfiperf -s -u -B 225.2.2.2 -i 1 (监听相同的多播地址)。

  • Container#3正在运行tcpdumptcpdump -i eth0 port 5001 (它正在监听端口上的Container#1将多播数据包)。

在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个较less的数据报,而容器#3有1个以上)?

  2. 为什么如果这是一个受控制的虚拟networking,丢失的数据包数量是非常不同的? 另外,这是什么意思“内核丢弃的数据包”?

  3. 为什么我首先丢失数据包? 再一次,这是一个受控的虚拟环境,没有使用networking设备。

提前致谢。

数据包由内核丢弃(这是由于缺less缓冲区空间而被丢弃的数据包的数目,如果操作系统将该信息报告给应用程序,那么由运行tcpdump的操作系统中的数据包捕获机制;如果不是,则报告为0)。

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

networking通常比磁盘快,这意味着有时你不能只捕获所有的数据包。 但是由于打包的数量很less,这不是你的情况,所以你可以做到以下几点。

  1. 增加tcpdump, -B–buffer-size选项的缓冲区大小(以KB为单位)。 默认是2048KB。
  2. sudo不错-10 tcpdump – 给予tcpdump额外的优先权(甚至-20)
  3. 如果你在linux上sudo nice -10 ionice -c 1 tcpdump附加磁盘写入优先级