5

ホスティングから CPU 負荷が高すぎるという警告が表示されるのはこれが初めてではありません。コードは、mysql クエリを使用したランダムな php スクリプトであり、空想的なものではありません。(テーブルは特別なものではなく、最大で数百行であり、要求があれば常に制限します。

0.05 秒ではなく 0.15 秒実行してもかまわないので、プロセスの優先度を制御したり、CPU 負荷を制限したりする方法はありますか?

ありがとう!

4

3 に答える 3

12

これが長時間実行されるデーモンまたはプログラムの場合は、sleep()/を追加しusleep()ます。少しスリープすると、CPU 使用率が劇的に低下します

次のコードは多くの CPU を消費します

while(...){
//do stuff
}

ここでCPUが他のタスクを実行する余地を与えていないためです。に変更します

while(...){
   //do stuff
    sleep(1);
}

これにより、CPU 使用率が大幅に低下します。CPU の 1 秒は、他のタスクを実行するのに多くの時間です。

その余分な0.1秒 ( 0.15 - 0.05) をスリープするには、usleep() を使用します。

usleep(100000);
于 2013-01-09T22:43:13.553 に答える
5

原則として、Unix システム (Linux、BSD など) では、次のようにproc_nice()関数を使用してプロセスの優先度を変更できます。

proc_nice( 20 );  // now this process has very low priority

ただし、実際にはあまり役に立たないいくつかの大きな注意事項があります。

  • PHP 7.2.0 までは、Windows ではまったくサポートされていませんでした。
  • ナイスネスを増やすことはできますが、減らすことはできません (元の値に戻すことさえできません)。
  • 快適さは PHP プロセスが終了するまで持続します。これは、PHP を FastCGI プロセスとして実行している場合、またはさらに悪いことに、Web サーバー拡張機能として実行している場合に問題になる可能性があります。
  • 上記の問題により、proc_nice()技術的にサポートできるシステムでも、セキュリティ上の理由から無効になる場合があります。

ウェブホストで許可されている場合は、長時間実行されるタスクのバックグラウンド プロセスを開始して、ウェブサーバーが実行中にリクエストを処理できるようにすることができます。nice次のように、シェル コマンドを使用してバックグラウンド プロセスの優先度を下げることもできます。

exec( "nice nohup php -f slow_script.php < /dev/null > output.txt 2>&1 &" );

スロー スクリプトが終了したら、ダウンロードしてその出力を取得できますoutput.txt

于 2013-01-09T23:14:52.010 に答える
0

Ilmari Karonenの答えに加えて:

現在のプロセスのナイスネスを増減したい場合はrenice、現在のプロセス ID と一緒に使用します。

function custom_proc_nice($priority) {

  exec("renice +$priority ".getmypid());

}

PHP プロセスが終了した後もナイスネスが持続するのを防ぎたい場合は、シャットダウン関数が必要になります。

function exit_func(){

  // Restore priority
  proc_nice(0);
}

register_shutdown_function('exit_func');

資力

http://php.net/manual/en/function.proc-nice.php

于 2015-03-30T14:07:35.880 に答える