1

我正在开发一个项目,我需要在同一主机上的 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

所以,有几个问题:

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

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

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

提前致谢。

4

1 回答 1

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 额外磁盘写入优先级
于 2016-05-12T15:27:59.453 回答