我有一个 ESXi VM,它在我们的网络上的大约 700 个设备上执行命令。它正在使用Expect
,并且由于这些设备的年限,它们的性能会下降。这两者不能很好地混合在一起 - 因为 Expect 脚本必须等待很长时间才能获得输出才能继续。
为了避免这种情况,我们的团队决定ping
在连接到设备之前进行测试。如果出现丢包,我们稍后再讨论。
我们遇到的问题是我们的 ping 测试如下所示:
loss=`ping -i 0.2 -w 2 $1 | grep "packet loss" | awk '{print $6}'`
loss=${loss%?}
echo "$loss"
两秒内 10 次 ping - 但我们得到很多9% 的丢包响应。例如我们通常有74/700由于丢包检测,测试会提前退出。39/74这些报告中9%,而其余的则以 10 的倍数报告。
据我们所知,这实际上没有意义。有 10 个数据包正在发送...如果其中一个数据包丢失,则损失为 10%。这种情况很少被观察到,但确实发生了。是否有可能是内存中发生了某些事情导致了数字 9 的出现?如果这些是数据包丢失的合法实例,那么这对我们来说是个大新闻。
答案1
有多个 ping 版本。有些人可以-w
选择。有些人接受但没有记录。在某些版本的 ping 中,会发生这种情况:
$ ping -i 0.2 -w 2 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.091 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.091 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.089 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.086 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.088 ms
64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.097 ms
64 bytes from 127.0.0.1: icmp_seq=6 ttl=64 time=0.091 ms
64 bytes from 127.0.0.1: icmp_seq=7 ttl=64 time=0.095 ms
64 bytes from 127.0.0.1: icmp_seq=8 ttl=64 time=0.095 ms
64 bytes from 127.0.0.1: icmp_seq=9 ttl=64 time=0.092 ms
--- 127.0.0.1 ping statistics ---
11 packets transmitted, 10 packets received, 9% packet loss
round-trip min/avg/max/stddev = 0.086/0.091/0.097/0.000 ms
也就是说:发出一个数据包,时间到期后就永远不会被接收回来。
因此:1 包 11 件丢失,即 9% 的损失。
对于这些 ping 版本,添加一个-c
选项应该可以解决问题:
$ ping -i 0.2 -c 10 -w 5 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.127 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.096 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.088 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.084 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.084 ms
64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.093 ms
64 bytes from 127.0.0.1: icmp_seq=6 ttl=64 time=0.089 ms
64 bytes from 127.0.0.1: icmp_seq=7 ttl=64 time=0.089 ms
64 bytes from 127.0.0.1: icmp_seq=8 ttl=64 time=0.087 ms
64 bytes from 127.0.0.1: icmp_seq=9 ttl=64 time=0.094 ms
--- 127.0.0.1 ping statistics ---
10 packets transmitted, 10 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.084/0.093/0.127/0.000 ms
这意味着:每 0.2 秒尝试一次数据包,直到收到 10 个数据包或直到 5 秒的时间限制过去。