虛擬機器的處理器類型:為什麼預設值很慢,又為什麼 host 不一定正確
預設的處理器類型刻意選用舊型號,好讓它在任何地方都能執行。代價是效能。另一個極端 host 能帶來速度,卻會奪走這台虛擬機器移動的自由。
AtlasPVE ·
本條目涵蓋以下問題
- proxmox cpu type 選 host 還是 kvm64
- proxmox vm cpu 很慢
- proxmox cpu type 是什麼
- proxmox 遷移 cpu 不相容
- proxmox 虛擬機器 aes-ni
建立虛擬機器時有一個稱為處理器類型的欄位,通常會維持預設值。這個預設值是一個相當舊的通用處理器型號。
這不是疏忽,而是刻意的選擇。但在不知道代價的情況下就這樣放著,才是疏忽。
為什麼預設值這麼舊
呈現給虛擬機器的處理器型號,決定了這台虛擬機器可以被遷移到哪裡。執行中的虛擬機器,無法遷移到不支援它所看到之處理器功能的伺服器。
呈現最舊、最通用的型號,能得到最廣泛的相容性。這就是預設值的邏輯:讓它哪裡都能去。
代價是什麼
現代處理器具有特殊指令,能讓某些工作快上好幾倍。加密、壓縮、多媒體處理與雜湊運算都直接受益。
舊的預設型號會把這些指令對客體隱藏起來。客體看不見這些指令,就只能走慢速路徑。結果是:伺服器有能力快速完成那項工作,虛擬機器卻做不到。
差距並不小。執行加密的服務在虛擬機器內花的時間,可能是同樣工作在伺服器上的好幾倍。而且這個差距不會以錯誤的形式出現在任何地方,只會讓人覺得這裡就是比較慢。
另一個極端:把伺服器的處理器原樣呈現
另一端則是把伺服器的處理器原樣直通給虛擬機器。客體能看到所有現代指令,以最快的速度執行。
代價同樣明確:這台虛擬機器無法在執行中遷移到處理器不同的伺服器。如果已經建立了叢集,維護當晚想遷移的虛擬機器,正是因為這個設定而動不了。
所以這個選擇,就是本 wiki 一再出現的那個取捨:效能還是機動性。
三種情況,三種答案
如果只有一台伺服器,就直通伺服器的處理器。沒有地方可以遷移,就沒有必要為相容性付出代價。
如果叢集中的伺服器完全相同,仍然可以直通。相同的處理器,相同的功能。
如果叢集中的伺服器各不相同,就走中間路線:選一個所有伺服器都支援的具名現代型號。這樣能取得大部分現代指令,也保留了可攜性。這是最常被忽略、通常也是最正確的選項。
常見的陷阱
事情通常依這個順序發生:一開始只有一台伺服器,處理器設定成與伺服器相同,幾個月過去,買了第二台伺服器並建立叢集,到了維護之夜,虛擬機器卻遷移不了。
到那時,沒有人記得幾個月前做過的一項設定。建立叢集的當天,應檢閱現有虛擬機器的處理器設定。
變更時需要知道的事
變更處理器型號,等於告訴客體硬體已經改變。因此這項變更需要虛擬機器完全停止後再啟動;從客體內部重新啟動並不夠。
有些作業系統在授權上也會察覺硬體變更。如果有這類客體,變更之前應將此納入考量。
Atlas 的做法
Atlas 能辨識舊的預設處理器類型,並在虛擬機器仍使用其中之一執行時加以標示。
這裡選擇的層級是有意義的:這是一項建議,而不是警告。理由很坦白:預設值沒有壞,它能運作,只是還有效能沒被用上。把沒有壞掉的東西稱為警告,會降低真正警告的價值。
這個標示位於效能標題之下,所以它說的不是這台虛擬機器設定錯了,而是這台虛擬機器可以更快。
而且這項建議會直接帶到設定所在的位置。告訴別人某件事可以改善,卻讓對方自己去找設定在哪裡,只比什麼都不說好一點點。
資料來源
Proxmox 官方文件。內容為英文,且在此主題上以官方文件為準。