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

よくわかりませんが、3つの可能性があると思います。

  1. スクリプトshは、他のコマンドを送信する前に、以前のコマンドが処理されるまで待機します
  2. 何かCURL問題があるかもしれません。一度に処理できるクエリの量は限られていますか?
  3. Apache は一度にすべてのリクエストを処理できないため、待機する必要があります。

コマンド出力、ログ、およびそれらがどのように実行されるかを確認することで、いくつtopかのアイデアを得ることができます。また、すべてのコマンドの後にサンプル出力を追加して、それらが一度に実行されているかどうかを確認できます。それらが実際に同時に実行されている場合、それは Web サーバーの問題です。ps auxwapachecurl

于 2013-03-23T22:20:25.050 に答える
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 に答える