如何在 Linux 上使用 free 命令

Linux free 命令显示您的计算机内存有多少正在使用,还有多少可供程序使用。 它的输出可能会让初学者感到困惑,但我们将向您展示如何理解它。

自由命令

free 命令在终端窗口中打印内存使用情况的快速摘要。 它 没有很多选择 或耍花招,学习如何使用它并不需要太多时间或精力。 然而,要学会正确解释它提供的信息,那就是另一回事了。 很容易被免费告诉你的东西弄糊涂。

这部分是由于术语——比如“免费”和“可用”之间的区别——部分是由于 Linux 内核的内存和文件系统管理例程的内部工作原理。 如果您有内核可以充分利用的空闲内存,它会为自己的目的借用它。 直到你需要它回来。

我们将深入研究底层机制和数据例程,以便您了解幕后发生的事情,以及所有这些如何影响您的使用 随机存取存储器 (内存)。

免费的专栏

让我们在没有任何选择的情况下免费启动,看看我们得到了什么:

free

那是一种丑陋的方式。 在您的计算机上,您将能够拉伸终端窗口。 这是一个更整洁的表格中的输出:

        total   used   free   shared buff/cache  available
Mem:  2038576 670716 327956    14296    1039904    1187160
Swap: 1557568 769096 788472

这些数字在 千字节,即 1024 字节。 在 Manjaro 上,free 命令别名为 free -m。 这强制免费使用 兆字节,即 1,048,576 字节。 在其他发行版上,默认值为千字节。

顶行报告系统内存,底行报告交换空间。 我们将在这里介绍这些列,然后稍后再详细了解它们。 内存行的列如下:

总计:计算机中安装的物理 RAM 总量。
Used:这是通过 Total-(Free+Buffers+Cache) 计算的。
空闲:未使用的内存量。 为什么不总计=已使用+免费? 我们将很快解释这一点。
Shared:tmpfs 文件系统使用的内存。
Buff/cache:用于缓冲区和缓存的内存。
可用:这是对可用于服务来自应用程序的内存请求的内存的估计,计算机中的任何其他功能软件,例如您的图形 桌面环境 和 Linux 命令。

对于交换行,列是:

Total:交换分区或交换文件的大小。
已使用:正在使用的交换空间量。
Free:剩余的(未使用的)交换空间

宽屏显示器

要将 Buff/cache 图形分隔到它们自己的列中,请使用 -w(宽)选项:

free -w

这就是结果。 我们得到的是 Buffers 列和 Cache 列,而不是 Buff/cache 列。 以下是表格中的数字:

        total   used   free   shared  buffers   cache  available
Mem:  2038576 683724 265708    14660    94568  994596    1160420
Swap: 1557568 761416 796152

让我们看看列中的数字代表什么。

总计栏

这是最简单的。 这是您在主板上安装了多少 RAM。 这是所有正在运行的进程都在争夺的宝贵资源。 如果内核没有裁判,至少他们会打架。

顺便说一下,free 收集信息的地方是 /proc/meminfo 伪文件。 您可以使用以下命令自己查看此文件:

less /proc/meminfo

输出是名称和值的单个列表。

使用过的列

这是它开始变得有趣的地方。

使用过的数字代表您可能期望的,以及一堆其他的东西。 这是分配给进程、由用户程序占用并由诸如 侏儒 或者 KDE 桌面环境。 那里没有惊喜。 但它也包括 Buffers 和 Cache 数字。

未用于某事的 RAM 是浪费的 RAM。 内核使用备用 RAM 来保存高速缓存和缓冲区,使其能够更有效地运行。 所以这个RAM被内核用于某些东西,而不是被任何东西 用户空间.

如果收到的内存请求只能通过放弃一些内核用于其自己设备的 RAM 来服务,那么这就是无缝地发生的情况。 释放此 RAM 并将其用于其他应用程序不会影响您的 Linux 系统的正确操作——不会有任何问题——但它可能会影响系统的性能。

所以这个专栏的真正意思是“被某物使用的所有 RAM,即使它可以立即回收。”

免费专栏

此列包含没有被任何东西使用的 RAM 量的数字。 因为 Used 列包含 Buffers 和 Cache 数字,所以对于运行良好的 Linux 系统来说,很少有 RAM 被列为“空闲”的情况并不少见。

这不一定是坏事,几乎可以肯定的是,您拥有一个正常运行的系统,可以正确调节 RAM 的使用。 也就是说,RAM 被应用程序和其他用户空间进程以及内核使用,以努力使您的计算机性能尽可能好。

共享专栏

Shared 列中的数字表示专门用于保存 tmpfs 的内存 基于 RAM 的文件系统. 这些是在内存中创建的文件系统,以促进操作系统的有效运行。 要查看存在哪些 tmpfs 文件系统,请使用 df 命令.

我们使用的选项是:

-h(人类):使用合理的、最合适的单位。
–total:在输出底部显示一行总计。
–type=tmpfs:仅报告 tmpfs 文件系统。

df -h --total --type=tmpfs

当您查看这些值时,首先想到的是它们比共享列中的数字大很多倍。 此处显示的大小是这些文件系统的最大大小。 实际上,它们每个只占用所需的内存。 Shared 列中的数字是值得信赖的内存使用情况。

这些文件系统包含什么? 这是一个快速细分:

