共有 *NIX サーバー (Site5 が実行) で実行しています。バックグラウンドで時折オフライン計算を実行するphpスクリプトがあります。実行中は約 100% の CPU を使用します。私は次のようにナイスしてみました:
nice -n 19 php script.php
しかし、それは何の違いもないようです。
コードを通じて usleep ( int $micro_seconds ) を分散させることができます。これにより、スクリプトが一時的に停止し、CPU が他のことのために解放されます。
しかし、それは必要でしょうか?スクリプトの優先度が低い場合、それが CPU の 100% を使用していることは重要ですか...優先度の高い他のプロセスが必要な場合、CPU は必要な時間を取得できず、スクリプトは残りを取得します (最大100%)?
たとえ利用可能であれば、CPU を 100% 使用します。ただし、カーネルは、発生する他の (Nice ではない) プロセスを優先します。
システムの応答性が高く、実行中に他の作業を実行できる限り、私は心配しません。システムで分散コンピューティング クライアントを実行していますが、使用可能な CPU サイクルをすべて消費しています。最も低い優先度で実行されるため、他のすべてのプロセスが必要に応じてプリエンプトします。
コンテキストスイッチにかなりのプロセスがある場合、phpが100%CPUになる頻度を変更しますが、その量は変更しません。
プログラムがシステムコールを実行した瞬間、カーネルは実際のジョブを実行する前にCPUを別のプロセスに譲ることができます。フルスピードで実行している場合、PHPはシステムコールを行わないようです。つまり、ブロッキングI / O(ソケット、ファイルなど)を作成していません。コードブロックがビジーウェイトでスタックしていないかどうかを確認します。
プロセスがバックグラウンドであり、CPU を 100% 使用しているため、プロセスが CPU バウンドのようです。これはバックグラウンドであるため、ユーザー バウンドは想定されないため、唯一の代替手段は IO バウンドです。プロセスが実際に興味深い IO を行うべきではない場合、スクリプト自体はバグがあるだけでなく、CPU バウンドであると予想されます。
プロセスは常に可能な限り速く進めようとします。IO バウンドの場合は 100% の IO を使用し、CPU バウンドの場合は 100% の CPU を使用しようとします。適切に作成されたプロセス スケジューラは、すべてのプロセスに公平感を与えることを自動的に目指します。つまり、大きなプロセスほど優先度が低くなります。nice を使用すると、優先度をさらに下げることができます。CPU 使用率がまだ約 100% であるという事実は、現在 CPU バウンドになっている他のプロセスがなく、ネットワークからの入力を待っている可能性が高いことを意味します。