CPU負荷生成ツールを作成しようとしています。私の入力は0〜100の数値になります。負荷を計算するために時間関数を使用しており、負荷を確認しています。負荷が望ましい値を超えた場合、プロセスをスリープさせようとします。私が直面している問題は、500 ミリ秒以上の期間だけ、必要な負荷が得られるということです。それ以下ではありません。「top」というツールの負荷をチェックしています。トップの期間を短縮しようとすると。負荷変動を観察します。プロセスを 1 ミリ秒以下でスリープ状態にする方法はありますか。
5 に答える
この質問に linux-kernel というタグを付けたので、Linux スケジューラーに関する具体的な詳細についてお答えします...
簡単な答え: いいえ、1 ミリ秒未満でスリープすることはできません。これはスケジューラーの解像度であるためです。つまり、カーネルはミリ秒ごとにウェイクアップして、スケジュールするプロセスを決定しているため、それよりも短い時間でスリープすることはできません。
長い答え: Linux 用の CPU 負荷ジェネレーターの設計は、複数の出版物に値するほど複雑なテーマでした。詳細については、Google Scholarでcpu burnerおよびcpu load generatorという用語を試してみてください。現在最も効率的な方法の 1 つは、それを行わないことです。最近のカーネルの cgroups 機能には CPU 帯域幅の制限があります。つまり、他のプロセスが利用できる CPU 時間を制限するためにコードを実行する必要はありません。
いいえ、nanosleep は、プロセスが停止することを保証するものではなく、クロックが少なくとも要求した時間だけ進んだことのみを保証します。
OSのタイマーは、常に信頼性が高く、正確であるとは限りません。通常、OSタイマーはほとんどの用途に非常に適しています。ただし、高解像度のティックを取得する場合は、次の手順を実行する必要があります。1、システムハードウェアを確認します。つまり、タイマージェネレーターがハードウェアタイマー割り込みを提供できるかどうかを確認します。2、OSシステムをチェックし、他のプロセス/スレッドまたはデバイスがハードウェアタイマー割り込みをマスクしないことを確認します。また、可能であれば、タイマーデバイスの割り込みを登録し、タイマー値を希望の時間に調整します。3、同時に、cputimeは、時間の変動と精度をチェックするために設計された割り込みを取得するときの参照としても使用されます。それを行うには、技術を使用することをお勧めします。Nanosleepはどういうわけかあなたの望み通りに機能しませんでした。
nanosleep(2)がありますが、スケジューリングのため、プロセスが正確に要求された時間をスリープするという保証はありません。これをrenice(8)と組み合わせて使用して 、プロセスをより高い優先度に設定することもできます。
500ms という短い時間枠で一定の CPU 負荷を生成することは不可能だと思います。CPU は、数学的な観点からモデル化するのが難しい動的システムであると考えてください。できることは、到達したいターゲットに平均して一致する CPU 負荷を生成することです。
たとえば、この単純なスクリプトhttps://github.com/GaetanoCarlucci/CPULoadGeneratorは、PID レギュレーターを使用して CPU コアの「スリープ時間」を制御し、平均して目的の CPU 負荷を達成します。
ここでは、CPU コア 0 で 50% の負荷が生成されるダイナミクスの例を確認できます。
過渡時間が 500 ミリ秒を超えていることがわかります。
nanosleep
関数を使用します。少なくとも指定されたナノ秒の解像度の期間、呼び出し元のスレッドの一時停止を要求します。