使用 Smem 輕鬆了解您的 Linux RAM 使用情況
已發表: 2022-01-29 Linux 內存使用情況可能難以解釋和理解。 使用smem
很容易找出進程正在使用的內存,以及哪些進程使用最多。
內存使用情況
Linux 為您提供了許多方法來檢查計算機 RAM 發生的情況。 問題是,內存管理對您的操作系統來說是一個複雜的挑戰。 它必須兼顧物理 RAM、交換空間形式的虛擬 RAM 以及隨時運行的不同類型進程的需求。
進程在將自己加載到內存時會消耗 RAM。 然後他們要求更多的 RAM,以便他們有空間來執行他們設計的任何任務。 一些進程幾乎不會影響 RAM,而另一些進程則非常消耗內存。
內核和操作系統的其餘部分、您的桌面環境以及您運行的每個應用程序或命令行會話都在要求您計算機中安裝的有限 RAM 的一部分。 一些進程產生其他進程。 一些進程與其他進程共享 RAM。
試圖破譯所有這些,並為“這個程序或進程使用多少 RAM?”這個問題想出一個簡單的答案。 可能是一個令人驚訝的挑戰。 粒度很棒並且有它的位置,但同樣,信息過度殺傷可能是一個障礙。
例如,使用cat
查看 /proc/meminfo 偽文件系統在用於研究本文的機器上返回了 50 行輸出。 你從哪裡開始?
貓 /proc/meminfo
一些 Linux 實用程序給出了不同的答案。 在我們的測試機器上,我們有一個less
running 的實例,它的進程 ID 為 2183。
我們可以使用帶有-x
(擴展)選項的pmap
實用程序來全面了解進程的內存使用情況。 我們將把它與我們的less
實例的進程 ID 一起使用:
pmap -x 2183
在輸出的底部,我們得到了 Resident Set Size 的總和,即正在使用的主 RAM 的數量。
然後,我們使用帶有-o
(輸出)選項的ps
實用程序,選擇RSS
列,並將相同的less
實例的進程 ID 傳遞給它:
ps -o rss 2183
我們得到不同的結果。 這是ps
作者的設計決定。 這是來自ps
man
頁:
其他實用程序的作者對如何測量 RAM 使用情況有自己的看法。
RSS、USS 和 PSS
駐留集大小 (RSS) 是分配給進程的 RAM 量,不包括交換空間,但包括進程正在使用的共享庫所需的任何 RAM。
RSS 幾乎總是過度報告 RAM 使用情況。 如果兩個或多個進程使用一個或多個共享庫,RSS 將簡單地將每個庫的 RAM 使用量添加到每個進程的 RAM 使用量計數中。 除了不准確之外,這還具有一定的諷刺意味。 共享庫意味著每個進程不需要加載自己的私有庫實例。 如果庫已經在內存中,它將共享那個庫——並減少 RAM 開銷。
比例集大小試圖通過在共享它的進程之間劃分共享內存量來解決這個問題。 如果有四個進程共享一些內存,PSS 報告每個進程都使用了 25% 的共享 RAM。 這是一個近似值,但它比 RSS 描繪的圖片更接近於正在發生的事情。
唯一集大小是進程獨占使用的 RAM 量,無論它是由進程直接使用,還是由僅由進程使用的庫使用。 同樣,它忽略了交換空間。 它只對真正的物理 RAM 感興趣。
USS 和 PSS 是smem
的作者 Matt Mackall 提出的術語和概念。
smem 實用程序
smem
實用程序報告進程、用戶、映射或系統範圍使用的內存。 在我們測試的所有發行版上,它都需要安裝。 要在 Ubuntu 上安裝它,請使用以下命令:
sudo apt install smem
要在 Fedora 上安裝smem
,您需要輸入:
須藤 dnf 安裝 smem
要在 Manjaro 上安裝smem
,請使用:
sudo pacman -Sy smem
使用不帶任何選項的smem
會為您提供正在使用 RAM 的進程的列表。
smem
信息表顯示在終端窗口中。
這些列是:
- PID :正在使用內存的進程的進程 ID。
- User :擁有該進程的用戶的用戶名。
- 命令:啟動進程的命令行。
- Swap :進程正在使用多少交換空間。
- USS :唯一集大小。
- PSS :比例集大小。
- RSS :駐留集大小。
要查看以百分比表示的大小,請使用-p
(百分比)選項。
smem -p
以字節為單位的大小已替換為百分比。
要查看以更人性化的形式呈現的圖形,請使用-k
(縮寫)選項。 這會縮小數字並添加單位指示符。
smem -k
大小以兆字節、千兆字節等顯示,而不是原始字節。
要添加總計行,請使用-t
(總計)選項。
smem -k -t
輸出的最後一行顯示每列的總計。
完善報告
您可以要求smem
報告用戶、映射(庫)或系統範圍的內存使用情況。 要按用戶過濾輸出,請使用-u
(用戶)選項。 請注意,如果您想查看的不僅僅是您自己的使用情況,您需要使用sudo
運行smem
。
smem -u
sudo smem -u
如您所見,對於超過八個字符的用戶名,輸出會變形。
要查看映射到正在使用的庫的使用情況,無論哪些進程正在使用這些庫,也不管哪些用戶擁有這些進程,請使用-m
(映射)選項。
smem -m -k -t
我們還要求提供人類可讀的值和總數。
要查看系統範圍的內存使用情況,請使用-w
(系統範圍)選項。
smem -w -k -t
報告單個程序
使用一點命令行魔法,我們可以報告單個程序及其所有子進程。 我們將smem
的輸出通過管道傳輸到tail
並要求tail
只顯示最後一行。 我們將告訴smem
使用人類可讀的值並提供總數。 總數將是最後一行,這就是將為我們顯示的行tail
。
我們將在smem
中使用-c
(列)選項,並告訴它我們希望哪些列包含在我們的輸出中。 我們將把它限制在 Proportional Set Size 列。 -P
(進程過濾器)選項允許我們為smem
提供搜索字符串。 僅包含匹配的輸出行。
smem -c pss -P firefox -k -t | 尾-n 1
這是找出程序及其子進程的 RAM 消耗的快速而簡潔的方法。
生成圖表
您可以通過--pie
或--bar
選項讓smem
生成圖表。 不得不說,如果類別太多,圖表很快就會變得難以理解,但它們對於快速的視覺概覽很有用。
命令格式為:
smem --pie 名稱 -s uss
餅圖顯示在其自己的查看器窗口中。
要查看其他圖,請使用pss
或rss
而不是uss
。 要查看條形圖,請使用--bar
而不是--pie
。
為此,您需要安裝 Python 以及matplotlib
庫。 這些已經安裝在我們測試的 Ubuntu、Fedora 和 Manjaro 發行版上。
好東西裝在小包裝裡
smem
實用程序還有一些技巧,建議您查看它的man
頁。 它的主要功能是我們在此處概述的內容,它是您的 CLI 工具箱中的一個很棒的小工具。
相關:你應該知道的 37 個重要的 Linux 命令