smem
很容易找出一个进程正在使用什么内存,以及哪些进程使用得最多。
内存使用情况
Linux 为您提供了许多方法来检查您计算机的RAM发生了什么。问题是,内存管理对您的操作系统来说是一个复杂的挑战。它必须兼顾物理 RAM、交换空间形式的虚拟 RAM 以及随时运行的不同类型进程的需求。
进程在将自己加载到内存时会消耗 RAM。然后他们要求更多的 RAM,以便他们有空间来执行他们设计的任何任务。一些进程几乎不会影响 RAM,而另一些进程则非常消耗内存。
内核和操作系统的其余部分、您的桌面环境以及您运行的每个应用程序或命令行会话都在要求您计算机中安装的有限 RAM 的一部分。一些进程产生其他进程。一些进程与其他进程共享 RAM。
试图破译所有这些,并为“这个程序或进程使用多少 RAM?”这个问题想出一个简单的答案。可能是一个令人惊讶的挑战。粒度很棒并且有它的位置,但同样,信息过度杀伤可能是一个障碍。
例如,使用 cat
to peek into the /proc/meminfo 伪文件系统 在用于研究本文的机器上返回 50 行输出。你从哪里开始?
猫 /proc/meminfo
一些 Linux 实用程序给出了不同的答案。在我们的测试机器上,我们有一个 running 实例less
,它的进程 ID 为 2183。
我们可以使用pmap
带有-x
(扩展)选项的实用程序来全面了解进程的内存使用情况。我们将它与我们的实例的进程 ID 一起使用less
:
pmap -x 2183
在输出的底部,我们得到了 Resident Set Size 的总和,即正在使用的主 RAM 的数量。
然后,我们使用ps
带有-o
(output) 选项的实用程序,选择RSS
列,并将相同实例的进程 ID 传递给它less
:
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 是 .的作者Matt Mackall 提出的术语和概念 smem
。
smem 实用程序
该smem
实用程序报告进程、用户、映射或系统范围使用的内存。在我们测试的所有 发行版上,它都需要安装。要在 Ubuntu 上安装它,请使用以下命令:
sudo apt install smem
要smem
在 Fedora 上安装,您需要输入:
须藤 dnf 安装 smem
要smem
在 Manjaro 上安装,请使用:
sudo pacman -Sy smem
不带选项使用smem
会为您提供正在使用 RAM 的进程的列表。
smem
信息表显示在终端窗口中。
这些列是:
- PID:正在使用内存的进程的进程 ID。
- User:拥有该进程的用户的用户名。
- 命令:启动进程的命令行。
- Swap:进程正在使用多少交换空间。
- USS:唯一集大小。
- PSS:比例集大小。
- RSS:驻留集大小。
要查看以百分比表示的大小,请使用-p
(percentage) 选项。
smem -p
以字节为单位的大小已替换为百分比。
要查看以更人性化的形式呈现的图形,请使用-k
(缩写)选项。这会缩小数字并添加单位指示符。
smem -k
大小以兆字节、千兆字节等显示,而不是原始字节。
要添加总计行,请使用-t
(总计)选项。
smem -k -t
输出的最后一行显示每列的总计。
完善报告
您可以要求smem
报告用户、映射(库)或系统范围的内存使用情况。要按用户过滤输出,请使用-u
(user) 选项。请注意,如果您想查看的不仅仅是您自己的使用情况,您需要smem
使用sudo
.
smem -u
sudo smem -u
如您所见,对于超过八个字符的用户名,输出会变形。
要查看映射到正在使用的库的使用情况,无论哪些进程正在使用这些库,也不管哪些用户拥有这些进程,请使用-m
(mapping) 选项。
smem -m -k -t
我们还要求提供人类可读的值和总数。
要查看系统范围的内存使用情况,请使用-w
(system-wide) 选项。
smem -w -k -t
报告单个程序
使用一点命令行魔法,我们可以报告单个程序及其所有子进程。我们将输出从 管道smem
输入tail
并要求tail
只显示最后一行。我们将告诉smem
使用人类可读的值并提供总数。总数将是最后一行,这就是tail
将为我们显示的行。
我们将使用-c
(columns) 选项smem
并告诉它我们希望将哪些列包含在我们的输出中。我们将把它限制在 Proportional Set Size 列。( -P
process filter) 选项允许我们给smem
. 仅包含匹配的输出行。
smem -c pss -P firefox -k -t | 尾-n 1
这是找出程序及其子进程的 RAM 消耗的快速而简洁的方法。
生成图表
您可以通过 --pie
or--bar
选项来smem
生成图表。不得不说,如果类别太多,图表很快就会变得难以理解,但它们对于快速的视觉概览很有用。
命令格式为:
smem --pie 名称 -s uss
饼图显示在其自己的查看器窗口中。
要查看其他图,请使用pss
或rss
代替uss
。要查看条形图,请使用--bar
代替--pie
。
为此,您需要安装Python以及matplotlib
库。这些已经安装在我们测试的 Ubuntu、Fedora 和 Manjaro 发行版上。
好东西装在小包装里
该smem
实用程序还有一些技巧,我们鼓励您查看它的man
页面。它的主要功能是我们在此处概述的内容,它是您的 CLI 工具箱中的一个很棒的小工具。