0

このプログラムは C++ で作成され、Web ページのインデックスを作成するため、すべてのドメインは Web からのランダムなドメイン名です。奇妙な点は、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でしょうか?

プログラムは Intel I7 (8 コア HT)、16GB RAM、Ububtu 12.10 で実行されています。

帯域幅は 6MB/s (ISP の制限) から 2MB/s まで不規則な間隔で変化し、時には数 100KB/s まで低下することさえあります。

4

2 に答える 2

0

解決策は、デフォルトのcurl dnsリゾルバーをに変更し、ネットワークでまだサポートされていないため、c-ares具体的に要求することであることがわかりました。ipv4ipv6

に変更する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 に答える