何時需要關注 Linux 的內存用量?
在 Linux 上用光內存通常並不意味著存在嚴重的問題。為什麼?因為健康的 Linux 系統會在內存中緩存磁碟活動,基本上佔用掉了未被使用的內存,這顯然是一件好事情。
換句話說,它不讓內存浪費掉。使用空閑的內存增加磁碟訪問速度,並且不佔用運行中應用程序的內存。你也能夠想到,使用這種內存緩存比起直接訪問硬碟驅動器(HDD)快上數百倍,也比明顯快於直接訪問固態硬碟驅動。內存佔滿或幾乎佔滿通常意味著系統正在儘可能高效地運行當中 —— 並不是運行中遇到了問題。
緩存如何工作
磁碟緩存簡單地意味著系統充分利用未使用的資源(空閑內存)來加速磁碟讀取與寫入。應用程序不會失去任何東西,並且大多數時間裡能夠按需求獲得更多的內存。此外,磁碟緩存不會導致應用程序轉而使用交換分區。反而,用作磁碟緩存的內存空間當被需要時會立即歸還,並且磁碟內容會被更新。
主要和次要的頁故障
Linux 系統通過分割物理內存來為進程分配空間,將分割成的塊稱為「頁」,並且映射這些頁到每個進程的虛擬內存上。不再會用到的頁也許會從內存中移除,儘管相關的進程還在運行。當進程需要一個沒有被映射或沒在內存中頁時,故障便會產生。所以,這個「 故障 」並不意味著「 錯誤 」而是「 不可用 」,並且故障在內存管理中扮演者一個重要的角色。
次要故障意味著在內存中的頁未分配給請求的進程,或未在內存管理單元中標記為出現。主要故障意味著頁沒有保留在內存中。
如果你想切身感受一下次要頁故障和主要頁故障出現的頻率,像這樣試一下 ps
命令。注意我們要的是與頁故障和產生它的命令相關的項。輸出中省略了很多行。MINFL
顯示出次要故障的數目,而 MAJFL
表示了主要故障的數目。
$ ps -eo min_flt,maj_flt,cmd
MINFL MAJFL CMD
230760 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 MAJFL
230064 150
你也可以添加其他的顯示欄位,例如進程所有者的 UID 和 GID。
$ ps -o min_flt,maj_flt,cmd,args,uid,gid 1
MINFL MAJFL CMD COMMAND UID GID
230064 150 /usr/lib/systemd/systemd -- /usr/lib/systemd/systemd -- 0 0
多少才算滿?
一種較好的方法來掌握內存究竟使用了多少是用 free -m
命令。-m
選項指定了數字的單位是 MiB 而不是位元組。
$ free -m
total used free shared buff/cache available
Mem: 3244 3069 35 49 140 667
Swap: 3535 0 3535
注意 free
(未使用)的內存可能會不足,而 available
(可用於啟動新的應用)會顯示更大的數量。這兩者的區別值得我們去關注。 可用 意味著它可以在需要時恢復使用,而 空閑 意味著現在就能夠使用。
什麼時候要擔心
如果 Linux 系統上的性能表現良好 —— 應用程序響應度高,命令行沒有顯示出問題 —— 很可能系統狀況良好。記住,一些應用也許會出於某種原因而變慢,但它不影響整個系統。
過多的硬故障也許表明確實存在問題,但要將其與觀察到的性能相比較。
一個好的方法是當可用內存接近 0 或者「 用作交換 」項顯著增長或波動時開始擔心。如果「可用」項佔總內存可用量的百分比合理,那麼就無需擔心,就像下面的例子那樣:
$ free -m
total used free shared buff/cache available
Mem: 3244 3069 35 49 140 667
Swap: 3535 0 3535
Linux 性能很複雜
拋開這些不說,Linux 系統上的內存可能會變滿,並且性能可能會降低。當系統出現問題時不要僅將單一的內存使用報告作為指標。
Linux 系統的內存管理很複雜,因為它採取的措施需要確保系統資源得到最好的利用。不要受到一開始內存佔滿的欺騙,使你認為系統存在問題,但實際上並沒有。
via: https://www.networkworld.com/article/3394603/when-to-be-concerned-about-memory-levels-on-linux.html
作者:Sandra Henry-Stocker 選題:lujun9972 譯者:LuuMing 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive