我正在研究python脚本来衡量对DNS服务器的响应时间以及从Web服务器获取数据的响应时间。
我采取的方法如下
我首先调用函数A,然后在代码中调用函数B.
解决方案运行正常,但我怀疑这是否是正确的方法。
原因是,DNS查询被调用两次(一次在函数A&然后在函数B中)。因此,函数B中的DNS查找时间总是小于函数A中计算的时间。
功能A代码
startTime = datetime.datetime.now()
ip = socket.gethostbyname(host)
endTime = datetime.datetime.now()
diff = (endTime - startTime).total_seconds() * 1000
功能B代码
resp = subprocess.popen(['ping','-c 3','host.com'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
out,err = resp.communicate()
由于
答案 0 :(得分:1)
DNS查询被调用两次(一次在函数A&然后在函数B中)。
您可以使用gethostbyname()
为后续HTTP请求返回的IP地址来消除此问题。
如果您愿意,还可以将HTTP请求的时间分配为协议握手所需的时间,以及传输返回数据所需的时间。对于以下代码...
import socket
import time
import urllib2
hostname = 'stackoverflow.com'
dns_start = time.time()
ip_address = socket.gethostbyname(hostname)
dns_end = time.time()
url = 'https://%s/' % ip_address
req = urllib2.Request(url)
req.add_header('Host', hostname)
handshake_start = time.time()
stream = urllib2.urlopen(req)
handshake_end = time.time()
data_start = time.time()
data_length = len(stream.read())
data_end = time.time()
print 'DNS time = %.2f ms' % ((dns_end - dns_start) * 1000)
print 'HTTP handshake time = %.2f ms' % ((handshake_end - handshake_start) * 1000)
print 'HTTP data time = %.2f ms' % ((data_end - data_start) * 1000)
print 'Data received = %d bytes' % data_length
......我明白了......
DNS time = 1.77 ms
HTTP handshake time = 170.66 ms
HTTP data time = 315.76 ms
Data received = 242817 bytes
请注意,握手时间包括TCP握手,SSL握手(如果适用),HTTP请求和HTTP响应标头所需的时间,但通常还包括远程服务器生成HTTP响应正文。