記憶體顯示 90%:是真的滿了,還是只是看起來滿了

閒置的記憶體就是浪費的記憶體,所以單看百分比偏高,並不代表有問題。該問的不是有多滿,而是誰佔著它。

AtlasPVE ·

本條目涵蓋以下問題

  • proxmox 記憶體滿了
  • proxmox 記憶體使用率過高
  • proxmox zfs 記憶體使用量
  • proxmox ballooning 是什麼
  • proxmox 需要多少記憶體

看一眼面板,記憶體已經到了 90%。直覺反應是立刻加裝 RAM。大多數時候其實沒有必要。

閒置的記憶體就是浪費的記憶體。作業系統會把沒用到的記憶體當成快取使用,需要時再釋放出來。所以單看百分比偏高,並不是故障的跡象。

在 Proxmox 上,還有兩個來源會讓這個情況更加混淆。

第一個來源:儲存快取

使用 ZFS 時,它會把讀取過的資料保留在記憶體中以便快速存取,而這部分可能相當大。記憶體吃緊時它會釋放出來。但在那之前,這部分會顯示為使用中。

這不是記憶體洩漏,而是設計本身。在一直重複讀取相同資料的系統上,這個快取是最便宜的加速方式,還能降低磁碟的磨耗。

微妙之處在於:它釋放記憶體時,不一定是立即釋放。所以突然需要記憶體時,可能會遇到短暫的延遲。這就是為什麼在資源非常吃緊的環境中,為快取設定上限是合理的;但要根據量測來做,而不是因為記憶體快滿了而驚慌。

第二個來源:客體佔用的記憶體

如果給了一台虛擬機器 8 GB,即使它內部處於閒置狀態,從伺服器這一側看,它仍可能像是佔著 8 GB。原因很簡單:記憶體只要被使用過一次,就會一直維持配置狀態,除非客體知道如何把它歸還。

只有在客體配合時,才能歸還記憶體。如果客體內部沒有讓這件事成為可能的元件,交出去的記憶體就是有去無回。如果期望承諾出去的記憶體能夠收回,就要先確認那個元件已經安裝。

正確的問題:不是有多滿,而是誰佔著它

百分比本身說明不了什麼。有意義的拆分是:這份滿載當中,有多少是客體,又有多少是伺服器本身?

如果是客體,情況就是正常的;它們正在使用分配給它們的記憶體。如果是伺服器這一側,而且還在持續增加,那就有需要查看的地方了。

真正的警訊不是百分比,而是置換空間

如果伺服器已經開始使用置換空間(swap),那才是真正的訊號。記憶體 90% 滿可能不是問題,但持續在做置換的伺服器會變慢,也會加速磁碟磨耗。

判斷方式:不要因為百分比而驚慌,要根據置換活動採取行動。

承諾過多

分配給虛擬機器的記憶體總量,可以超過伺服器實際擁有的記憶體。大多數時候這行得通,因為它們不會同時達到高峰。

但有一條規則,而且沒有例外:不要把伺服器自己的那一份也算進承諾裡。伺服器記憶體耗盡時,倒下的不是一台機器,而是所有東西同時倒下,連面板也不例外。客體之間的分配可以有彈性,伺服器自己的喘息空間則不行。

Atlas 的做法

Atlas 不把記憶體圖表顯示成單一的百分比,而是拆成三部分:伺服器本身使用的、客體使用的,以及置換空間。

而且這個拆分是靠計算,而不是猜測:從已使用的記憶體總量中減去所有客體的總和,剩下的就算是伺服器的份額。這樣一眼就能回答上面那個真正的問題:這份滿載是來自我的機器,還是伺服器本身?

一個細小但有意義的細節:圖表的上限採用的是記憶體總量最後已知的數值,而不是序列開頭的數值。原因是:在長時間的檢視範圍內,記憶體總量可能會改變,而用舊數值當上限,會讓圖表呈現出與實際不符的樣子。所以在為機器加裝 RAM 的那一天,圖表不會繼續畫著舊的上限而造成誤導。

資料來源

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

相關條目

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

前往產品頁面