打开网易新闻 查看精彩图片

Linux 内存使用情况可能难以解释和理解。很容易找出一个进程正在使用什么内存,以及哪些进程使用得最多。

smem

内存使用情况

Linux 为您提供了许多方法来检查您计算机的RAM发生了什么。问题是,内存管理对您的操作系统来说是一个复杂的挑战。它必须兼顾物理 RAM、交换空间形式的虚拟 RAM 以及随时运行的不同类型进程的需求。

打开网易新闻 查看精彩图片

有关的您的电脑需要多少 RAM 才能玩 PC 游戏?

进程在将自己加载到内存时会消耗 RAM。然后他们要求更多的 RAM,以便他们有空间来执行他们设计的任何任务。一些进程几乎不会影响 RAM,而另一些进程则非常消耗内存。

内核和操作系统的其余部分、您的桌面环境以及您运行的每个应用程序或命令行会话都在要求您计算机中安装的有限 RAM 的一部分。一些进程产生其他进程。一些进程与其他进程共享 RAM。

打开网易新闻 查看精彩图片

有关的如何从 Linux 终端检查内存使用情况

试图破译所有这些,并为“这个程序或进程使用多少 RAM?”这个问题想出一个简单的答案。可能是一个令人惊讶的挑战。粒度很棒并且有它的位置,但同样,信息过度杀伤可能是一个障碍。

例如,使用 to peek into the /proc/meminfo 伪文件系统 在用于研究本文的机器上返回 50 行输出。你从哪里开始?

cat

猫 /proc/meminfo

一些 Linux 实用程序给出了不同的答案。在我们的测试机器上,我们有一个 running 实例,它的进程 ID 为 2183。

less

我们可以使用带有(扩展)选项的实用程序来全面了解进程的内存使用情况。我们将它与我们的实例的进程 ID 一起使用:

pmap

less

pmap -x 2183

在输出的底部,我们得到了 Resident Set Size 的总和,即正在使用的主 RAM 的数量。

打开网易新闻 查看精彩图片

然后,我们使用带有(output) 选项的实用程序,选择列,并将相同实例的进程 ID 传递给它:

ps

-o

RSS

less

ps -o rss 2183

打开网易新闻 查看精彩图片

我们得到不同的结果。这是作者的设计决定。这是来自 页面:

ps

ps

man

SIZE 和 RSS 字段不计算进程的某些部分,包括页表、内核堆栈、struct thread_info 和 struct task_struct。这通常是始终驻留的至少 20 KiB 内存。SIZE 是进程的虚拟大小(代码+数据+堆栈)。

其他实用程序的作者对如何测量 RAM 使用情况有自己的看法。

RSS、USS 和 PSS

驻留集大小 (RSS) 是分配给进程的 RAM 量,不包括交换空间,但包括进程正在使用的共享库所需的任何 RAM。

打开网易新闻 查看精彩图片

有关的为什么计算机的 RAM 已满是件好事

RSS 几乎总是过度报告 RAM 使用情况。如果两个或多个进程使用一个或多个共享库,RSS 将简单地将每个库的 RAM 使用量添加到每个进程的 RAM 使用量计数中。除了不准确之外,这还具有一定的讽刺意味。共享库意味着每个进程不需要加载自己的私有库实例。如果库已经在内存中,它将共享那个库——并减少 RAM 开销。

比例集大小试图通过在共享它的进程之间划分共享内存量来解决这个问题。如果有四个进程共享一些内存,PSS 报告每个进程都使用了 25% 的共享 RAM。这是一个近似值,但它比 RSS 描绘的图片更接近于正在发生的事情。

唯一集大小是进程独占使用的 RAM 量,无论它是由进程直接使用,还是由仅由进程使用的库使用。同样,它忽略了交换空间。它只对真正的物理 RAM 感兴趣。

USS 和 PSS 是 .的作者Matt Mackall 提出的术语和概念 。

smem

smem 实用程序

