web-dev-qa-db-ja.com

プログラムをゆっくり実行する

LinuxでOSパラメーターを変更してC++プログラムをより遅く実行する方法はありますか?このようにして、特定のプログラムが実際に遅いマシンで実行された場合に何が起こるかをシミュレートしたいと思います。

つまり、高速のマシンは、その特定のプログラムに対して低速のマシンとして動作する必要があります。

102
RoboAlex
  • Nice (および/または renice )を使用して優先順位を下げます。また、 Nice() システムコールを使用してプログラムで実行することもできます。これにより、実行速度自体が遅くなることはありませんが、Linuxスケジューラの実行時間フレームの割り当てが少なくなり(場合によっては短くなります)、より頻繁にプリエンプトされます。[Linuxの理解]の プロセススケジューリングスケジューリングの詳細については、Kernel
  • タイマー割り込み頻度を増やす を使用して、カーネルにより多くの負荷をかけることができます。すべてを遅くします。これにはカーネルの再構築が必要です。
  • CPU Frequency Scaling メカニズム(カーネルモジュールが必要)および制御(スローダウン、スピードアップ)を使用できます。 _cpufreq-set_ コマンドを使用するCPU。
  • もう1つの可能性は、 sched_yield() を呼び出すことです。これにより、プログラムのパフォーマンスが重要な部分で他のプロセスにクォンタムが生成されます(コード変更が必要)。
  • LD_PRELOAD を使用して、malloc()free()clock_gettime()などの一般的な関数をフックできます。 _rep; hop;_で数百万CPUサイクルを燃やす、メモリバリアを挿入するなど。これにより、プログラムの速度が確実に低下します。 (このようなことを行う方法の例については、 この回答 を参照してください)。
  • @Billが述べたように、割り当てられたCPUリソースやメモリなどの量を制限できる仮想化ソフトウェアでLinuxをいつでも実行できます。
  • プログラムを本当に遅くしたい場合は、 Valgrind の下で実行してください(メモリリーク、不良メモリ参照など、アプリケーションの問題を見つけるのにも役立ちます)。
  • バイナリを再コンパイルして最適化を無効にすると(つまり_-O0_およびアサーションを有効にすると(つまり_-DDEBUG_))、ある程度の遅延が発生する可能性があります。
  • 遅いCPUでいつでも古いPCまたは安価なネットブック( One Laptop Per Child など)を購入でき、テストが終了したら子供に寄付することを忘れないでください)プログラムを実行します。

それが役に立てば幸い。

144
user405725

[〜#〜] 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 を参照してください。これは、いくつかのスレッドの競合状態を確認できます。しかし、アプリがマルチスレッドかどうかはわかりませんか?

36
artless noise

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
19
Izkata
  1. 古いコンピューターを入手する
  2. VPSホスティングパッケージは、実行速度が遅く、中断が多く、遅延が大きく異なる傾向があります。安くなればなるほど、ハードウェアは悪くなります。真に古いハードウェアとは異なり、通常は古いハードウェアにはない命令セット(SSE4)が含まれている可能性があります。とはいえ、ゆっくり歩き、頻繁にシャッターを切るシステムが必要な場合は、安価なVPSホストが最も早いスタートになります。
13
Mikhail

プログラムをシミュレートして、非常に遅いマシンでの動作を分析する場合は、プログラム全体を他のメインプログラムのthreadとして実行するを試すことができます。

この方法で、一度に少数のスレッドで同じコードを異なる優先順位で優先順位付けし、分析のデータを収集できます。これをフレーム処理分析のゲーム開発で使用しました。

3
Pervez Alam

スリープを使用するか、コード内で待機します。これは最も明るい方法ではありませんが、さまざまな速度のあらゆる種類のコンピューターで受け入れられます。

2
Alper

最も簡単な方法は、メインの実行可能コードをwhileループでラップし、最後にスリープ状態にすることです。

例えば:

void main()
{
    while 1
    {
        // Logic
        // ...
        usleep(microseconds_to_sleep)
    }
}

人々が言及するように、ロジックコードは通常の速度で実行されますが、実行の間に遅延が生じるため、これは最も正確な方法ではありません。また、ロジックコードはループで実行されるものであると想定しています。

しかし、それはシンプルでありながら設定可能です。

2
Kalail