2013-04-11 2 views
0

Программа создана на C++ и индексирует веб-страницы, поэтому все домены являются случайными именами доменов из Интернета. Странная часть состоит в том, что процент dns fail/not found небольшой (> 5%).Curl slow multithreading dns

здесь РМР трассировки стека:

3886 __GI___poll,send_dg,buf=0xADDRESS,__libc_res_nquery,__libc_res_nquerydomain,__libc_res_nsearch,_nss_dns_gethostbyname3_r,gaih_inet,__GI_getaddrinfo,Curl_getaddrinfo_ex 
    601 __GI___poll,Curl_socket_check,waitconnect,singleipconnect,Curl_connecthost,ConnectPlease,[email protected]=0xADDRESS),Curl_connect,connect_host,at 
    534 __GI___poll,Curl_socket_check,Transfer,at,getweb,athread,start_thread,clone,?? 
    498 nanosleep,__sleep,athread,start_thread,clone,?? 
    50 __GI___poll,Curl_socket_check,Transfer,at,getweb,getweb,athread,start_thread,clone,?? 
    15 __GI___poll,Curl_socket_check,Transfer,at,getweb,getweb,getweb,athread,start_thread,clone 
     7 nanosleep,usleep,main 

Почему так много потоков в _nss_dns_gethostbyname3_r? Что я могу сделать, чтобы ускорить это.

Может ли это быть потому, что я использую синхронный DNS-рекордер по умолчанию curl с CURLOPT_NOSIGNAL?

Программа работает на Intel I7 (8 ядер HT), 16 ГБ оперативной памяти, Ububtu 12.10.

Полоса пропускания варьируется от 6 Мбит/с (предел ISP) -> 2 МБ/с при нерегулярном интервале, и иногда она даже падает до нескольких 100 КБ/с.

ответ

0

Я обнаружил, что решение было изменить локон Dns распознавателя по умолчанию c-ares и специально попросить ipv4 в ipv6 пока не поддерживаются моей сетью.

Изменение на c-ares также позволило мне добавить дополнительные серверы dns и окружить их, чтобы улучшить количество запросов/запросов DNS.

Результат:

//set to ipv4 only 
curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); 

//cicle dns Servers 
dns_index=DNS_SERVER_I; 
pthread_mutex_lock(&running_mutex); 
    if(DNS_SERVER_I>DNS_SERVERS.size()) 
    { 
     DNS_SERVER_I=1; 
    }else 
    { 
     DNS_SERVER_I++; 
    } 
pthread_mutex_unlock(&running_mutex); 

string dns_servers_string=DNS_SERVERS.at(dns_index%DNS_SERVERS.size())+","+DNS_SERVERS.at((dns_index+1)%DNS_SERVERS.size())+","+DNS_SERVERS.at((dns_index+2)%DNS_SERVERS.size()); 

// set curl DNS (option available only when curl is built with c-ares) 
curl_easy_setopt(curl, CURLOPT_DNS_SERVERS, &dns_servers_string[0]); 
1

Темы, которые вы видите, вероятно, ждут ответа DNS. Одним из способов ускорения этого было бы сделать предварительный поиск, поэтому они будут кэшироваться на вашем рекурсивном DNS-сервере соседа. Также убедитесь, что никто не просит авторитарных ответов, что is slow always.

+0

Все настройки по умолчанию, я добавил несколько серверов DNS и установить их вращаться. Я тестировал систему до 2000 запросов DNS, и все это хорошо, но кажется, что завиток может обрабатывать dns по-разному. Как я могу узнать, спрашивает ли завиток авторитетные ответы? также я могу указать, чтобы не запрашивать IPV6 (AAAA), поскольку моя сеть еще не поддерживает его. –

+0

Что такое «соседний рекурсивный DNS-сервер»? также вы могли бы расширить метод поиска заранее? –