- BitVisorでマイグレーション
kvm-clockに翻弄された
Sysbenchを走らす
- 対象は物理マシン、BitVisor、KVM
KVMよりもBitVisorのほうが速いという期待
あれ、でもKVMのほうがなんでおそいのか
- EPT? BitVisorでも使っているけど
- キャッシュミス? でも違う
prefやstraceで調べてみる
- VMExit回数やブロックサイズによらずほぼ同じ
→??????
- なぜclock_gettime()が多くなるのか Sysbenchは1イベントごとの時間を測定
- メモリテストの1イベント
memory-block-sizeを小さくしてみる→イベントの数は増えるし、時間を測定する回数が増える
まさか時間取得が遅い?
- システムコールがおかしい?
→KVMだけ時間取得の処理が遅い…
ブログ記事から調べてみると、そのままだし、BitVisorがとりわけ速いわけでもなく、KVMもたいして時間が変わらなかった…
- kvm-clockで泣いた
時間の計測手段を変えたら正しく計測できた。その結果ベンチマーク結果に差はほとんど出なくなった #kernelvm
— NOKUBI Takatsugu野首貴嗣 (@knok) June 6, 2015
ぐぐってみたら、current_time を tsc にしたらいいよ!とあってtscにしてみる。早い。ベアメタルもKVMもbitvisorも速度差は無い。メモリ関係ないお!論文にかけないお!一節まるまる消えるお!
提出三日前。
あはは。はは。は。
#kernelvm
— えむば姫 (@m_bird) June 6, 2015
なぜkvm-clockは遅いのか?
- 時間の取得を共有メモリでやりとり
- HostがWrite時にメモリロック
- GuestからのReadをブロック
なぜ遅いのか。時間の取得は共有メモリでやりとりしている。kvm hostがwrite lockをかけるため、ゲスト側で待つことになる #kernelvm
— NOKUBI Takatsugu野首貴嗣 (@knok) June 6, 2015
まとめ
- kvm-clockに時間を尋ねるのは間違っているだろうか→頻繁に尋ねるのは間違っている
- 頻繁にclocksourceを読むときはtscに変えよう
- kvm-clockが一番優先度が高い
会場:MIPSなどでもやってみたんだけど同じ結果になっていて。どれでも、仮想化したほうが早くて。なんでだろう?と。 #kernelvm
— Yoshikazu GOTO (@goto_ipv6) June 6, 2015