该实用程序报告进程、用户、映射或系统范围使用的内存。在我们测试的所有 发行版上,它都需要安装。要在 Ubuntu 上安装它,请使用以下命令:

smem

sudo apt install smem

打开网易新闻 查看精彩图片

要在 Fedora 上安装,您需要输入:

smem

须藤 dnf 安装 smem

打开网易新闻 查看精彩图片

要在 Manjaro 上安装,请使用:

smem

sudo pacman -Sy smem

打开网易新闻 查看精彩图片

不带选项使用会为您提供正在使用 RAM 的进程的列表。

smem

smem

打开网易新闻 查看精彩图片

信息表显示在终端窗口中。

打开网易新闻 查看精彩图片

这些列是:

  • PID:正在使用内存的进程的进程 ID。
  • User:拥有该进程的用户的用户名。
  • 命令:启动进程的命令行。
  • Swap:进程正在使用多少交换空间?
  • USS:唯一集大小。
  • PSS:比例集大小。
  • RSS:驻留集大小。

要查看以百分比标示的大小,请使用(percentage) 选项。

-p

smem -p

打开网易新闻 查看精彩图片

以字节为单位的大小已替换为百分比。

打开网易新闻 查看精彩图片

要查看以更人性化的形式呈现的图形,请使用(缩写)选项。这会缩小数字并添加单位指示符。

-k

smem -k

打开网易新闻 查看精彩图片

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

打开网易新闻 查看精彩图片

要添加总计行,请使用(总计)选项。

-t

smem -k -t

打开网易新闻 查看精彩图片

输出的最后一行显示每列的总计。

打开网易新闻 查看精彩图片

完善报告

您可以要求报告用户、映射(库)或系统范围的内存使用情况。要按用户过滤输出,请使用(user) 选项。请注意,如果您想查看的不仅仅是您自己的使用情况,您需要使用.

smem

-u

smem

sudo

smem -u

sudo smem -u

打开网易新闻 查看精彩图片

如您所见,对于超过八个字符的用户名,输出会变形。

要查看映射到正在使用的库的使用情况,无论哪些进程正在使用这些库,也不管哪些用户拥有这些进程,请使用(mapping) 选项。

-m

smem -m -k -t

打开网易新闻 查看精彩图片

我们还要求提供人类可读的值和总数。

打开网易新闻 查看精彩图片

要查看系统范围的内存使用情况,请使用(system-wide) 选项。

-w

smem -w -k -t

打开网易新闻 查看精彩图片

报告单个程序

使用一点命令行魔法,我们可以报告单个程序及其所有子进程。我们将输出从 管道输入 并要求只显示最后一行。我们将告诉使用人类可读的值并提供总数。总数将是最后一行,这就是将为我们显示的行。

smem

tail

tail

smem

tail

我们将使用(columns) 选项并告诉它我们希望将哪些列包含在我们的输出中。我们将把它限制在 Proportional Set Size 列。( process filter) 选项允许我们给. 仅包含匹配的输出行。

-c

smem

-P

smem

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

打开网易新闻 查看精彩图片

这是找出程序及其子进程的 RAM 消耗的快速而简洁的方法。

生成图表

您可以通过or选项来生成图表。不得不说,如果类别太多,图表很快就会变得难以理解,但它们对于快速的视觉概览很有用。

--pie

--bar

smem

命令格式为:

smem --pie 名称 -s uss

饼图显示在其自己的查看器窗口中。

打开网易新闻 查看精彩图片

要查看其他图,请使用或代替。要查看条形图,请使用代替。

pss

rss

uss

--bar

--pie

为此,您需要安装Python以及 库。这些已经安装在我们测试的 Ubuntu、Fedora 和 Manjaro 发行版上。

matplotlib

好东西装在小包装里

该 实用程序还有一些技巧,我们鼓励您查看它的页面。它的主要功能是我们在此处概述的内容,它是您的 CLI 工具箱中的一个很棒的小工具。

smem

man