2016-07-03 2 views
2

Я работаю над скриптом python для измерения времени отклика на DNS-сервер и времени отклика для получения данных с веб-сервера.Python - измерение DNS и время округления

Подход, который я принял следующее

  1. Первое измерение времени DNS поиск с помощью сокетов вызова module.Let в эту функцию
  2. Измерьте ответ от веб-сервера с помощью команды звона в модуле подпроцесса. Назовем эту функцию B

Я вызываю функцию A сначала, а затем функцию B в своем коде.

Решение работает отлично, но у меня есть сомнения, правильно ли он подходит.

Причина в том, что поиск DNS вызывается дважды (один раз в функции A &, затем в функции B). Таким образом, время DNS поиска в функции B всегда гораздо меньше, чем расчетное время в функции А.

Функция Код

   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, скорее всего, исходит от кэширующего прокси, а не от авторитетного источника, поэтому неясно, какая информация используется. Если вы пытаетесь определить, сколько времени потребуется для получения веб-страницы, пинг на самом деле не будет очень полезен. Чего вы пытаетесь достичь, точно? – Aya

+0

Спасибо. Я пытаюсь научиться программированию на уровне сети, и это простая задача, которую я пытаюсь выполнить. Я изменил с ping на urllib, чтобы вычислить время в оба конца – slysid

ответ

1

DNS-поиск вызывается дважды (один раз в функции A &, затем в функции B).

Вы можете устранить эту проблему, используя IP-адрес, возвращаемый gethostbyname() для последующего 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 

... Я получаю ...

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.