虛擬機器的處理器類型:為什麼預設值很慢,又為什麼 host 不一定正確

預設的處理器類型刻意選用舊型號,好讓它在任何地方都能執行。代價是效能。另一個極端 host 能帶來速度,卻會奪走這台虛擬機器移動的自由。

AtlasPVE ·

本條目涵蓋以下問題

  • proxmox cpu type 選 host 還是 kvm64
  • proxmox vm cpu 很慢
  • proxmox cpu type 是什麼
  • proxmox 遷移 cpu 不相容
  • proxmox 虛擬機器 aes-ni

建立虛擬機器時有一個稱為處理器類型的欄位,通常會維持預設值。這個預設值是一個相當舊的通用處理器型號。

這不是疏忽,而是刻意的選擇。但在不知道代價的情況下就這樣放著,才是疏忽。

為什麼預設值這麼舊

呈現給虛擬機器的處理器型號,決定了這台虛擬機器可以被遷移到哪裡。執行中的虛擬機器,無法遷移到不支援它所看到之處理器功能的伺服器。

呈現最舊、最通用的型號,能得到最廣泛的相容性。這就是預設值的邏輯:讓它哪裡都能去。

代價是什麼

現代處理器具有特殊指令,能讓某些工作快上好幾倍。加密、壓縮、多媒體處理與雜湊運算都直接受益。

舊的預設型號會把這些指令對客體隱藏起來。客體看不見這些指令,就只能走慢速路徑。結果是:伺服器有能力快速完成那項工作,虛擬機器卻做不到。

差距並不小。執行加密的服務在虛擬機器內花的時間,可能是同樣工作在伺服器上的好幾倍。而且這個差距不會以錯誤的形式出現在任何地方,只會讓人覺得這裡就是比較慢。

另一個極端:把伺服器的處理器原樣呈現

另一端則是把伺服器的處理器原樣直通給虛擬機器。客體能看到所有現代指令,以最快的速度執行。

代價同樣明確:這台虛擬機器無法在執行中遷移到處理器不同的伺服器。如果已經建立了叢集,維護當晚想遷移的虛擬機器,正是因為這個設定而動不了。

所以這個選擇,就是本 wiki 一再出現的那個取捨:效能還是機動性。

三種情況,三種答案

如果只有一台伺服器,就直通伺服器的處理器。沒有地方可以遷移,就沒有必要為相容性付出代價。

如果叢集中的伺服器完全相同,仍然可以直通。相同的處理器,相同的功能。

如果叢集中的伺服器各不相同,就走中間路線:選一個所有伺服器都支援的具名現代型號。這樣能取得大部分現代指令,也保留了可攜性。這是最常被忽略、通常也是最正確的選項。

常見的陷阱

事情通常依這個順序發生:一開始只有一台伺服器,處理器設定成與伺服器相同,幾個月過去,買了第二台伺服器並建立叢集,到了維護之夜,虛擬機器卻遷移不了。

到那時,沒有人記得幾個月前做過的一項設定。建立叢集的當天,應檢閱現有虛擬機器的處理器設定。

變更時需要知道的事

變更處理器型號,等於告訴客體硬體已經改變。因此這項變更需要虛擬機器完全停止後再啟動;從客體內部重新啟動並不夠。

有些作業系統在授權上也會察覺硬體變更。如果有這類客體,變更之前應將此納入考量。

Atlas 的做法

Atlas 能辨識舊的預設處理器類型,並在虛擬機器仍使用其中之一執行時加以標示。

這裡選擇的層級是有意義的:這是一項建議,而不是警告。理由很坦白:預設值沒有壞,它能運作,只是還有效能沒被用上。把沒有壞掉的東西稱為警告,會降低真正警告的價值。

這個標示位於效能標題之下,所以它說的不是這台虛擬機器設定錯了,而是這台虛擬機器可以更快。

而且這項建議會直接帶到設定所在的位置。告訴別人某件事可以改善,卻讓對方自己去找設定在哪裡,只比什麼都不說好一點點。

資料來源

Proxmox 官方文件。內容為英文,且在此主題上以官方文件為準。

相關條目

這項工作在 Atlas 中是什麼樣子?

前往產品頁面