LinuxでOSパラメーターを変更してC++プログラムをより遅く実行する方法はありますか?このようにして、特定のプログラムが実際に遅いマシンで実行された場合に何が起こるかをシミュレートしたいと思います。
つまり、高速のマシンは、その特定のプログラムに対して低速のマシンとして動作する必要があります。
Nice
(および/または renice
)を使用して優先順位を下げます。また、 Nice()
システムコールを使用してプログラムで実行することもできます。これにより、実行速度自体が遅くなることはありませんが、Linuxスケジューラの実行時間フレームの割り当てが少なくなり(場合によっては短くなります)、より頻繁にプリエンプトされます。[Linuxの理解]の プロセススケジューリングスケジューリングの詳細については、Kernel 。cpufreq-set
_ コマンドを使用するCPU。sched_yield()
を呼び出すことです。これにより、プログラムのパフォーマンスが重要な部分で他のプロセスにクォンタムが生成されます(コード変更が必要)。malloc()
、free()
、clock_gettime()
などの一般的な関数をフックできます。 _rep; hop;
_で数百万CPUサイクルを燃やす、メモリバリアを挿入するなど。これにより、プログラムの速度が確実に低下します。 (このようなことを行う方法の例については、 この回答 を参照してください)。-O0
_およびアサーションを有効にすると(つまり_-DDEBUG
_))、ある程度の遅延が発生する可能性があります。それが役に立てば幸い。
[〜#〜] qemu [〜#〜] はLinux用のCPUエミュレーターです。 Debianにはそのためのパッケージがあります(ほとんどのdistrosが想像します)。エミュレータでプログラムを実行でき、それらのほとんどは速度の低下をサポートするはずです。たとえば、 Miroslav Novak にはQEMUを遅くするパッチがあります。
または、別のCPU-linux(arm-none-gnueabi-linuxなど)にクロスコンパイルし、QEMUでそのコードを変換して実行することもできます。
Niceの提案は単純であり、CPUを消費する別のプロセスと組み合わせると機能する場合があります。
Nice -19 test &
while [ 1 ] ; do sha1sum /boot/vmlinuz*; done;
グラフィック、ファイル、ネットワークI/Oが必要かどうかは言わなかったのですか?探しているエラーのclassについて何か知っていますか?それは競合状態ですか、それとも顧客サイトでコードのパフォーマンスが悪いだけですか?
編集:[〜#〜] stop [〜#〜]および[〜#〜] cont [〜#〜]は、プログラムを開始および停止します。デバッガーもこれを行うことができます。問題は、コードがfull speedを実行してから停止することです。 Linuxスケジューラを使用するほとんどのソリューションには、この問題があります。 Intel afairのある種のスレッドアナライザーがありました。 Vtuneリリースノート と表示されます。これはVtuneですが、スレッドの競合を分析する別のツールがあると確信していました。 Intel Thread Checker を参照してください。これは、いくつかのスレッドの競合状態を確認できます。しかし、アプリがマルチスレッドかどうかはわかりませんか?
cpulimit
を使用します。
Cpulimitは、プロセスのCPU使用率を制限するツールです(CPU時間ではなく、パーセンテージで表されます)。 CPUサイクルを過剰に消費させたくない場合は、バッチジョブを制御すると便利です。目標は、指定された時間比を超えてプロセスが実行されるのを防ぐことです。 Nice値や他のスケジューリング優先度設定は変更しませんが、実際のCPU使用率は変更します。また、システム全体の負荷に動的にかつ迅速に適応することができます。
使用されるCPU量の制御は、プロセスにSIGSTOPおよびSIGCONT POSIXシグナルを送信して行われます。
指定されたプロセスのすべての子プロセスとスレッドは、CPUの同じ割合を共有します。
Ubuntuリポジトリにあります。ただ
apt-get install cpulimit
既に実行中のプログラムでそれを使用する方法の例を次に示します。
プロセス 'bigloop'を実行可能ファイル名で40%CPUに制限します。
cpulimit --exe bigloop --limit 40 cpulimit --exe /usr/local/bin/bigloop --limit 40
プロセスをPIDで55%CPUに制限します。
cpulimit --pid 2960 --limit 55
プログラムをシミュレートして、非常に遅いマシンでの動作を分析する場合は、プログラム全体を他のメインプログラムのthread
として実行するを試すことができます。
この方法で、一度に少数のスレッドで同じコードを異なる優先順位で優先順位付けし、分析のデータを収集できます。これをフレーム処理分析のゲーム開発で使用しました。
スリープを使用するか、コード内で待機します。これは最も明るい方法ではありませんが、さまざまな速度のあらゆる種類のコンピューターで受け入れられます。
最も簡単な方法は、メインの実行可能コードをwhileループでラップし、最後にスリープ状態にすることです。
例えば:
void main()
{
while 1
{
// Logic
// ...
usleep(microseconds_to_sleep)
}
}
人々が言及するように、ロジックコードは通常の速度で実行されますが、実行の間に遅延が生じるため、これは最も正確な方法ではありません。また、ロジックコードはループで実行されるものであると想定しています。
しかし、それはシンプルでありながら設定可能です。