104

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

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

4

8 に答える 8

147
  • nice(および/または)を使用して優先順位を下げreniceます。nice()システムコールを使用してプログラムで行うこともできます。これにより、実行速度自体が遅くなることはありませんが、Linux スケジューラが割り当てる実行時間フレームが少なくなり (場合によっては短くなり)、より頻繁にプリエンプトされるようになります。スケジューリングの詳細については、Linux カーネルの理解のプロセス スケジューリング (第 10 章) を参照してください。 .
  • タイマー割り込みの頻度を上げてカーネルにより多くの負荷をかけると、すべてが遅くなる場合があります。これには、カーネルの再構築が必要です。
  • CPU 周波数スケーリングメカニズム (カーネル モジュールが必要) を使用し、コマンドを使用して CPU を制御 (スローダウン、スピードアップ) できcpufreq-setます。
  • もう 1 つの可能性はsched_yield()、プログラムのパフォーマンスが重要な部分で、他のプロセスにクォンタムを生成する を呼び出すことです (コードの変更が必要です)。
  • malloc()、などの一般的な関数をLD_PRELOADfree()を使用してフックし、で数百万の CPU サイクルを焼き付けたり、メモリ バリアを挿入したりするなどのばかげたことを行うことができます。これにより、プログラムが確実に遅くなります。(このことのいくつかを行う方法の例については、この回答を参照してください)。clock_gettime()rep; hop;
  • @Billが述べたように、割り当てられたCPUリソース、メモリなどの量を制限できる仮想化ソフトウェアでいつでもLinuxを実行できます.
  • プログラムを本当に遅くしたい場合は、Valgrindで実行してください (メモリ リークや不正なメモリ参照など、アプリケーションの問題を見つけるのにも役立つ場合があります)。
  • -O0最適化を無効にして (つまり、アサーションを有効にして)バイナリを再コンパイルすることで、いくらか遅くなることがあります-DDEBUG
  • 遅い CPU を搭載した古い PC や安価なネットブック (子供 1 人に 1 台のラップトップ、テストが完了したら子供に寄付することを忘れないでください) をいつでも購入して、プログラムを実行できます。

それが役に立てば幸い。

于 2013-01-17T02:51:46.083 に答える
37

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 が必要かどうかについて、あなたは言いませんでしたか? 探しているエラーのクラスについて何か知っていますか? 競合状態ですか、それとも顧客サイトでのコードのパフォーマンスが悪いだけですか?

編集: STOPCONT などの信号を使用して、プログラムを開始および停止することもできます。デバッガーでもこれを行うことができます。問題は、コードがフル スピードで実行されてから停止することです。Linux スケジューラを使用するほとんどのソリューションには、この問題があります。 Intel からのある種のスレッド アナライザーがありました。Vtune リリース ノートを参照してください。これは Vtune ですが、スレッド競合を分析する別のツールがあると確信していました。 参照:一部のスレッド競合状態をチェックできるIntel Thread Checker 。しかし、アプリがマルチスレッド化されているかどうかはわかりませんか?

于 2013-01-17T02:46:53.670 に答える
23

使用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
于 2013-01-17T14:49:39.410 に答える
13
  1. 古いパソコンを手に入れる
  2. VPS ホスティング パッケージは、実行速度が遅く、中断が多く、遅延が大きく異なる傾向があります。安くすればするほど、ハードウェアは悪くなります。本当に古いハードウェアとは異なり、古いハードウェアでは通常見られない命令セット (SSE4) が含まれている可能性が高くなります。それにもかかわらず、ゆっくり歩き、頻繁にシャッターを切るシステムが必要な場合は、安価な VPS ホストが最も手っ取り早いでしょう。
于 2013-01-17T03:06:59.697 に答える
3

プログラムをシミュレートして、非常に遅いマシンでの動作を分析したい場合は、プログラム全体をthread他のメインプログラムとして実行してみてください。

このようにして、一度にいくつかのスレッドで異なる優先順位を持つ同じコードに優先順位を付け、分析のデータを収集できます。これをゲーム開発でフレーム処理分析に使用しました。

于 2013-01-24T03:29:42.200 に答える
2

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

于 2013-01-17T03:54:22.023 に答える
2

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

例えば:

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

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

しかし、それはシンプルで構成可能です。

于 2013-03-10T06:03:07.323 に答える