使用Curl(和usleep)的高服务器负载

时间:2016-12-31 17:25:42

标签: php curl libcurl

在执行大量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超时)。我已经尝试过我想到的一切。这里有什么想法吗?

提前致谢。

0 个答案:

没有答案