用 tc 模拟监控数据包丢失

用 tc 模拟监控数据包丢失

我发现一篇有趣的文章描述了如何模拟网络问题(如丢失的数据包)在 Linux 服务器上。

在 Ubuntu 测试虚拟机上,我检查了哪个接口用于互联网连接,它的名称为ens33.

然后我添加了一条用于tc引入丢包的规则:

$ sudo tc qdisc add dev ens33 root netem loss 30% 50% 

然后我ping跑了一会,结果和预期一样,丢了一些包:

$ ping www.google.com
...
97 packets transmitted, 84 received, 13% packet loss

ping运行时,我认为我还可以使用 来监视正在进行的数据包丢失,但它显示和ip -s link show ens33的丢弃数据包均为 0 。RXTX

我想做的是在ping运行时实时监控数据包丢失。

答案1

tc还接受一个-s参数,同义:统计。

以 root 应用于指向地址为 10.0.3.128 的 LXC 容器的 veth 链接的示例:

# echo; tc qdisc del dev vethlzYQu1 root 2>/dev/null; \
  ip neigh flush all; \
  tc qdisc add dev vethlzYQu1 root netem loss 30% 50%; \
  tc -s qdisc show dev vethlzYQu1 root; \
  ping -q -c 10 10.0.3.128; \
  tc -s qdisc show dev vethlzYQu1 root 

qdisc netem 8010: root refcnt 5 limit 1000 loss 30% 50%
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
PING 10.0.3.128 (10.0.3.128) 56(84) bytes of data.

--- 10.0.3.128 ping statistics ---
10 packets transmitted, 8 received, 20% packet loss, time 9193ms
rtt min/avg/max/mdev = 0.030/125.218/1001.185/331.084 ms
qdisc netem 8010: root refcnt 5 limit 1000 loss 30% 50%
 Sent 826 bytes 9 pkt (dropped 3, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0

这里应该发送 9+3=12 个数据包,其中 2 个丢弃的数据包来自 ping,另一个可能是重试的 ARP 请求。

如果您需要tc在 shell 中解析 的输出,最好将其 JSON 输出与 一起使用jq。例如:

# tc -s -json qdisc show dev vethlzYQu1 root | jq '.[].drops'
3

相关内容