Php 为什么等待运行时的进程数很高,但我的CPU 99%空闲?

Php 为什么等待运行时的进程数很高,但我的CPU 99%空闲?,php,linux,apache,Php,Linux,Apache,我有一个脚本,可以同时运行大量(大约100个)php文件。我注意到每一个脚本开始的时间经常被延迟很多。当一次启动所有脚本时,某些脚本只会在15秒后启动 我使用下面的代码同时运行这些脚本(此代码运行时没有任何错误)。请注意,100个php文件与同时调用它们的脚本位于同一服务器上 function my_curl ($i, $url, $post_data, $return, $auth='', $proxy='', $timeout=5) { $curl="/usr/bin/curl -s";

我有一个脚本,可以同时运行大量(大约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');
当系统处于“rest”状态时,我得到以下输出:

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

我不确定,但我认为有三种可能性:

  • 您的
    sh
    脚本等待,而先前的命令在发送其他命令之前进行处理
  • 可能是一些
    CURL
    问题。也许它一次只能处理一些查询
  • Apache无法同时处理所有请求,因此它们必须等待

  • 您可以通过查看
    top
    ps auxw
    命令输出、
    apache
    日志了解它们的执行方式,从而获得一些想法。此外,您还可以在每个
    curl
    命令之后添加一些示例输出,以查看它们是否在同一时间内运行。如果它们确实同时运行,这是web服务器的问题。

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

    可能的解决办法:

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

    pclose(popen('/path/to/executable', 'r'));
    
    2) 如果不是绝对必要,不要使用子请求-尝试将其重写为CGI脚本,这样可以直接运行,而不是发出子请求

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

    MaxClients 256
    

    您的apache是如何配置的?如果您抛出的并发请求比工作线程多,那么会有一些争论。@SirDarius我在问题中展示了我的httpd.conf文件。
    MaxClients 256