Linux で OS パラメータを変更して C++ プログラムの実行を遅くする方法はありますか? このようにして、その特定のプログラムが実際に遅いマシンで実行された場合にどうなるかをシミュレートしたいと思います。
言い換えれば、高速なマシンは、その特定のプログラムに対して低速なマシンとして動作する必要があります。
nice
(および/または)を使用して優先順位を下げrenice
ます。nice()
システムコールを使用してプログラムで行うこともできます。これにより、実行速度自体が遅くなることはありませんが、Linux スケジューラが割り当てる実行時間フレームが少なくなり (場合によっては短くなり)、より頻繁にプリエンプトされるようになります。スケジューリングの詳細については、Linux カーネルの理解のプロセス スケジューリング (第 10 章) を参照してください。 .cpufreq-set
ます。sched_yield()
、プログラムのパフォーマンスが重要な部分で、他のプロセスにクォンタムを生成する を呼び出すことです (コードの変更が必要です)。malloc()
、などの一般的な関数をLD_PRELOADfree()
を使用してフックし、で数百万の CPU サイクルを焼き付けたり、メモリ バリアを挿入したりするなどのばかげたことを行うことができます。これにより、プログラムが確実に遅くなります。(このことのいくつかを行う方法の例については、この回答を参照してください)。clock_gettime()
rep; hop;
-O0
最適化を無効にして (つまり、アサーションを有効にして)バイナリを再コンパイルすることで、いくらか遅くなることがあります-DDEBUG
。それが役に立てば幸い。
QEMU は Linux 用の CPU エミュレーターです。Debian にはそのためのパッケージがあります (ほとんどのディストリビューションにはパッケージがあると思います)。エミュレーターでプログラムを実行できますが、それらのほとんどは速度低下をサポートする必要があります。たとえば、 Miroslav Novakには、QEMU を遅くするパッチがあります。
または、別の CPU-linux (arm-none-gnueabi-linux など) にクロス コンパイルしてから、QEMU にそのコードを変換して実行させることもできます。
素敵な提案はシンプルで、CPU を消費する別のプロセスと組み合わせるとうまくいくかもしれません。
nice -19 test &
while [ 1 ] ; do sha1sum /boot/vmlinuz*; done;
グラフィックス、ファイル、および/またはネットワーク I/O が必要かどうかについて、あなたは言いませんでしたか? 探しているエラーのクラスについて何か知っていますか? 競合状態ですか、それとも顧客サイトでのコードのパフォーマンスが悪いだけですか?
編集: STOPやCONT などの信号を使用して、プログラムを開始および停止することもできます。デバッガーでもこれを行うことができます。問題は、コードがフル スピードで実行されてから停止することです。Linux スケジューラを使用するほとんどのソリューションには、この問題があります。 Intel からのある種のスレッド アナライザーがありました。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)
}
}
人が言うように、これは最も正確な方法ではありません。なぜなら、ロジック コードは通常の速度で実行されますが、実行の間に遅延が生じるからです。また、ロジック コードがループで実行されるものであると想定しています。
しかし、それはシンプルで構成可能です。