7

仮想化下で実行すると、ソフトウェアの実行速度が非常に遅くなる理由を理解しようとしています。私が見たほとんどの統計では、最悪の場合でも 10% のパフォーマンス ペナルティしかないはずですが、Windows 仮想サーバーでは、パフォーマンス ペナルティは 100 ~ 400% になる可能性があります。違いをプロファイリングしようとしましたが、プロファイルの結果はあまり意味がありません。仮想化なしの Vista 32 ビット ボックスでプロファイリングすると、次のようになります。 ここに画像の説明を入力

仮想化された Windows 2008 64 ビット サーバーでの実行例を次に示します。ここに画像の説明を入力

遅いものは非常に多くの時間をRtlInitializeExceptionChain費やしており、速いものでは 0.0 秒と表示されます。それが何をするのか分かりますか?また、マシンのプロセスにアタッチするとスレッドは 1 つしかありませんPulseEventが、サーバーに接続すると 2 つのスレッドがありGetDurationFormatExRtlInitializeExceptionChain. 私が知る限り、私たちが書いたコードは 1 つのスレッドしか使用していません。また、これは純粋な C で書かれたコンソールのみのアプリケーションであり、UI はまったくありません。

誰かが私のためにこれについて何か光を当てることができますか? これらntdllkernel32呼び出しのいくつかが何をしているのかについての情報だけでも? また、どの程度の違いが 64/32 ビットに関連しており、どれだけが仮想/非仮想に関連しているのかもわかりません。残念ながら、違いを判断するための他の構成に簡単にアクセスすることはできません。

4

2 に答える 2

6

仮想マシンのパフォーマンスが低下する理由を 2 つのクラスに分けることができると思います。

1. 構成スキュー

このカテゴリは、仮想化自体とは関係ないが、構成された仮想マシンが実際の仮想マシンほど優れていないすべてのものを対象としています。非常に簡単な方法は、仮想マシンに 1 つの CPU コアのみを割り当て、それを 2 CPU 8 コア 16 ハイパースレッド Intel Core i7 モンスターで実行されているアプリケーションと比較することです。あなたの場合、少なくとも同じ OS を実行していませんでした。ほとんどの場合、他のスキューもあります。

2. 仮想化の不適合

多くのロックを行うデータベースのようなものはうまく仮想化されないため、通常のオーバーヘッドはテスト ケースに当てはまらない場合があります。あなたの正確なケースではありませんが、MySQL のペナルティは 30 ~ 40% だと言われました。リストに...semaphoreというエントリ ポイントがあることに気付きました。これは、ゆっくりと仮想化する何かの兆候です。

基本的な問題は、ユーザー モードでネイティブに実行できないコンストラクトがトラップを必要とし (低速で、すべて単独で)、ハイパーバイザー エミュレーション コードでさらにオーバーヘッドがかかることです。

于 2011-04-15T20:42:57.170 に答える
0

仮想マシンに十分なリソースを提供していると仮定しています。仮想化の利点は、10 ~ 15% の CPU/メモリでしか実行されない 5 台のマシンを、50 ~ 75% の CPU/メモリで実行される 1 台のマシンに統合できることです。それでも、これらの「バースト」時間には 25 ~ 50% のオーバーヘッドが残ります。

個人的な逸話: 20 台のマシンが仮想化されましたが、それぞれが可能な限り多くの CPU を使用していました。これは、単一のマシンが単一のコアが提供できるよりも多くの電力を使用しようとしたときに問題を引き起こしました. そのため、ハイパーバイザーは複数のコアで単一のコアを仮想化し、パフォーマンスを低下させていました。各 VM の CPU 使用率を任意の単一コアから利用可能な最大値に調整すると、パフォーマンスが急上昇しました。

于 2011-04-18T03:47:56.613 に答える