ホスティングから CPU 負荷が高すぎるという警告が表示されるのはこれが初めてではありません。コードは、mysql クエリを使用したランダムな php スクリプトであり、空想的なものではありません。(テーブルは特別なものではなく、最大で数百行であり、要求があれば常に制限します。
0.05 秒ではなく 0.15 秒実行してもかまわないので、プロセスの優先度を制御したり、CPU 負荷を制限したりする方法はありますか?
ありがとう!
これが長時間実行されるデーモンまたはプログラムの場合は、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);
原則として、Unix システム (Linux、BSD など) では、次のようにproc_nice()
関数を使用してプロセスの優先度を変更できます。
proc_nice( 20 ); // now this process has very low priority
ただし、実際にはあまり役に立たないいくつかの大きな注意事項があります。
proc_nice()
技術的にサポートできるシステムでも、セキュリティ上の理由から無効になる場合があります。ウェブホストで許可されている場合は、長時間実行されるタスクのバックグラウンド プロセスを開始して、ウェブサーバーが実行中にリクエストを処理できるようにすることができます。nice
次のように、シェル コマンドを使用してバックグラウンド プロセスの優先度を下げることもできます。
exec( "nice nohup php -f slow_script.php < /dev/null > output.txt 2>&1 &" );
スロー スクリプトが終了したら、ダウンロードしてその出力を取得できますoutput.txt
。
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');
資力