在执行大量curl多请求时,我面临非常高的平均负载。
基本上我们有一个平台,每次访问都会有20-40个远程提要请求(低延迟,响应时间小于800毫秒)。我已经测试了平台的每个部分,唯一一个似乎造成瓶颈的是卷曲。
我们的代码如下:
foreach ($connomains as $i => $url)
{
$conn[$i] = curl_init($url);
curl_setopt($conn[$i], CURLOPT_RETURNTRANSFER, 1);
curl_setopt($conn[$i], CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($conn[$i], CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($conn[$i], CURLOPT_FORBID_REUSE,0);
curl_setopt($conn[$i], CURLOPT_FRESH_CONNECT, 0);
curl_setopt($conn[$i], CURLOPT_INTERFACE,$interface);
global $countrycode;
curl_setopt($conn[$i], CURLOPT_TIMEOUT_MS, 1*500 );
curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT_MS, 500 );
curl_setopt($conn[$i], CURLOPT_NOSIGNAL, 1);
curl_multi_add_handle ($mh,$conn[$i]);
}
do
{
$mrc = curl_multi_exec($mh, $active);
//usleep(1); // I've tried with a usleep here as well, no difference
}while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active and $mrc == CURLM_OK)
{
if (curl_multi_select($mh, $active) != -1)
{
do
{
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
else
{
usleep(10); // This doesn't seem to make any difference either.
}
}
我们的卷曲配置:(用c-ares构建)
curl-config --features --protocols SSL IPv6的 UnixSockets AsynchDNS NTLM NTLM_WB HTTPS代理 DICT 文件 FTP FTPS GOPHER HTTP HTTPS IMAP IMAPS POP3 POP3S SMB SMBS SMTP SMTPS TELNET TFTP
所以基本上在我们的压力测试中,发送一定量的流量后会发生什么,负载平均值超过100并且卷曲开始花费超过10秒来回复(500ms超时)。我已经尝试过我想到的一切。这里有什么想法吗?
提前致谢。