30分で論文流し読みシリーズ3: 「vScale: Automatic and Efficient Processor Scaling for SMP Virtual Machines」

vScale: Automatic and Efficient Processor Scaling for SMP Virtual Machines

  • 実際の所要時間 一時間半

  • 課題

    • vCPU数 > pCPU数のときにvCPUがスケジュールされないことによってロック待ちやI/O完了待ちが長くなってアプリの性能がすごく落ちることがある
    • VMの負荷に応じて動的にvCPU数を動作させるvCPU Baloonというものがあるが、LinuxのCPU online/offline機能を使うと数百ミリ秒オーダーで時間を食うので頻繁に使うのはつらい
  • 対象環境
    • hostがXen、guestがLinux。以下単にHypervisorをXen,guest OSをLinuxと表記する
  • 解決方法概要
    • VMの負荷に応じてvCPU数増減に相当する処理をLinuxに追加する。同、負荷に応じてVMに与えるCPU時間を増減させる処理をXenに追加する。
  • 効果
    • バックグラウンドで別の処理を動かしてvCPU数が2*pCPU数程度のマシン上でスレッド間同期処理が多かったりI/O頻度が高かったりする処理を動かすと性能が数十%上がった
  • 解決方法詳細

    • linuxに手を入れて、カーネルから見えるCPUにfreezeという状態を作る。これはofflineに似ているが、vCPUのスケジュール対象にせず、かつ、外部割り込みも上がってこないようにするだけで、onlineとofflineの間のような状態。これはカスタムカーネルこれは数マイクロ秒単位で終わる
    • VMにおいて、個々のvCPUが実際に使ったCPU時間を定期的に記録する。この値をもとにlinuxXenの両方において次のようなvCPU online/offlineを模した処理をする
      • 実際に使ったCPU時間が少なければ、vCPUを所定の数だけfreezeする。それに加えてこの情報をXenに渡してVMに与えられるCPU時間のshareを小さくする*1
      • 上記値が多ければ、freeze状態のvCPUを所定の数だけunfreezeする。それに加えてこの情報をXenに渡して、VMに与えられるCPU時間のshareを大きくする
    • なぜlinux上のvCPUのfreeze/unfreezeだけでなくXenにおけるVMごとのshare値を変えているかというとから見ると、Xenからはlinuxのfreeze/unfreeze状態を直接観測できないから
  • 感想

    • KVM(あるいは今現在のXen)だとどうなるんだろう。手を入れなきゃいけないところが少なくなりそう。たとえばKVMだとlibvirtを使えばCPU shareはVM単位で与えられる
    • 図5においてlinux v3.14.15のunhotplug latency低すぎでは。何これ
    • バックグラウンドで動いているVMのデータも欲しい。もしかすると、あるVMをひいきして他のVMが割を食う仕組みになっているのかもしれない
    • CPU affinityが設定されている場合の対処方法がもやっとしててよくわからなかった

*1:変更を加えたバージョンのXenではshareはvCPUごとにあるが、vScaleにおいてはshareをguestごとの値に変更したらしい