使用 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 命令