我想测量 SNMP GET 请求的网络延迟。有一个免费的命令行工具time
可用于查找各种命令的时间统计信息。例如,它可以snmpget
按以下方式使用:
$ time snmpget -v 2c -c public 192.168.1.3 .1.3.6.1.2.1.2.2.1.10.2
IF-MIB::ifInOctets.2 = Counter32: 112857973
real 0m0.162s
user 0m0.069s
sys 0m0.005s
根据手册,统计数据包括:
调用和终止之间经过的实际时间,
用户 CPU 时间( struct tms 中的 tms_utime 和 tms_cutime 值的总和,由
times(2) 返回),
系统 CPU 时间( struct tms 中的 tms_stime 和 tms_cstime 值的总和,由
times(2) 返回)。
如您所见,这些选项都无法测量实际网络延迟时间(排除其他程序执行时间统计数据)。有什么办法吗?也许不是使用时间工具,而是使用一些内核黑客?
在我开始编写自己的程序之前,我想问一下。
谢谢,Piotr
答案1
该tcpdump(8)
程序的-ttt
标志可能正是您所需要的:
00:00:00.000031 IP haig.mdns > 224.0.0.251.mdns: 0 PTR (QM)? 1.0.168.192.in-addr.arpa. (42)
00:00:01.897031 IP haig.45240 > stackoverflow.com.www: Flags [F.], seq 866615166, ack 62506321, win 123, options [nop,nop,TS val 6026371 ecr 419296939], length 0
00:00:00.000030 IP haig.45242 > stackoverflow.com.www: Flags [F.], seq 853537650, ack 61102072, win 123, options [nop,nop,TS val 6026371 ecr 419296939], length 0
00:00:00.000019 IP haig.45243 > stackoverflow.com.www: Flags [F.], seq 863535366, ack 62086489, win 123, options [nop,nop,TS val 6026371 ecr 419296939], length 0
行首的时间戳显示自上一个数据包以来的时间(以微秒为单位)。通过-t
在命令行中给出不同的数字,您可以获得绝对时间、自第一个数据包以来的相对时间或数据包之间的相对时间。
我刚刚展示了随机的 mdns 和 web 流量,因为这些在我的系统上很容易找到;你可以很容易地过滤 SNMP 流量,只tcpdump(8)
获取你感兴趣的数据包。(这是一个好主意,因为转储繁忙系统的所有流量可能会产生巨大的加载。)
答案2
尝试 ping:
$ ping -U 192.168.1.3
来自ping手册:
-U 打印完整的用户对用户潜伏(旧行为)。通常 ping 会打印网络往返时间,但由于 DNS 故障,该时间可能会有所不同。
答案3
运行程序,同时使用tcpdump
或捕获网络流量wireshark
。检查请求和回复的时间并进行简单的减法。