我正在开发一个项目,我需要在同一主机上的两个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正在运行iperf
:iperf -c 225.2.2.2 -u -T 32 -t 60 -i 1 -b 700M
(它生成UDP数据包,并以700Mbit / sec带宽的速度多播60秒)。
Container#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个数据报。
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
所以,有几个问题:
为什么容器#2和#3不报告相同数量的收到数据包(容器#2少1个数据报,容器#3有1个)?
如果这是受控虚拟网络,为什么丢失的数据包数量会有很大差异?此外,它意味着"内核丢弃的数据包"?
为什么我首先丢失数据包?再一次,这是一个受控的虚拟环境,没有使用任何网络设备。
提前致谢。
答案 0 :(得分:3)
数据包``被内核删除'' (这是包的数量 由于缺少缓冲区空间,数据包捕获导致丢弃 如果操作系统报告,则运行tcpdump的操作系统中的机制 该信息应用程序;如果没有,它将被报告为0)。
内核将捕获的数据写入特殊缓冲区,tcpdump从该缓冲区读取数据。如果缓冲区已满,则丢弃数据包。
网络通常比磁盘快,这意味着有时您无法捕获所有数据包。但由于打包丢弃的数量很少,因此不是这种情况,因此您可以执行以下操作。