0

我有一个同时运行大量(大约 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 个 procs r,但它要多得多(见下文)。当我运行上面的脚本并一次触发 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% 空闲和 procs 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
4

2 回答 2

1

对于这些 curl 调用中的每一个,您都向服务器发出单独的 HTTP 请求。将MaxClients 指令设置为50一次只能处理这么多请求。

可能的解决方案:

1)如果您不需要流程输出,请不要等待:

pclose(popen('/path/to/executable', 'r'));

2) 如果不是绝对必要,不要使用子请求 - 尝试将其重写为 CGI 脚本,可以直接运行而不是发出子请求。

3)增加将在apache conf中同时处理的最大连接数:

MaxClients 256
于 2013-03-23T22:49:50.363 回答
1

我不确定,但我看到了三种可能性:

  1. 在发送其他命令之前,您的sh脚本会等待较早的命令处理
  2. 可能有点CURL问题。可能一次只能处理一些查询?
  3. Apache 无法一次处理所有请求,因此必须等待

您可以通过查看topps auxw命令输出来获得一些想法,apache记录并查看它们是如何执行的。此外,您可以在每个curl命令之后添加一些示例输出,以查看它们是否在一次运行。如果它们真的同时运行,那就是 Web 服务器问题。

于 2013-03-23T22:20:25.050 回答