Как измерить время поиска DNS в C - PullRequest
0 голосов
/ 11 июня 2018

Итак, я хочу узнать, сколько времени занимает поиск DNS в программе на Си.Я использую функцию getaddrinfo () для поиска DNS, поэтому я решил просто измерить время, которое требуется этой функции для возврата, чтобы получить время поиска DNS.Однако, похоже, это не так.У меня также есть другая программа на C, которая измеряет время поиска DNS с помощью libcurl, и обе программы возвращают разное время при поиске на одном и том же веб-сервере одновременно.

getaddrinfo () для возврата требуется только 4-5 мс, тогда как libcurlговорит мне, что поиск DNS занял в среднем 15 мс.Я проверял это как на Linux, так и на Windows, и результаты были похожими.Что-то сбивает с толку, что getaddrinfo () возвращается через ~ 15 мсек, когда я запускаю программу в режиме выпуска Visual Studio, но как только я запускаю ее из консоли в ether linux или windows, она имеет эти 4-5 мсек раз.

Кроме того, время возврата getaddrinfo остается тем же (при выполнении консоли), даже если я ищу сервер, который находится далеко, в то время как libcurl идет до 60 мс.

Я не могу придумать ничего, что можно измерить, кроме getaddrinfo ()поэтому мой вопрос заключается в том, как правильно измерить поиск DNS в C (без помощи внешних библиотек, таких как libcurl)?

Для справки здесь приведены фрагменты кода, в которых я измеряю время:

без libcurl:

    ...
    memset(&hints, 0, sizeof(hints));
    hints.ai_flags = AI_NUMERICSERV;
    if (prog->prog_ipver == 4)
        hints.ai_family = AF_INET;
    else if (prog->prog_ipver == 6)
        hints.ai_family = AF_INET6;

    struct timespec ts_dns_start, ts_dns_end, ts_dns_result;
    timespec_get(&ts_dns_start, TIME_UTC);

    e = getaddrinfo(host, port_str, &hints, &res);

    timespec_get(&ts_dns_end, TIME_UTC);
    timespec_diff(&ts_dns_start,&ts_dns_end, &ts_dns_result);
    printf("%.3lf;", (ts_dns_result.tv_nsec/(double) 1000000));
    ...

с libcurl

curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl;
CURLcode res;
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "https");
curl_easy_setopt(curl, CURLOPT_PORT, port);
curl_easy_setopt(curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); 
res = curl_easy_perform(curl);
if(res == CURLE_OK)
{
    double connect_dns;
    res = curl_easy_getinfo(curl, CURLINFO_NAMELOOKUP_TIME, &connect_dns);
    if(CURLE_OK == res)
    {
         printf("%.3lf" , connect_dns * 1000.0);
         ...

1 Ответ

0 голосов
/ 03 июля 2018

Чтобы ответить на мой собственный вопрос, проблема заключалась в том, что стандартным способом разрешения URL в libcurl был их многопоточный преобразователь, в котором первые несколько таймаутов были слишком медленными.Переключение в режим многопоточного распознавателя устранило эту проблему, и разработчики также сделали исправление на своем github для своего многопоточного распознавателя, см. https://curl.haxx.se/mail/lib-2018-06/0117.html

...