使用 Smem 輕鬆了解您的 Linux RAM 使用情況

已發表: 2022-01-29
筆記本電腦屏幕在紅色背景上顯示 Bash shell 徽標
fatmawati achmad zaenuri/Shutterstock

Linux 內存使用情況可能難以解釋和理解。 使用smem很容易找出進程正在使用的內存,以及哪些進程使用最多。

內存使用情況

Linux 為您提供了許多方法來檢查計算機 RAM 發生的情況。 問題是,內存管理對您的操作系統來說是一個複雜的挑戰。 它必須兼顧物理 RAM、交換空間形式的虛擬 RAM 以及隨時運行的不同類型進程的需求。

您的電腦需要多少 RAM 才能玩 PC 遊戲?
相關PC 遊戲需要多少內存?

進程在將自己加載到內存時會消耗 RAM。 然後他們要求更多的 RAM,以便他們有空間來執行他們設計的任何任務。 一些進程幾乎不會影響 RAM,而另一些進程則非常消耗內存。

內核和操作系統的其餘部分、您的桌面環境以及您運行的每個應用程序或命令行會話都在要求您計算機中安裝的有限 RAM 的一部分。 一些進程產生其他進程。 一些進程與其他進程共享 RAM。

如何從 Linux 終端檢查內存使用情況
相關如何從 Linux 終端檢查內存使用情況

試圖破譯所有這些,並為“這個程序或進程使用多少 RAM?”這個問題想出一個簡單的答案。 可能是一個令人驚訝的挑戰。 粒度很棒並且有它的位置,但同樣,信息過度殺傷可能是一個障礙。

廣告

例如,使用cat查看 /proc/meminfo 偽文件系統在用於研究本文的機器上返回了 50 行輸出。 你從哪裡開始?

 貓 /proc/meminfo

一些 Linux 實用程序給出了不同的答案。 在我們的測試機器上,我們有一個less running 的實例,它的進程 ID 為 2183。

我們可以使用帶有-x (擴展)選項的pmap實用程序來全面了解進程的內存使用情況。 我們將把它與我們的less實例的進程 ID 一起使用:

 pmap -x 2183 

查詢單個進程的內存映射

在輸出的底部,我們得到了 Resident Set Size 的總和,即正在使用的主 RAM 的數量。

單個 less 實例的 pmap 輸出

然後,我們使用帶有-o (輸出)選項的ps實用程序,選擇RSS列,並將相同的less實例的進程 ID 傳遞給它:

 ps -o rss 2183 

使用ps查看less同一個實例的RSS

我們得到不同的結果。 這是ps作者的設計決定。 這是來自ps man頁:

SIZE 和 RSS 字段不計算進程的某些部分,包括頁表、內核堆棧、struct thread_info 和 struct task_struct。 這通常是始終駐留的至少 20 KiB 內存。 SIZE 是進程的虛擬大小(代碼+數據+堆棧)。
廣告

其他實用程序的作者對如何測量 RAM 使用情況有自己的看法。

RSS、USS 和 PSS

駐留集大小 (RSS) 是分配給進程的 RAM 量,不包括交換空間,但包括進程正在使用的共享庫所需的任何 RAM。

為什麼計算機的 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 

在 Ubuntu 上安裝 smem

要在 Fedora 上安裝smem ,您需要輸入:

 須藤 dnf 安裝 smem 

在 Fedora 上安裝 smem

要在 Manjaro 上安裝smem ,請使用:

 sudo pacman -Sy smem 

在 Manjaro 上安裝 smem

廣告

使用不帶任何選項的smem會為您提供正在使用 RAM 的進程的列表。

 smem 

在沒有命令行選項的情況下調用 smem

信息表顯示在終端窗口中。

smem 的默認輸出

這些列是:

  • PID :正在使用內存的進程的進程 ID。
  • User :擁有該進程的用戶的用戶名。
  • 命令:啟動進程的命令行。
  • Swap :進程正在使用多少交換空間。
  • USS :唯一集大小。
  • PSS :比例集大小。
  • RSS :駐留集大小。

要查看以百分比表示的大小,請使用-p (百分比)選項。

 smem -p 

使用 smem -p 選項請求百分比

以字節為單位的大小已替換為百分比。

smem 輸出顯示百分比

要查看以更人性化的形式呈現的圖形,請使用-k (縮寫)選項。 這會縮小數字並添加單位指示符。

 smem -k 

使用 smem -k 選項顯示帶有單位指示符的大小

大小以兆字節、千兆字節等顯示,而不是原始字節。

使用 K、M 和 G 等單位指標的 smem 輸出

廣告

要添加總計行,請使用-t (總計)選項。

 smem -k -t 

使用 smem -t 選項在輸出中添加總計行

輸出的最後一行顯示每列的總計。

smem 輸出底部的總計行

完善報告

您可以要求smem報告用戶、映射(庫)或系統範圍的內存使用情況。 要按用戶過濾輸出,請使用-u (用戶)選項。 請注意,如果您想查看的不僅僅是您自己的使用情況,您需要使用sudo運行smem

 smem -u
 sudo smem -u 

使用帶和不帶 sudo 的 smem -u 選項

如您所見,對於超過八個字符的用戶名,輸出會變形。

要查看映射到正在使用的庫的使用情況,無論哪些進程正在使用這些庫,也不管哪些用戶擁有這些進程,請使用-m (映射)選項。

 smem -m -k -t 

使用 smem -m 選項獲取映射器報告

我們還要求提供人類可讀的值和總數。

smem 映射報告顯示庫的內存使用情況

要查看系統範圍的內存使用情況,請使用-w (系統範圍)選項。

 smem -w -k -t 

smem 系統範圍報告

報告單個程序

使用一點命令行魔法,我們可以報告單個程序及其所有子進程。 我們將smem的輸出通過管道傳輸到tail並要求tail只顯示最後一行。 我們將告訴smem使用人類可讀的值並提供總數。 總數將是最後一行,這就是將為我們顯示的行tail

廣告

我們將在smem中使用-c (列)選項,並告訴它我們希望哪些列包含在我們的輸出中。 我們將把它限制在 Proportional Set Size 列。 -P (進程過濾器)選項允許我們為smem提供搜索字符串。 僅包含匹配的輸出行。

 smem -c pss -P firefox -k -t | 尾-n 1 

使用 smem 顯示進程及其子進程的內存使用情況

這是找出程序及其子進程的 RAM 消耗的快速而簡潔的方法。

生成圖表

您可以通過--pie--bar選項讓smem生成圖表。 不得不說,如果類別太多,圖表很快就會變得難以理解,但它們對於快速的視覺概覽很有用。

命令格式為:

 smem --pie 名稱 -s uss 

要求 smem 製作餅圖

餅圖顯示在其自己的查看器窗口中。

在其自己的查看器窗口中的 smem 餅圖

要查看其他圖,請使用pssrss而不是uss 。 要查看條形圖,請使用--bar而不是--pie

廣告

為此,您需要安裝 Python 以及matplotlib庫。 這些已經安裝在我們測試的 Ubuntu、Fedora 和 Manjaro 發行版上。

好東西裝在小包裝裡

smem實用程序還有一些技巧,建議您查看它的man頁。 它的主要功能是我們在此處概述的內容,它是您的 CLI 工具箱中的一個很棒的小工具。

相關:你應該知道的 37 個重要的 Linux 命令