2016-07-03 5 views
2

私は、DNSサーバへの応答時間とWebサーバからの取得データの応答時間を測定するためにpythonスクリプトに取り組んでいます。Python - DNSと往復時間を測定する

  1. まずmodule.Letの呼び出しにソケットを使用してこの機能をDNSルックアップ時間を測定
  2. は、次のように私が取ったアプローチは、サブプロセスモジュールにpingコマンドを使用して、Webサーバからの応答を測定します。この関数を呼び出してみましょう。

私はまず関数Aを呼び出し、次に関数Bを呼び出します。

解決策はうまくいきますが、これが正しいアプローチかどうか疑問があります。

なぜなら、DNSルックアップは2回呼び出されています(関数Bでは、関数A &で1回)。だから、関数BでDNSルックアップ時間は、常に機能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

まあ、DNS応答は、権威のある情報源ではなく、キャッシングプロキシから来る可能性が高いので、その情報が何を使用しているのかは明らかではありません。 Webページを取得するのにかかる時間を測定しようとしている場合、pingは実際にはあまり使用されません。あなたは何を達成しようとしていますか? – Aya

+0

ありがとう。私はネットワークレベルのプログラミングを自分自身で学習しようとしています。これは私が試している簡単な作業です。私は往復時間を計算するためにpingからurllibに変更しました – slysid

答えて

1
より道小さいです

DNSルックアップが2回呼び出されています(関数Bでは、関数A &で1回)。

gethostbyname()が返すIPアドレスを後続のHTTP要求に使用すると、この問題を解決できます。

必要に応じて、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 

は...私は...握手時間がTCPハンドシェイクのために必要な時間が含まれていることを

DNS time   = 1.77 ms 
HTTP handshake time = 170.66 ms 
HTTP data time  = 315.76 ms 
Data received  = 242817 bytes 

注意、SSLハンドシェイク(該当する場合)を取得します、HTTPリクエスト、およびHTTPレスポンスヘッダを含むが、通常、リモートサーバがHTTPレスポンスボディを生成するために費やした時間も含まれる。

関連する問題