我有一个同时运行大量(大约100个)php文件的脚本。我注意到每个脚本启动的时间经常会延迟很多。当一次触发所有脚本时,某些脚本只会在15秒后启动。
我使用以下代码同时运行这些脚本(此代码正常运行,没有任何错误)。请注意,100个php文件与同时调用它们的脚本位于同一服务器上。
function my_curl ($i, $url, $post_data, $return, $auth='', $proxy='', $timeout=5) {
$curl="/usr/bin/curl -s";
if ($post_data!='') $curl.=" --data '$post_data'";
if ($timeout!='') $curl.=" --connect-timeout $timeout";
if ($auth!='') {
list($user,$pass)=explode(':',$auth);
$curl.=" --basic --user $user:$pass";
}
if ($proxy!='') {
list($proxy_ip,$proxy_port,$proxy_user,$proxy_pass)=explode(':',$proxy);
$curl.=" --proxy $proxy_ip:$proxy_port --proxy-user $proxy_user:$proxy_pass";
}
if ($return==0) {
$curl.=" $url >/dev/null 2>/dev/null &";
} else {
$curl.=" $url >return-$i 2>/dev/null &";
}
return("$curl\n");
}
$to_run='';
for ($i=0; $i<$max; $i++) {
$url='http://www.some_url_to_the_same_server.com/post.php';
$post_data="var=web-$i";
$to_run.=my_curl($i, $url, $post_data, $return, $auth, $proxy, $timeout);
}
file_put_contents(realpath($_SERVER["DOCUMENT_ROOT"]).'/run_data/runner.sh',$to_run);
shell_exec('/bin/bash '.realpath($_SERVER["DOCUMENT_ROOT"]).'/run_data/runner.sh');
我有一个3CPU linux centos服务器。我知道我的系统不应该有超过12次触发器,但它要多得多(见下文)。当我运行上面的脚本并立即激活100个PHP脚本时,我看到下面的vmstat。
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
30 0 60 90388 14428 223996 0 0 20 10 3 10 0 0 99 1 0
当系统处于“休息”时,我得到以下输出:
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 60 155064 14672 223952 0 0 20 10 3 10 0 0 99 1 0
由于procs r显示存在CPU过载,我不明白CPU如何显示99%空闲并且同时触发r非常高。
我可以做些什么来改善我的系统性能,以便一次性触发所有100个脚本?
非常感谢您的帮助。
更新1:
这是我的httpd.conf文件的相关部分:
User apache
Group apache
KeepAlive On
KeepAliveTimeout 30
ServerAdmin admin@localhost
DocumentRoot "/var/www/html"
MaxClients 50
MaxRequestsPerChild 50
StartServers 5
MinSpareServers 5
MaxSpareServers 20
MaxKeepAliveRequests 50
答案 0 :(得分:1)
我不确定,但我看到三种可能性:
sh
脚本在发送其他CURL
个问题。可能它一次只能处理一些查询吗?您可以通过查看top
或ps auxw
命令输出,apache
日志并了解它们的执行方式来获得一些想法。此外,您可以在每个curl
命令后添加一些示例输出,以查看它们是否一次运行。如果它们真的同时运行,那就是Web服务器问题。
答案 1 :(得分:1)
对于每个curl调用,您都会向服务器发出单独的HTTP请求。将MaxClients
指令设置为50
,一次只能处理这么多请求。
可能的解决方案:
1)如果您不需要过程输出,请不要等待它:
pclose(popen('/path/to/executable', 'r'));
2)如果不是绝对必要,请不要使用子请求 - 尝试将其重写为CGI脚本,可以直接运行而不是发出子请求。
3)增加将在apache conf中同时处理的最大连接数:
MaxClients 256