非常に古いクライアント マシンで失敗しているように見えるため、この方法でアプリケーションのストレス テストを行いたいと考えています。
最初は QEmu について少し読んで、ハードウェア エミュレーションについて考えましたが、それは遠回りのようです。スーパーユーザーに尋ねましたが、(まだ) あまりフィードバックがありませんでした。
だから私はあなたたちに目を向けています... どのようにこの種のテストをしますか?
非常に古いクライアント マシンで失敗しているように見えるため、この方法でアプリケーションのストレス テストを行いたいと考えています。
最初は QEmu について少し読んで、ハードウェア エミュレーションについて考えましたが、それは遠回りのようです。スーパーユーザーに尋ねましたが、(まだ) あまりフィードバックがありませんでした。
だから私はあなたたちに目を向けています... どのようにこの種のテストをしますか?
CPU の速度を遅くすることについてはよくわかりませんが、VMWare などの仮想マシンを使用している場合は、実際に使用される RAM の量を制御できます。自宅の 8 GB の MBP で実行しており、WinXP VM は 1.5 GB RAM に制限されています。
編集:VMWareのバージョンを確認したところ、使用できるコアの数を制御できます。遅い CPU と同じではありませんが、いくつかの問題が浮き彫りになる可能性があります。
古いハードウェアまたは古い OS が原因でアプリが失敗することは完全には明らかではないため、VM クライアントを使用すると、さまざまなバージョンの OS をかなり迅速にテストできます。数年前、Win98 で .Net 2.0 アプリを実行しようとしたときに、これが役に立ちました (どうやって動作させたか覚えていませんが、実行できます...)。
cpulimitを試してみてください。ほとんどのディストリビューションには含まれています(Ubuntuにはあります)http://www.digipedia.pl/man/doc/view/cpulimit.1
Virtual Box は、VMWare に似た無料の仮想マシンです。また、使用可能なメモリを削減する機能もあります。使用可能な CPU の数を制限できますが、それらの CPU の速度は制限できません。
CPUの速度を下げたい場合は、フォーク爆弾プログラムを変更することで簡単に行うことができます
int main(){
int x=0;
int limit = 10
while( x < limit ){
int pid = fork();
if( pid == 0 )
while( 1 ){}
else
x++;
}
}
これにより、コンピューターの速度が非常に速く低下します。制限変数をより高い数値に変更することをお勧めします。これは危険な場合がありますが、警告する必要があります。実装が間違っていると、システムをフォーク爆撃して、再起動しない限りシステムが役に立たなくなる可能性があるためです。このコードが何をするのか理解できない場合は、まずこれを読んでください。
POSIX (Unix) システムでは、実行制限をプロセス (つまり、プログラムの実行) に適用できます。これを行うためのシステム コールは と呼ばれsetrlimit()
、ほとんどのシェルではulimit
組み込みの を使用してコマンド ラインから設定できます (プレーンな POSIXulimit
はあまり役に立ちません)。これらを使用して、小さなコンピューターをシミュレートするために低い制限でプログラムを実行できます。
POSIX システムはnice
、より低い CPU 優先度でプログラムを実行するためのコマンドも提供します。これは、CPU を集中的に使用する別のプログラムが同時に実行されていることを確認した場合に、低速の CPU をシミュレートできます。
既成概念にとらわれずに考えてください。定期的に使用するアプリケーションの中で、これを行うのはどれですか? もちろんデバッガ!しかし、低CPUをエミュレートするために、どうすればそのような動作を実現できますか?
あなたの質問の秘密はasm _int 3
. これは、接続されたデバッガーからデバッグ中のアプリケーションに送信されるアセンブリの "pause me" コマンドです。
int 3 の詳細については、この質問を参照してください。
このツールのコードを使用して、プロセスを継続的に一時停止/再開できます。間隔を追加して、そのツールにその時間だけアプリケーションを一時停止させることができます。
emulated-cpu-speed は次のようになります: (YourCPU/Interval) -0.00001% これは、マシン上で実行されているシグナリングおよびその他のプロセスのためですが、うまくいくはずです。
ロー メモリ エミュレーションについて: アプリケーションにメモリを割り当てるラッパー クラスを作成し、各割り当てをこのクラスの呼び出しに置き換えることができます。アプリケーションがメモリの割り当てに失敗する前に、アプリケーションが使用できる正確なメモリ量を設定できます。
次のようなもの:MyClass* foo = AllocWrapper(new MyClass(arguments or whatever));
次に、AllocWrapper でメモリの割り当て/割り当て解除を行うことができます。
CPU速度が非常に多くのバグを引き起こす可能性はほとんどないと思います。一方、さまざまな CPU機能が問題になる可能性ははるかに高くなります。多くの VM 実装は、特定の CPU 機能のオンとオフを切り替える方法を提供します。特に qemu では、CPU が利用できるものを高度に制御できます。
https://serverfault.com/questions/36309/throttle-down-cpu-speed-of-vmware-imageを参照してください。 これは、無料で提供されていると主張されている場合です。VMwarevSphereHypervisor™(ESXi)を使用すると、仮想マシンを選択できます。仮想マシンのメモリサイズの設定に加えて、CPU速度。
ulimit
Linuxでは、 Raedwaldが言ったように使用できます。SetProcessWorkingSetSize
Windowsでは、システムコールを使用できます。ただし、これらはプロセスごとに制限を設定するだけです。実際には、システムの一部はストレスのある環境で故障し始めます。Sysinternalsのtestlimit
ツールを使用して、マシン全体にストレスをかけることをお勧めします。