BitVisor と KVM の性能比較時の落とし穴 & BitVisor Advent Calendar について
- 1. BitVisor と KVM の
性能比較時の落とし穴
深井 貴明(筑波大学)
2016年11月30日
&
BitVisor Advent Calendar
について
- 3. 発表趣旨
• BitVisor, KVM の性能比較時に陥った問題の紹介
• なぜか KVM が異様に遅い
• なぜか KVM の方が速い
• 時には物理マシンよりもKVMが速いことも…
• etc…
• 同じ悲劇繰り返さないために情報を共有
3
- 4. Table of Contents
• 背景
• 事例紹介
• Case 1: kvm-clock
• Case 2: 64bit ホストOS と 32bit ゲストOS 混在
• Case 3: CPU クロック
• Case 4: KVM ゲストへのメモリ割り当て
• Case 5: 割り込みの分散
• Case 6: BitVisor の EPT 用バッファ
• Case7: YCSB と NoSQL
• まとめ
4
- 5. BitVisor と KVM の設計比較
Hardware
BitVisor KVM
OS
Hardware
OS
パススルー
アクセス
KVMBitVisor
5
KVM が
アクセスに介入
共通点: VT-x で CPUと メモリを仮想化
- 7. 事例紹介
• Case 1: kvm-clock
• Case 2: KVM ゲストへのメモリ割り当て
• Case 3: 64bit ホストOS と 32bit ゲストOS 混在
• Case 4: CPU クロック
• Case 5: BitVisor の EPT 用バッファ
• Case 6: YCSB と NoSQL
• Case 7: 割り込みの分散 (Rare)
7
- 8. BitVisor 遅い
KVM 速い
事例紹介
• Case 1: kvm-clock
• Case 2: KVM ゲストへのメモリ割り当て
• Case 3: 64bit ホストOS と 32bit ゲストOS 混在
• Case 4: CPU クロック
• Case 5: BitVisor の EPT 用バッファ
• Case 6: YCSB と NoSQL
• Case 7: 割り込みの分散 (Rare)
8
KVM 遅い
その他
- 11. 原因と対策
• 原因: kvm-clock の読み出しが遅い
• 対策: clocksource を tsc に変更
• /sys/devices/system/clocksouce/clocksouce0/current_clocksource を変更
11
- 14. Case 2: KVM ゲストへのメモリ割り当
現象: 全体的にKVM が遅い
• コンソールは異様に重い
• NoSQL サーバのベンチマークスコアが悪い
原因: KVM の VM にメモリを割り当てすぎて,KVMホスト
がswapping
14
- 16. 原因と対策
原因: KVM の VM にメモリを割り当てすぎ
対策: ホストでswapoff & メモリ割り当て量を調整
• 適切な最大メモリ量を割り出す方法が見つからない
• Try and Error で少しづつ増やしたり減らしたりする
• swapoff 時に割り当てメモリが多すぎる
→ VM が起動しない
16
- 17. Case3:
64bit ホストOS と 32bit ゲストOS 混在
評価環境
17
32bit Linux
Hardware
物理マシン
BitVisor
32bit Linux
Hardware
64bit Linux
(KVM)
32bit Linux
Hardware
BitVisor KVM
- 18. Case3:
64bit ホストOS と 32bit ゲストOS 混在
評価環境
18
32bit Linux
Hardware
物理マシン
BitVisor
32bit Linux
Hardware
64bit Linux
(KVM)
32bit Linux
Hardware
BitVisor KVM
現象: ベンチマークの結果
(memcached だったと思う)
これが一番速い
- 20. 原因と対策
原因: 64bit OS の方がドライバが高速(らしい)
• 物理マシンでは,32bit OS が MMIO を発行
• KVM では,64bit ホスト OS が MMIO を肩代わり
対策: 64 bit KVM ホストと32bit ゲストを混在させない
20
- 23. 原因と対策
原因: SpeedStep & C ステート関係の設定
• Linux のブートオプションでCステートを制限
• processor.max_cstate=0
• これだと acpi の idle が走りクロックが上がらない
• 一方 KVM はクロックが下がってなかった
対策: SpeedStep を無効化 & idle を polling に変更
• ブートオプション idle=poll
• 性能最大化の手段の一つらしい
• http://itpeernetwork.intel.com/how-to-maximise-cpu-
performance-for-the-oracle-database-on-linux/
23
- 24. Case 5: BitVisor の EPT 用バッファ
現象: Redis + YCSB で BitVisor が遅い
原因究明:
• VMExit の回数を調べる
→ EPT Violation が多い
• BitVisor のコードを読む
24
- 25. 原因
原因: EPT 用のバッファが小さい & 枯渇時の処理が雑
• 元々は4MB…4KB paging で 2GB マップできない
• (4MB / 8 B) * 4KB = 2GB
• バッファ枯渇時にすべてのマッピングをクリアしている
• 2013年ごろのBitVisorベースの話
25
- 27. Case 6: 割り込み分散の有無
現象: KVM だけ速い
原因: 割り込みがKVM だけ分散している
とあるA社マザーボード
• 割り込みをラウンドロビンで分散できない
KVM
• 割り込みを仮想化する段階で分散する
27
- 28. Case 7: NoSQL
現象: YCSB のスコアをグラフにすると不思議な形に
• クライアントのスレッド数に比例せずにギザギザになる
原因究明: NoSQL の処理について調査
原因: NoSQL の永続化処理が非同期に走るため
対策: 永続化処理を無効にする,etc…
28
- 29. 因果関係まとめ
原因 結果
kvm-clock 遅い 頻繁にタイマを読む
とKVMが遅い
KVM ホストのswapping KVM が遅い
32bit/64bit OS 混在 64bit ホストのKVM
> 32bit ゲストの
物理マシン
speedstep + Cステート無効でCPU
クロックが落ちる
物理マシンが遅い
EPT クリアが頻発 BitVisor が遅い
割り込み分散の有無 分散しないと遅い
NoSQL が非同期に永続化処理 スコアが不安定に
29
- 30. 対策まとめ
原因 対策
kvm-clock 遅い clocksource を tsc に変更
KVM ホストのswapping ホストでswapoff
32bit/64bit OS 混在 32bit/64bit を混在させない
speedstep + Cステート無効
でCPUクロックが落ちる
BIOS で speedstep 無効化 +
poll=idle
EPT クリアが頻発 EPT用のバッファを増やす,
パッチを書く,etc
割り込み分散の有無 分散の有無を揃える
NoSQL が非同期に永続化
処理
永続化を無効化
30
- 37. What is “Advent Calendar”?
アドベントカレンダー - Wikipedia より
• 「アドベントカレンダー(Advent calendar)は、クリスマス
までの期間に日数を数えるために使用されるカレン
ダーである。」
37
- 38. What is “Advent Calendar”?
アドベントカレンダー - Wikipedia より
• 「アドベントカレンダー(Advent calendar)は、クリスマス
までの期間に日数を数えるために使用されるカレン
ダーである。」
• 「インターネット上などで、アドベントカレンダーに見立
てて12月に一人、または複数人で毎日記事を投稿して
いくという企画がある。 特にプログラミングに関連する
アドベントカレンダーの企画が近年多数行われてい
る。」
38
- 42. BitVisor Advent Calendar をやる意義
BitVisor コミュニティの問題に対する起爆剤
• コミュニティの盛り上がりに欠ける
• 深刻なドキュメント不足
みんなでAdvent Calendar の記事を書けば
• お祭りっぽく盛り上がる
• BitVisor に関するブログ記事が増える
42