0

该程序是用 C++ 编写的,它对网页进行索引,因此所有域都是来自网络的随机域名。奇怪的是dns fail/not found百分比很小(> 5%)。

这是 pmp 堆栈跟踪:

   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,protocol_done=protocol_done@entry=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?我该怎么做才能加快速度。

可能是因为我使用 curl 的默认同步 DNS 解析器CURLOPT_NOSIGNAL吗?

该程序在英特尔 I7(8 核 HT)、16GB 内存、Ububtu 12.10 上运行。

带宽从 6MB/s(ISP 限制)-> 2MB/s 不定期变化,有时甚至会下降到 100KB/s。

4

2 回答 2

1

您看到的线程可能正在等待 DNS 答案。一种加快速度的方法是事先进行查找,因此它们会缓存在您的邻居递归 DNS 服务器中。还要确保没有人要求自动回答,这总是慢。

于 2013-04-11T22:24:34.673 回答
0

我发现解决方案是将默认 curl 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]);
于 2013-04-23T09:25:27.817 回答