docker 个容器之间缺少 UDP 数据包
Missing UDP packets between docker containers
我正在开发一个项目,我需要在同一主机上的 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 秒后,容器 #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 个)?
如果这是一个受控的虚拟网络,为什么丢包的数量会有很大的不同?另外,"packets dropped by kernel"是什么意思?
为什么我一开始就丢包了?再次声明,这是一个受控的虚拟环境,没有使用任何网络设备。
提前致谢。
packets ``dropped by kernel'' (this is the number of packets that were
dropped, due to a lack of buffer space, by the packet capture
mechanism in the OS on which tcpdump is running, if the OS reports
that information to applications; if not, it will be reported as 0).
内核将捕获的数据写入特殊缓冲区,tcpdump 从该缓冲区读取数据。如果缓冲区已满,则丢弃数据包。
网络通常比磁盘快,这意味着有时您不能只捕获所有数据包。但是由于 packed dropped 的数量很少,这不是你的情况,所以你可以执行以下操作。
- 增加 tcpdump 的缓冲区,-B 或 --buffer-size 选项,大小以 KB 为单位。默认为 2048KB。
- sudo nice -10 tcpdump - 给 tcpdump 额外的优先级(甚至 -20)
- if you on linux sudo nice -10 ionice -c 1 tcpdump 附加磁盘写入优先级
我正在开发一个项目,我需要在同一主机上的 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 秒后,容器 #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 个)?
如果这是一个受控的虚拟网络,为什么丢包的数量会有很大的不同?另外,"packets dropped by kernel"是什么意思?
为什么我一开始就丢包了?再次声明,这是一个受控的虚拟环境,没有使用任何网络设备。
提前致谢。
packets ``dropped by kernel'' (this is the number of packets that were dropped, due to a lack of buffer space, by the packet capture mechanism in the OS on which tcpdump is running, if the OS reports that information to applications; if not, it will be reported as 0).
内核将捕获的数据写入特殊缓冲区,tcpdump 从该缓冲区读取数据。如果缓冲区已满,则丢弃数据包。
网络通常比磁盘快,这意味着有时您不能只捕获所有数据包。但是由于 packed dropped 的数量很少,这不是你的情况,所以你可以执行以下操作。
- 增加 tcpdump 的缓冲区,-B 或 --buffer-size 选项,大小以 KB 为单位。默认为 2048KB。
- sudo nice -10 tcpdump - 给 tcpdump 额外的优先级(甚至 -20)
- if you on linux sudo nice -10 ionice -c 1 tcpdump 附加磁盘写入优先级