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

时间:2016-05-11 10:50:40

标签: docker udp tcpdump ubuntu-server iperf

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

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

我从ubuntu创建了3个docker容器:14.04在同一主机上运行,​​让我们称它们为容器#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秒)。

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

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

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

Container#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%) 

Container#3报告:

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

所以,有几个问题:

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

  2. 如果这是受控虚拟网络,为什么丢失的数据包数量会有很大差异?此外,它意味着"内核丢弃的数据包"?

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

  4. 提前致谢。

1 个答案:

答案 0 :(得分:3)

  数据包``被内核删除'' (这是包的数量   由于缺少缓冲区空间,数据包捕获导致丢弃   如果操作系统报告,则运行tcpdump的操作系统中的机制   该信息应用程序;如果没有,它将被报告为0)。

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

网络通常比磁盘快,这意味着有时您无法捕获所有数据包。但由于打包丢弃的数量很少,因此不是这种情况,因此您可以执行以下操作。

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