即時遷移(live migration)
假設一台實體伺服器需要維護,但它正跑著一台服務即時流量、絕不能斷的虛擬機。即時遷移就是那個把一台執行中的虛擬機從一台實體主機搬到另一台、而客體幾乎不會察覺的把戲——不關機、不重開機,作業系統與它的應用程式在整個搬移過程中持續執行。這是虛擬化最驚人的回報之一:因為一台 VM 歸根究柢只是狀態(記憶體、CPU 暫存器、裝置狀態),你便能把那份狀態複製到另一台機器、在那裡讓它繼續跑。
難的部分是記憶體,因為你一邊複製它、它一邊還在變。常見的技術是預複製(pre-copy)遷移。首先,超管理器在客體仍於來源端執行的同時,把客體的整片記憶體複製到目的端。當然,客體在那次複製期間會弄髒一些分頁,於是超管理器追蹤哪些分頁變了、只把那些再複製一遍,接著是「那一輪」期間被弄髒的,如此反覆,而那組髒分頁逐漸縮小。當剩下的髒分頁集小到一定程度,它便做一次短暫的「停止並複製」:把客體暫停幾毫秒,把最後一小撮髒分頁加上 CPU 與裝置狀態複製過去,再於目的端讓客體繼續。做得好的話,這次暫停短到網路連線能存活、使用者頂多看到一個微小的卡頓。(另一種做法,後複製 post-copy,立刻在目的端啟動客體、再按需把分頁拉過來,換取一套不同的風險樣貌。)
它為何重要:即時遷移正是讓一群伺服器感覺像一個有彈性的資源池的東西——你可以為了維護而把一台主機「排空」、把負載從一台過熱的機器再平衡走、或在夜間把 VM 集中到較少的伺服器上,全都不必停機。誠實的告誡很重要。它需要快速的共享網路、通常還需要相容的 CPU 與共享或複製的儲存;若客體弄髒記憶體的速度快過鏈路能複製的速度(一個寫入密集的工作負載也許永遠收斂不了),它就可能失敗或卡住;而當客體持有被直通的實體硬體時,它會難得多、甚至不可能,因為你無法複製一個真實裝置隱藏的狀態。即時遷移是一個強大、精心設計的幻象,不是一個免費的保證。
要把一台主機停下來維護,操作員觸發即時遷移:這台 VM 的 8 GiB 記憶體分好幾輪被預複製到第二台主機,接著客體被暫停約 50 毫秒以送出最後的髒分頁與 CPU 狀態,再於新主機上繼續——已開啟的 TCP 連線得以存活。
預複製反覆處理髒分頁,再以毫秒級的暫停送出其餘部分——客體幾乎不會察覺。
即時遷移並非有保證:一個寫入密集的客體弄髒分頁的速度可能快過複製、永遠收斂不了,而被直通的實體裝置(其隱藏的硬體狀態無法被複製)往往使它變得不可能。它也需要相容的 CPU 與共享或複製的儲存。