我发现一篇有趣的文章描述了如何模拟网络问题(如丢失的数据包)在 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 。RX
TX
我想做的是在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