天天看點

QEMU&KVM-2 Live Migration

虛拟機的遷移是指把一台VM上的OS遷移到另外一台VM,兩個VM可以run在不同的實體機上。

包括:Offline Migration和Live Migration。這裡講講比較常用的Live Migration(熱遷移)。

在熱遷移過程中,Guest OS完全無感,其運作的任務,在快速遷移過後能繼續運作。

首先,對于Guest OS從一個VM遷移到其他VM,涉及到對register配置,dirty cache,runtime context等資料的遷移。

如下圖Guest OS1從VM1到VM2遷移過程:先由qemu monitor發起live migration,PC1的QEMU程序執行precopy,對源Guest OS的register,dirty cache bitmap,runtime context進行備份,建立傳輸channel,包括RDMA, tcp socket(網絡),unix socket(程序間),exec stdin/stdout(程序間),fd(虛拟檔案)等類型。遷移過程中 dirty page bitmap由QEMU copy,send,recv,restore,SRC和DST的QEMU程序間負責互動。

QEMU&KVM-2 Live Migration

  • KVM ram live migration

qemu接收HMP CMD:hmp_migrate, 如下圖左上角的調用流程是基于tcp socket的migrate發送過程,建立migation_thread, 在SRC端發起precopy,層層調用到kvm KVG_GET_DIRTY_LOG,進入kernel mode之後,會調用vmx_flush_log_dirty,發生VM_ENTRY進入Guest OS mode,在Guest OS裡log sync相關cache dirty page,cpu state等,下一次VM_EXIT會把該dirty log拷貝到user space供qemu 程序進行migration。(這裡針對 intel VT-X技術)。

QEMU&KVM-2 Live Migration

在intel cpu 中支援PML(Page Modification Logging )子產品用于記錄dirty page。

PML介紹

https://www.intel.com/content/www/us/en/processors/page-modification-logging-vmm-white-paper.html

VMX dirty loging相關ops如下,位于linux/arch/x86/kvm/vmx/vmx.c

QEMU&KVM-2 Live Migration
  • Device ram live migration

這裡提下virtio-net & vhost的live migration中的rx log 遷移

首先,virtio & vhost是一種半虛拟化技術,分為f'ront-end, back-end,Guest OS 安裝front-end

driver virtio-net,Host OS 安裝back-end driver vhost-net。qemu維護通信channel vring。

如下:

+---------+------+--------+----------+--+
|         +------+        +----------+  |
| user    |      |        |          |  |
| space   |      |        |  guest   |  |
|         |      |        |          |  |
|         | qemu |        | +-+------+  |
|         |      |        | | virtio |  |
|         |      |        | | driver |  |
|         +------+        +-+---++---+  |
|                               |       |
|                               |       |
|                               v       |
|                                       |
+-+-----+---+-+----+------+----+--+-----+
| |tap  |   | vhost-net.ko|    | kvm.ko |
| +---^-+   +------+----^-+    +----+---+
|     |-------|  kernel |-----------|   |
+---------------------------------------+           
  • DIRTY LOG space MMAP & ioeventd init

QEMU的vhost初始化部分層層調用主要完成:使用者态log space映射到核心态;設定好VRING_KICK的eventfd,後續可用于QEMU和HOST OS的互相通知,eventfd好處是免除類似ioctl系統調用時使用者态和核心态的切換。通過ioctl VHOST_SET_LOG_BASE可配置kernel mode下的logbase,通過ioctl VHOST_SET_VRING_KICK可配置kick eventfd。(kick每次收發package 會發生)。

QEMU&KVM-2 Live Migration
  • rx dirty log記錄過程

在上面配置完EVENTFD之後,Guest OS安裝的virtio-net(virtio 前端),通過寫ioeventfd mem region(也就是預先配置好的memory區域用于ioeventfd映射),發起rx請求,在調用到kernel mode handle_rx_kick,這時候會發生記錄vhost_log_write并更新eventfd的region區域。

QEMU&KVM-2 Live Migration
  • dirty log MEMORY REGION标記

由QEMU HMP migration指令發起遷移,在precopy階段擷取到之前 mmap過的LOG_BASE開始的内容,标記為dirty-page,後續在遷移過程中會拷貝該page。

QEMU&KVM-2 Live Migration

繼續閱讀