/run:这包含许多临时文件,例如 PID 文件, 系统 不必在重新启动后保留的日志,相关信息 Unix 域套接字, 先进先出和管理 守护进程.
/dev/shm:这允许执行 符合 POSIX 标准 内存管理开启 Debian 和 Debian 派生的 Linux 发行版。
/run/lock:保存锁定文件。 这些用作指示器,让系统知道文件或其他共享资源正在使用中。 他们包含 进程的PID 使用该资源。
/sys/fs/cgroup:这是管理方案的核心元素 对照组. 进程根据它们使用的资源类型被组织成分层组。 它允许监控和限制进程对资源的使用。
/run/user/121:这是一个由 pam_systemd 为用户存储临时文件。 在这种情况下,用户的 ID 为 121。请注意,“用户”可能是普通用户、守护进程或其他进程。
/run/user/1000:这是一个由 pam_systemd 为该用户存储临时文件,该用户的用户 ID 为 1000。这是当前用户,用户 dave。

缓冲区和缓存列

缓冲区和缓存列仅在您使用了 -w(宽)时才会出现。 如果没有 -w 选项,这两列中的数字将合并到 Buff/cache 列中。

这两个内存区域相互作用并相互依赖。 缓存区保存(主要)数据 已从硬盘读取. 如果您需要再次访问它,它会被保留。 从缓存中提取数据比从硬盘驱动器读取数据更快。 缓存还可以保存已修改但尚未写回硬盘驱动器的数据,或已计算但尚未保存到文件的值。

为了跟踪各种文件碎片和数据存储,内核在缓冲区内存区域中为缓存内存区域建立索引。 缓冲区是保存磁盘块和其他信息结构的内存部分。 这些包含有关保存在高速缓存内存区域中的数据的数据。 所以缓冲区是缓存的元数据。

当发出文件读取请求时,内核读取缓冲区数据结构中的数据,以查找已请求的文件或文件片段。 如果找到,则从缓冲区数据结构指向的高速缓存内存区域为请求提供服务。 如果它不存在于缓存中——因此也不存在于缓冲区内存区域的元数据中——则从硬盘驱动器中读取该文件。

缓冲存储区中的结构是:

缓冲区头:每个缓冲区都在一个 称为缓冲区头的数据块. 此外,如果块中的数据发生更改并且相关的内存页面“变脏”,则描述符会跟踪将数据写回硬盘驱动器的需要。
索引节点:索引节点 保存有关文件和目录的元数据,包括它们在硬盘驱动器(或虚拟文件系统)上的位置、文件大小和文件的时间戳。
Dentries:一个dentry(目录条目)是一个结构 保存目录列表信息. 将这些视为目录中文件和目录的 inode 列表。

您可以看到为什么将用于缓冲区和缓存内存区域的内存压缩为单个 Buff/cache 列是有意义的。 它们就像同一事物的两个部分。 如果没有缓冲存储器区域为其内容提供索引,则高速缓冲存储器区域将毫无用处。

可用列

可用列是 Free 列加上 Buffers 和 Cache 列(或 Buff/cache 列)可以立即放弃的部分的总和。 可用列是估计值,而不是精确数字。 这是一个有根据的估计和准确的估计,但不应将其视为精确到最后一个字节。

更改显示单位

要更改自由显示图形的单位,请使用以下选项之一。

-b:以字节为单位显示值。
-k:以千字节为单位显示值(这是默认值)。
-m:以 mibibytes 显示值。
-g:以千兆字节为单位显示值。
-h:以合理的最佳拟合单位(人类可读)单位显示值。

例如,要使用人类可读的值,请使用 -h 选项:

free -h

free 将为每个值使用最合适的单位。 如您所见,一些值以 MiB 为单位显示,其中一些以 GiB 为单位。

显示总计

–total 选项导致 free 显示一个总计行,该行对 Mem 和 Swap 行的 Total、Used 和 Free 列的值求和。

free -h --total

计数选项

-c (count) 选项告诉 free 运行一定次数,每次之间暂停一秒钟。 要自由运行两次,请使用以下命令:

free -h -c 2

持续自由运行

如果您想查看某个应用程序对您的内存使用量的影响,连续自由运行可能会很有用。 这使您可以在启动、使用和关闭正在调查的应用程序时在终端窗口中自由运行。

-s(秒)选项确定每次运行免费之间的暂停持续时间。 要在每次更新之间有 3 秒的暂停连续自由运行,请使用以下命令:

free -s 3

按 Ctrl+C 停止进程并返回命令提示符。

结合计数和秒选项

要在每次更新之间有指定的暂停但在一定数量的报告后停止自由运行,请结合 -s(秒)和 -c(计数)选项。 要在每次更新之间暂停 2 秒自由运行五次,请使用以下命令:

free -s 2 -c 5

出现五个更新后,该过程将自行终止,您将返回到命令提示符。

分离低内存和高内存

现在这用处不大,但如果您在 32 位计算机上运行 Linux,它可能会很有用。 它将内存使用与低内存和高内存分开。

在基于 32 位 Linux 的操作系统上,CPU 最多可以寻址 4GB 内存。 内存分为低位内存和高位内存。 低内存直接映射到内核的部分地址空间。 高内存没有直接的内核映射。 高内存通常高于 896 MB。

这意味着内核本身(包括它的活动模块)只能使用低内存。 用户进程——任何不是内核本身的东西——都可能使用低内存和高内存。

在 64 位计算机上,不会显示高内存值:

free -h -l

回忆由此而来

快速回顾:

总计:系统中安装的 RAM 量。
Used:等于 Total-(Free+Buffers+Cache)。
空闲:任何东西完全未使用的内存量。
Shared:tmpfs 文件系统占用的内存。
缓冲区:为存储在缓存中的所有内容提供索引而维护的数据结构。
缓存:从硬盘读取的数据、等待写回硬盘的修改数据以及其他计算值。
可用:什么是真正免费的。 Free、Buffer 和 Cache 中可用于满足内存请求的内存估计值。