在使用curl异步并发请求时如果有大量域名解析会长时间阻塞程序IO,可以编译升级libcurl以支持异步DNS解析。
Centos7自带libcurl已支持异步DNS支持,不过是--enable-threaded-resolver,可以使用curl-config --configure查看curl编译参数。
查看Libcurl是否已支持异步DNS解析,包含AsynchDNS为支持:
curl --version
curl 7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.40.0 OpenSSL/1.0.1e zlib/1.2.3
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile NTLM SSL libz
首先安装异步DNS解析库c-ares:
yum install c-ares-devel openssl-devel
编译libcurl库:
wget http://curl.haxx.se/download/curl-7.40.0.tar.gz
tar zxvf curl-7.40.0.tar.gz
cd curl-7.40.0/
./configure --enable-ares --prefix=/usr/local/curl --with-ssl
make && make install
查看编译安装的curl信息,已经支持了异步DNS解析库c-ares:
/usr/local/curl/bin/curl --version
curl 7.40.0 (x86_64-unknown-linux-gnu) libcurl/7.40.0 OpenSSL/1.0.1e zlib/1.2.7 c-ares/1.10.0
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile NTLM NTLM_WB SSL libz UnixSockets
将libcurl动态库添加到动态链接库:
echo '/usr/local/curl/lib' > /etc/ld.so.conf.d/libcurl.conf
ldconfig
使用libcurl库看是否支持c-ares:
#include <curl/curl.h>
int main()
{
curl_version_info_data*info=curl_version_info(CURLVERSION_NOW);
if (info->features&CURL_VERSION_ASYNCHDNS) {
printf( "ares enabled\n");
} else {
printf( "ares NOT enabled\n");
}
return 0;
}