何時需要關注 Linux 的記憶體用量?
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 中國”官方小程式來檢視
相關文章
- 關於C、Java、Python程式執行耗時及記憶體用量JavaPython記憶體
- Linux記憶體不夠了?看看如何開啟虛擬記憶體增加記憶體使用量Linux記憶體
- 為什麼 Linux 需要虛擬記憶體Linux記憶體
- linux記憶體管理(一)實體記憶體的組織和記憶體分配Linux記憶體
- Linux有什麼特點?為何受關注?Linux
- Linux共享記憶體的管理Linux記憶體
- [Linux]共享記憶體Linux記憶體
- AI晶片需要怎樣的記憶體?AI晶片記憶體
- Linux實體記憶體管理Linux記憶體
- 如何將Redis記憶體使用量降低一半? - DEVRedis記憶體dev
- 關於redis記憶體分析,記憶體優化Redis記憶體優化
- Linux 的記憶體分頁管理Linux記憶體
- Linux的記憶體分頁管理Linux記憶體
- Linux共享記憶體(二)Linux記憶體
- Linux 虛擬記憶體Linux記憶體
- MRC 時代的記憶體管理記憶體
- Linux記憶體子系統——Locking Pages(記憶體鎖定)Linux記憶體
- Linux記憶體洩露案例分析和記憶體管理分享Linux記憶體洩露
- 如何檢視linux系統中空閒記憶體/實體記憶體使用/剩餘記憶體Linux記憶體
- Linux記憶體效能指標和工具的對應關係圖Linux記憶體指標
- Linux記憶體不足的處理方法Linux記憶體
- Linux記憶體是怎麼工作的?Linux記憶體
- Linux:深入淺出 Linux 共享記憶體Linux記憶體
- Linux 記憶體區管理 slabLinux記憶體
- linux記憶體管理(二)- vmallocLinux記憶體
- Linux記憶體、Swap、Cache、BufferLinux記憶體
- 2021年需要關注的15大軟體測試趨勢
- 關於JavaScript的記憶體機制JavaScript記憶體
- golang的記憶體相關內容Golang記憶體
- 記憶體優化相關記憶體優化
- 關於autoreleasepool記憶體管理記憶體
- (2)Linux效能調優之Linux記憶體體系Linux記憶體
- project中的堆疊記憶體,記憶體地址引用,gc相關問題Project記憶體GC
- 關於虛擬機器記憶體和JVM記憶體設定的思考虛擬機記憶體JVM
- [20191114]linux記憶體分配的討論.txtLinux記憶體
- 17 種檢視 Linux 實體記憶體的方法Linux記憶體
- JVM記憶體回收機制——哪些記憶體需要被回收(JVM學習系列2)JVM記憶體
- Linux 記憶體管理 pt.3Linux記憶體