web-dev-qa-db-ja.com

x86 / x64仮想化にはどのくらいのオーバーヘッドがありますか?

X86/x64仮想化(おそらくVirtualBox、おそらくVMWare、おそらく準仮想化ではない)のオーバーヘッドは、次の各操作で、Intelハードウェア仮想化を使用するWin64ホストとLinux64ゲストにどのくらいのオーバーヘッドがありますか?

  • 純粋にCPUにバインドされた、ユーザーモードの64ビットコード

  • 純粋にCPUにバインドされた、ユーザーモードの32ビットコード

  • ハードドライブへのファイルI/O(レイテンシではなく、スループットを重視)

  • ネットワークI/O

  • スレッド同期プリミティブ(ミューテックス、セマフォ、条件変数)

  • スレッドコンテキストスイッチ

  • アトミック操作(lock接頭辞を使用、比較およびスワップなど)

私は主にハードウェア支援のx64ケース(IntelとAMDの両方)に関心がありますが、支援なしのバイナリ変換とx86(つまり、32ビットのホストとゲスト)のケースについて聞いてもかまいません。私は準仮想化には興味がありません。

24
dsimcha

あなたのような質問には、単純で絶対的な答えはないことがわかりました。各仮想化ソリューションの動作は、特定のパフォーマンステストでは異なります。また、ディスクI/Oスループットなどのテストは、さまざまなテスト(読み取り、書き込み、書き換えなど)に分割でき、結果はソリューションごと、シナリオごとに異なります。これが、1つのソリューションがディスクI/Oの最速であると指摘するのは簡単なことではなく、ディスクI/Oのオーバーヘッドのようなラベルに対する絶対的な答えがない理由です。

異なるベンチマークテスト間の関係を見つけようとすると、さらに複雑になります。私がテストしたどのソリューションも、マイクロ操作テストで優れたパフォーマンスを発揮しませんでした。例:Inside VM "gettimeofday()"の1回の呼び出しには、ハードウェアの場合よりも平均で11.5倍のクロックサイクルがかかりました。ハイパーバイザーは実際のアプリケーション用に最適化されており、マイクロ操作で十分に機能します。これは、実際のアプリケーションよりも適切に動作するアプリケーションでは問題にならない場合があります。つまり、マイクロ操作で終了するのに費やす時間が1,000クロックサイクル未満のアプリケーション(2.6 GHz CPUの場合、1,000クロックサイクルは385ナノ秒、つまり3.85e-7秒で費やされます。

私は、x86アーキテクチャ用のデータセンター統合のための4つの主要なソリューションについて、広範なベンチマークテストを行いました。 VM内のパフォーマンスとハードウェアのパフォーマンスを比較する約3000のテストを行いました。 VM内で測定された最大パフォーマンスとハードウェアで測定された最大パフォーマンスの違いを「オーバーヘッド」と呼んでいます。

ソリューション:

  • VMWare ESXi 5
  • Microsoft Hyper-V Windows 2008 R2 SP1
  • Citrix XenServer 6
  • Red Hat Enterprise Virtualization 2.2

ゲストOS:

  • Microsoft Windows 2008 R2 64ビット
  • Red Hat Enterprise Linux 6.1 64ビット

テスト情報:

  • サーバー:それぞれ8GBのRAM、2X Intel Xeon E5440 CPU、および4つのギガビットイーサネットポートを備えた2X Sun Fire X4150
  • ディスク:6X 136GB SASギガビットイーサネット上のiSCSI上のディスク

ベンチマークソフトウェア:

  • CPUとメモリ: Linpackベンチマーク 32ビットと64ビットの両方。これはCPUとメモリを集中的に使用します。

  • ディスクI/Oと遅延:Bonnie ++

  • ネットワークI/O:Netperf:TCP_STREAM、TCP_RR、TCP_CRR、UDP_RRおよびUDP_STREAM

  • マイクロ操作: rdtscbench :システムコール、プロセス間パイプ通信

平均は次のパラメーターで計算されます:

  • CPUとメモリ:AVERAGE(HPL32、HPL64)

  • ディスクI/O:AVERAGE(put_block、rewrite、get_block)

  • ネットワークI/O:AVERAGE(tcp_crr、tcp_rr、tcp_stream、udp_rr、udp_stream)

  • マイクロオペレーションAVERAGE(getpid()、sysconf()、gettimeofday()、malloc [1M]、malloc [1G]、2pipes []、simplemath [])

私のテストシナリオでは、私のメトリックを使用して、4つの仮想化ソリューションの結果の平均は次のとおりです。

VMレイヤーのオーバーヘッド、Linuxゲスト:

  • CPUとメモリ:14.36%

  • ネットワークI/O:24.46%

  • ディスクI/O:8.84%

  • 読み取りのディスク遅延:2.41倍遅い

  • マイクロオペレーションの実行時間:10.84倍遅い

VMレイヤーのオーバーヘッド、Windowsゲスト:

  • 32ビットと64ビットの両方のCPUとメモリの平均:13.06%

  • ネットワークI/O:35.27%

  • ディスクI/O:15.20%

これらの値は一般的なものであり、特定のケースのシナリオを反映していないことに注意してください。

記事全体をご覧ください: http://petersenna.com/en/projects/81-performance-overhead-and-comparative-performance-of-4-virtualization-solutions

26
Peter Senna

質問の変数が多すぎますが、絞り込んでみます。 VMware ESXを使用して、すべてが正しく行われているとしましょう。仮想化をサポートする最新のCPU、準仮想化ストレージとネットワークドライバーを備えたVMwareツール、大量のメモリ。ここで、このセットアップで単一の仮想マシンを実行するとします。私の経験から、CPUにバインドされたワークロードのCPU速度は最大90%になるはずです。 1Gbpsリンクを使用しており、問題なく飽和できるため、ネットワーク速度についてはあまり説明できません。10Gbpsリンクとは異なる場合がありますが、それらはありません。ストレージスループットはストレージのタイプに依存します。ローカルストレージでストレージスループットの約80%を得ることができますが、1Gbps NFSの場合、ネットワークがここでボトルネックになっているため、100%に近くなります。他の指標については説明できません。独自のコードで実験する必要があります。

これらの数値は非常に概算であり、負荷タイプ、ハードウェア、ネットワークに大きく依存します。サーバーで複数のワークロードを実行すると、さらにあいまいになります。しかし、ここで私が言っているのは、理想的な条件下では、ネイティブパフォーマンスの90%に近づくことができるということです。

また、私の経験から、高性能アプリケーションのはるかに大きな問題はレイテンシであり、特にクライアントサーバーアプリケーションに当てはまります。 30以上のクライアントからリクエストを受け取り、短い計算を実行して結果を返す計算エンジンがあります。ベアメタルでは通常、CPUを100%にプッシュしますが、VMware上の同じサーバーはCPUを60〜80%までしかロードできません。これは主に、要求/応答の処理における待ち時間が原因です。

4
dtoubelis

私はコンテキストスイッチングやアトミック操作などの基本的なプリミティブのパフォーマンスを詳しく調べていませんが、さまざまなハイパーバイザーを使用して最近実行したブルートフォーステストの結果を以下に示します。これは、主にCPUであり、RAM帯域幅が制限されている場合に期待できることを示しているはずです。

https://web.archive.org/web/20160321041041/http://www.altechnative.net/2012/08/04/virtual-performance-part-1-vmware/

0
Gordan