何時需要關注 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 中國”官方小程式來檢視
相關文章
- 使用大資料時,別忘了關注Linux記憶體管理器大資料Linux記憶體
- 關於C、Java、Python程式執行耗時及記憶體用量JavaPython記憶體
- Linux記憶體不夠了?看看如何開啟虛擬記憶體增加記憶體使用量Linux記憶體
- 關於Linux的記憶體(free -m)Linux記憶體
- 為什麼 Linux 需要虛擬記憶體Linux記憶體
- windows/vs如何獲取程式記憶體使用量和時間花費Windows記憶體
- js需要清楚的記憶體模型JS記憶體模型
- 為何記憶體被全部吃光記憶體
- linux記憶體管理(一)實體記憶體的組織和記憶體分配Linux記憶體
- Linux有什麼特點?為何受關注?Linux
- AI晶片需要怎樣的記憶體?AI晶片記憶體
- 選購防火牆時需要關注的5個效能(轉)防火牆
- Linux 記憶體管理:記憶體對映Linux記憶體
- 記憶體上的linux記憶體Linux
- linux的記憶體管理Linux記憶體
- 如何將Redis記憶體使用量降低一半? - DEVRedis記憶體dev
- 關於redis記憶體分析,記憶體優化Redis記憶體優化
- ARC下需要注意的記憶體管理記憶體
- 記憶體管理中關於記憶體每次增長的大小記憶體
- 獲取linux可用記憶體 剩餘記憶體Linux記憶體
- 有關記憶體的思考題記憶體
- 求助:關於linux下共享記憶體的問題(轉)Linux記憶體
- Linux共享記憶體的管理Linux記憶體
- Linux中的記憶體管理Linux記憶體
- 【Linux】Linux 的快取記憶體Linux快取記憶體
- 清理linux記憶體Linux記憶體
- linux記憶體管理Linux記憶體
- LINUX 記憶體管理Linux記憶體
- linux共享記憶體Linux記憶體
- 關於 ASP.NET 記憶體快取你需要知道的 10 點ASP.NET記憶體快取
- 電腦記憶體多大最好?談談電腦到底需要多大記憶體記憶體
- 關於程式的實體記憶體RSS記憶體
- Linux記憶體使用的體會(轉)Linux記憶體
- 執行緒相關記憶體引數sort_buffer/join_buffer等的記憶體分配時機執行緒記憶體
- 如何檢視linux系統中空閒記憶體/實體記憶體使用/剩餘記憶體Linux記憶體
- 關於 ASP.NET Core 記憶體快取你需要知道的 10 點ASP.NET記憶體快取
- golang的記憶體相關內容Golang記憶體
- 關於JavaScript的記憶體機制JavaScript記憶體