選擇虛擬硬體:呈現給客體的硬體決定了它的速度
虛擬機器的硬體不是既定事實,而是一種選擇。模擬的舊硬體是安裝當天的工具,不是虛擬機器整個生命週期的配備。
AtlasPVE ·
本條目涵蓋以下問題
- proxmox virtio 還是 e1000
- proxmox vm 網路很慢
- proxmox 磁碟效能 iothread
- proxmox windows virtio 驅動程式
- proxmox 虛擬網路卡怎麼選
虛擬機器的硬體不是既定事實,而是一種選擇。要讓客體看到哪一張網路卡、哪一種磁碟控制器,是可以決定的。而這個決定會直接影響虛擬機器的速度。
兩大類
模擬的真實硬體。呈現給客體的是一張它認識多年的實體網路卡。因為早就認識,所以不需要額外安裝任何東西。
專為虛擬化設計的硬體。呈現給客體的是一個明白表示自己是虛擬裝置的裝置。客體知道這一點,因此能用一種簡短而直接的語言溝通。
差異會表現在效能上。使用模擬網路卡時,每個封包都要經過一層模仿某種實際並不存在的硬體行為的處理。使用專為虛擬化設計的裝置時,這層模仿就不存在了。
為什麼會有模擬
為了相容性。沒有虛擬驅動程式的舊作業系統看到模擬網路卡時,會認出這是它熟悉的硬體,然後順利開機。
所以模擬硬體是安裝當天的工具。目的是讓虛擬機器能開機、能進入系統,並能安裝驅動程式。
真正的問題:沒有人會回頭
問題就在這裡。虛擬機器裝好了,正在執行,也在做它該做的事。沒有人會說:虛擬驅動程式已經就緒,來換一下硬體吧。
結果是:好幾個月,有時甚至好幾年,那台虛擬機器一直跑在安裝當天選的臨時硬體上。沒有任何東西回報錯誤。它只是比應有的速度更慢。
規則很簡單:模擬硬體是安裝當天的工具,不是虛擬機器整個生命週期的配備。一旦客體內的驅動程式就緒,就應立即更換。
沒有人會再去看的兩個設定
網路卡型號。舊的網路卡型號仍可選擇,選了也能運作。能運作不代表是對的。
讓磁碟佇列在獨立的執行緒上執行。這可以讓磁碟請求不必等待虛擬機器的主要處理流程。關閉時一切照常運作,只是在忙碌的時候,請求彼此之間會互相等待。
這兩項在安裝時都維持預設值,之後就再也沒有人打開過。
還有一堂測量課:累計總數不是症狀
這是本文最具普遍性的部分,而且不只適用於虛擬硬體。
網路卡有一個丟棄封包的計數器,而且這個計數器從不歸零。如果一台去年曾有一小時出狀況的虛擬機器顯示丟棄了兩百個封包,這個數字就會永遠留在那裡。
看著這個數字就斷定這台虛擬機器正在丟棄封包,是錯的。正確的問題是現在是否正在丟棄,也就是說,要看的不是總數,而是速率。一分鐘內丟棄了多少個封包?
同樣的區別也出現在磁碟磨損上:重點不是百分比,而是斜率。它可以寫成一條通用規則:累計總數說的是過去,速率說的是今天。決策要看今天來做。
Atlas 的做法
Atlas 能辨識舊的網路卡型號,並在虛擬機器仍在使用時加上標示。同樣地,當磁碟佇列沒有在獨立的執行緒上執行時,也會顯示出來。
兩者都屬於建議層級,而不是警告。原因與前一篇文章相同:這些設定並沒有壞,只是可以更好。把沒有壞的東西稱為警告,會降低真正警告的價值。
在封包遺失方面,產品套用了上述的測量教訓:它看的不是累計計數器,而是最近幾分鐘的丟棄速率。如果每分鐘至少丟棄一個封包,卡片就會出現;遺失停止時,卡片會自行消失。
這樣做的原因寫在程式碼裡:由於計數器從不歸零,一台過去曾遺失兩百個封包的虛擬機器,會一輩子看起來都像有罪。要問的不是過去是否遺失過封包,而是現在是否正在遺失。
資料來源
Proxmox 官方文件。內容為英文,且在此主題上以官方文件為準。