我正在开发一个项目,我需要在同一主机上的 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)。
容器 #1 正在运行
iperf
:(iperf -c 225.2.2.2 -u -T 32 -t 60 -i 1 -b 700M
它生成 UDP 数据包并以 700Mbit/秒的带宽多播 60 秒)。容器 #2 正在运行
iperf
:(iperf -s -u -B 225.2.2.2 -i 1
监听相同的多播地址)。Container #3 正在运行
tcpdump
:(tcpdump -i eth0 port 5001
它正在侦听 Container #1 将多播数据包的端口)。
60 秒后,Container #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
所以,有几个问题:
为什么容器#2 和#3 不报告相同数量的接收数据包(容器#2 少1 个数据报,容器#3 多1 个)?
如果这是一个受控的虚拟网络,为什么丢失的数据包数量会非常不同?另外,“内核丢弃的数据包”是什么意思?
为什么我首先会丢失数据包?再一次,这是一个受控的虚拟环境,没有使用网络设备。
提前致谢。