何時需要關注 Linux 的記憶體用量?

2019-07-06 17:39:00

Linux 上的記憶體管理很複雜。儘管使用率高但未必存在問題。你也應當關注一些其他的事情。

在 Linux 上用光記憶體通常並不意味著存在嚴重的問題。為什麼?因為健康的 Linux 系統會在記憶體中快取磁碟活動,基本上佔用掉了未被使用的記憶體,這顯然是一件好事情。

換句話說,它不讓記憶體浪費掉。使用空閒的記憶體增加磁碟存取速度,並且不占用執行中應用程式的記憶體。你也能夠想到,使用這種記憶體快取比起直接存取硬碟機(HDD)快上數百倍,也比明顯快於直接存取固態硬碟驅動。記憶體占滿或幾乎占滿通常意味著系統正在盡可能高效地執行當中 —— 並不是執行中遇到了問題。

快取如何工作

磁碟快取簡單地意味著系統充分利用未使用的資源(空閒記憶體)來加速磁碟讀取與寫入。應用程式不會失去任何東西,並且大多數時間裡能夠按需求獲得更多的記憶體。此外,磁碟快取不會導致應用程式轉而使用交換分割區。反而,用作磁碟快取的記憶體空間當被需要時會立即歸還,並且磁碟內容會被更新。

主要和次要的頁故障

Linux 系統通過分割實體記憶體來為進程分配空間,將分割成的塊稱為“頁”,並且對映這些頁到每個進程的虛擬記憶體上。不再會用到的頁也許會從記憶體中移除,儘管相關的進程還在執行。當進程需要一個沒有被對映或沒在記憶體中頁時,故障便會產生。所以,這個“故障fault”並不意味著“錯誤error”而是“不可用unavailables”,並且故障在記憶體管理中扮演者一個重要的角色。

次要故障意味著在記憶體中的頁未分配給請求的進程,或未在記憶體管理單元中標記為出現。主要故障意味著頁沒有保留在記憶體中。

如果你想切身感受一下次要頁故障和主要頁故障出現的頻率,像這樣試一下 ps 命令。注意我們要的是與頁故障和產生它的命令相關的項。輸出中省略了很多行。MINFL 顯示出次要故障的數目,而 MAJFL 表示了主要故障的數目。

$ ps -eo min_flt,maj_flt,cmd MINFL  MAJFL CMD230760    150 /usr/lib/systemd/systemd --switched-root --system --deserialize 18     0      0 [kthreadd]     0      0 [rcu_gp]     0      0 [rcu_par_gp]     0      0 [kworker/0:0H-kblockd]   ...   166     20 gpg-agent --homedir /var/lib/fwupd/gnupg --use-standard-socket --daemon   525      1 /usr/libexec/gvfsd-trash --spawner :1.16 /org/gtk/gvfs/exec_spaw/0  4966      4 /usr/libexec/gnome-terminal-server  3617      0 bash     0      0 [kworker/1:0H-kblockd]   927      0 gdm-session-worker [pam/gdm-password]

匯報單一進程,你可以嘗試這樣的命令(LCTT 譯註:引數裡面的 1 是要檢視的進程的 PID):

$ ps -o min_flt,maj_flt 1 MINFL  MAJFL230064    150

你也可以新增其他的顯示欄位,例如進程所有者的 UID 和 GID。

$ ps -o min_flt,maj_flt,cmd,args,uid,gid 1 MINFL  MAJFL CMD                         COMMAND                       UID   GID230064    150 /usr/lib/systemd/systemd -- /usr/lib/systemd/systemd --     0     0

多少才算滿?

一種較好的方法來掌握記憶體究竟使用了多少是用 free -m 命令。-m 選項指定了數位的單位是 MiBmebibyte 而不是位元組。

$ free -m              total        used        free      shared  buff/cache   availableMem:           3244        3069          35          49         140         667Swap:          3535           0        3535

注意 free(未使用)的記憶體可能會不足,而 available(可用於啟動新的應用)會顯示更大的數量。這兩者的區別值得我們去關注。可用available意味著它可以在需要時恢復使用,而空閒free意味著現在就能夠使用。

什麼時候要擔心

如果 Linux 系統上的效能表現良好 —— 應用程式響應度高,命令列沒有顯示出問題 —— 很可能系統狀況良好。記住,一些應用也許會出於某種原因而變慢,但它不影響整個系統。

過多的硬故障也許表明確實存在問題,但要將其與觀察到的效能相比較。

一個好的方法是當可用記憶體接近 0 或者“用作交換swap used”項顯著增長或波動時開始擔心。如果“可用”項佔總記憶體可用量的百分比合理,那麼就無需擔心,就像下面的例子那樣:

$ free -m              total        used        free      shared  buff/cache   availableMem:           3244        3069          35          49         140         667Swap:          3535           0        3535

Linux 效能很複雜

拋開這些不說,Linux 系統上的記憶體可能會變滿,並且效能可能會降低。當系統出現問題時不要僅將單一的記憶體使用報告作為指標。

Linux 系統的記憶體管理很複雜,因為它採取的措施需要確保系統資源得到最好的利用。不要受到一開始記憶體占滿的欺騙,使你認為系統存在問題,但實際上並沒有。