如何在 Linux 中检查内存

2025年3月17日 | 阅读 12 分钟

引言

我们的 Linux 系统需要以出色的水平运行。终端的一些简单命令可以访问每个相应的信息,并支持我们监控统计数据。

在本主题中,我们将了解一些用于检查 Linux 中内存使用情况的重要命令。

此外,我们将详细解释它们的作用以及更重要的是如何说明输出。

这些命令将在几乎所有 Linux 发行版上执行。结果和命令使用 Ubuntu 20.04 版本进行表示。

前提条件

  • 终端或命令行权限
  • 具有 sudo 权限的用户
  • apt 包管理器

检查 Linux 中内存使用情况的命令

cat 命令用于显示 Linux 内存详细信息

在我们的命令行中键入 cat /proc/meminfo 会打开一个文件,即 /proc/meminfo

这是一个虚拟文件,用于显示已用和可用内存的数量。它包括有关系统内存的实时详细信息,以及内核使用的共享和缓冲区内存。

结果可能因操作系统和体系结构而略有不同。这是 Linux Ubuntu 20.04 中 /proc/meminfo 文件外观的示例

How to Inspect Memory in Linux

注意:命令行以 KB 为单位显示详细信息。

/proc/meminfo 是什么?

在某些情况下,命令会借助一个名为 /proc/meminfo 的文件获取信息。我们可以通过使用命令 less /proc/meminfo 直接读取此文件。

我们可以使用 less 命令在输出中上下滚动,以找到我们确切需要的内容。

我们必须了解关于 /proc/meminfo 文件的一点是,它不是一个实际文件。相反,/proc/meminfo 文件是一个包含系统动态和实时详细信息的虚拟文件。我们将希望检查以下特定值:

  • MemAvailable
  • MemFree
  • MemTotal
  • Buffers
  • Cached
  • SwapFree
  • SwapTotal
  • SwapCached

如果我们想使用 /proc/meminfo 文件进行更高级的操作,我们可以结合使用 egrep 命令。

MemTotal:描述可用的总 RAM(不包括某些保留位和内核的二进制代码)。

MemFree:指定 HighFree+LowFree 的总和。当前存在的 RAM 量。

MemAvailable:估计可用于启动新应用程序而无需交换的内存量。

Buffers:指定磁盘块(原始)的临时存储。它将减少硬盘的输入和输出。此外,由于数据已在内存中,因此可以加快对相似数据的连续访问。

Cached:指定通过硬盘读取的缓存页(除 SwapCached 外)。

SwapCached:描述已换入和换出的内存。副本将保留在交换空间内。

Inactive:指的是已使用但最近未使用的内存。很可能它是一个可回收的候选。

Active:指的是最近使用的内存。如果不是必需的,则不会被回收。

Inactive (anon):定义可供回收(或内存回收)的 shmem、tmpfs 和匿名内存的数量。

Active (anon):定义分配给 tmpfs 伪文件系统中创建的文件以及不位于硬盘上的匿名文件的内存。

Inactive (file):描述从硬盘读取的、可供回收的文件缓存内存量。

Active (file):定义正在使用的文件缓存内存量。此外,此文件已在本轮内存回收中使用过。

Unevictable:指的是必须可驱逐但由于被用户空间进程锁定在内存中而无法驱逐的内存量。

Mlocked:定义因被多个用户空间进程锁定而不可驱逐的总内存量。

HighTotal:定义总 HighMem 量。它用于页面缓存和用户空间程序。内核可以授权此内存区域。虽然,它授权的速度不如 LowMem 快。

HighFree:描述空闲 HighMem 量。

LowTotal:定义 LowMem 量。它用于与 HighMem 相同的用途,也用于内核的用途。

LowFree:描述空闲 LowMem 量。

MmapCopy:定义已映射到文件数据的内存量。

SwapFree:指的是当前未使用的交换空间量。

SwapTotal:指的是可用交换空间量。

Dirty:定义延迟写入磁盘的内存量。

Writeback:描述正在积极写回磁盘的内存。

AnonPages:描述映射到用户空间页面表的已支持页面(非文件)。

Mapped:定义可映射到内存的文件(如库)。

Shmem:表示 tmpfs 伪文件系统内部消耗的内存量。

Slab:描述内核数据结构的缓存。

KReclaimable:表示内核可能会在内存需求足够严重时尝试回收的内核内存分配。

SReclaimable:描述可能被回收的 Slab 内存量,例如缓存。

SUnreclaim:定义到页面表最低级别的 Slab 内存量。

KernelStack:指的是分配给内核堆栈的内存量。

Quicklists:它很重要,并且速度尽可能快,因为页面表的删除和分配是一个非常快速的操作。因此,用于页面表的页面可以缓存在一个不同的列表编号中,称为 “quicklists”

PageTables:定义分配给页面表最低级别的内存量。

NFS_Unstable:网络文件系统页面已收到服务器,但尚未写入非易失性存储。

Bounce:定义用于块设备反弹缓冲区的内存。反弹缓冲区可以放置在足够低的内存中,以便设备可以直接访问它。然后,数据将被复制到 HighMem 中的选定用户页面。

WritebackTmp:定义 用户空间文件系统(或 FUSE)用于写回缓冲区(临时)的内存。

CommitLimit:描述当前可分配给系统的总内存量。

Committed_As:表示估计满足所有当前需求的内存量。当程序请求少量 RAM 时,此请求将被记录,RAM 只在程序开始使用时分配。

VmallocTotal:定义总 vmalloc 内存区域大小。

VmallocUsed:描述已使用的 vmalloc 区域量。此选项自 Linux 4.4 版本以来不再测量,因为它已硬编码。

VmallocChunk:表示最大的空闲 vmalloc 连续块区域。

HardwareCorrupted:定义标记为包含物理内存损坏问题的内存量。它不会被分配。

AnonHugePages:指的是映射到用户空间页面表的已支持巨型页面(非文件)。已支持页面(非文件)不是来自任何硬盘文件。

LazyFree:定义处于 MADV_FREE 状态的内存量。如果应用程序在页面范围内设置了 MADV_FREE 标志。这表明它们不再需要它们,并且它们现在是可回收的候选。

原始回收可能会延迟到内存需求足够时。当应用程序开始写入页面时,回收可能会被取消。

ShmemPmdMapped:定义使用巨型页面映射到用户空间的共享内存量。

ShmemHugePages:定义使用巨型页面分配的伪文件系统(tmpfs)和共享内存(shmem)所使用的内存量。

CmaTotal:描述 CMA(连续内存分配器)页面量。这些页面由只能与连续内存区域通信的设备使用。

Hugepagesize:定义巨型页面大小。

HugePages_Surp:表示池中高于指定值的巨型页面数量。

HugePages_Free:指的是池中(未分配)的巨型页面数量。

HugePages_Total:描述巨型页面池的大小。

DirectMap1G:定义映射到 2GB 页面的 RAM 字节数。

DirectMap2M:表示映射到 2MB 页面的 RAM 字节数。

DirectMap4M:描述映射到 4MB 页面的 RAM 字节数。

DirectMap4k:指的是映射到 4kb 页面的 RAM 字节数。

free 命令显示交换和物理内存量

在我们的命令行中输入 free 会得到以下输出

How to Inspect Memory in Linux

数据以 KB 为单位显示交换内存和可用或已用内存的数值。

  1. total:定义总安装内存。
  2. used:指定当前正在执行的进程使用的内存。
    (user= total - free - buff/cache)
  3. free:表示未使用的内存。
    (free= total - used - buff/cache)
  4. shared:定义被多个进程共享的内存。
  5. buffers:指定操作系统保留的内存,用于在进程需要时分配为缓冲区。
  6. cached:描述当前保存在 RAM 中的已用文件。
  7. cache/buff:缓存 + 缓冲区
  8. available:估计有多少内存可用于启动新应用程序而无需交换。

与 /proc/meminfo 文件相比,free 命令提供的信息较少。但是,它更容易理解。最重要的数值是可用值,因为它显示了运行新应用程序的可用内存量。

此外,free 命令包含多个用于格式化结果的选项。因此,它可以更好地满足我们的需求。下表列出了 free 命令的有用版本。

-k:结果以千字节为单位

-b:结果以字节为单位

-m:结果以兆字节为单位

-g:结果以千兆字节为单位

-o:旧格式(无 +/-buffers/cache 行)

-l:详细的高低内存统计信息

-c:更新 [count] 次

-s:每 [delay] 秒更新一次

-t:交换 + RAM 的总计

注意:键入 man free 会显示输出的描述和每个变体的概述,就像几乎所有命令一样。

vmstat 命令用于报告虚拟内存统计信息

vmstat 命令很有用,用于报告虚拟内存统计信息。vmstat 命令提供有关 CPU 活动、陷阱、块 IO、分页、内存和进程的基本详细信息。

语法


How to Inspect Memory in Linux

下面提到的详细描述解释了所有值,以防我们需要帮助来分析输出。

Procs

b:进程数处于休眠状态(不可中断)

r:由于运行时间而剩余的进程数

内存

cache:用作缓存的内存量。

buff:用作缓冲区的内存量。

free:空闲内存量。

swpd:使用的虚拟内存量。

掉期 (Swap)

so:内存已交换到磁盘(/s)。

si:内存通过磁盘交换回来(/s)。

IO

bo:传输到块设备(块/秒)的块。

bi:从块设备接收(块/秒)的块。

System

cs:每秒上下文切换次数。

in:每秒中断数(包括时钟)。

CPU - 这些是总 CPU 时间百分比。

us:执行非内核代码(用户时间加上 nice 时间)所花费的时间。

id:空闲使用时间。在 Linux 2.5.41 版本之前包括 IO 等待时间。

sy:执行内核代码(系统时间)所花费的时间。

st:被虚拟机窃取的时间。在 Linux 2.6.11 版本之前未知。

wa:等待 IO 所花费的时间。在 Linux 2.5.41 版本之前包含在空闲时间中。

top 命令用于检查内存使用情况

top 命令对于检查每个进程的 CPU 和内存使用情况非常有用。它显示有关以下内容的详细信息:

  • 平均负载
  • 正常运行时间
  • 正在运行的任务
  • 交换/内存系统进程
  • CPU 利用率/CPU 内存
  • 登录的用户数

数据会持续更新,这使我们能够实时跟踪进程。

How to Inspect Memory in Linux

除了提供必要的内存详细信息外,top 命令还提供有限的交互界面。

可以通过应用许多命令行选项来执行和构造操作。

在 Linux 中,man 命令,即 man top,可以提供可用变体的完整列表。

以下是我们将在一行中找到的详细信息

第一行:它指定了系统运行的时间,过去 15、5 和 1 分钟的平均负载,以及登录的用户数。

第二行:它定义了操作的数量及其状态:僵尸、睡眠、停止或运行。

第三行:它提供 CPU 的信息。

第四行:它定义了总物理内存量,以及缓存、缓冲区、已用和空闲内存的量。

第五行:它描述了总交换内存量,以及可用、已用和空闲内存的量(考虑到可从缓存中恢复的内存)。

第三行中 CPU 的各种字段描述如下:

sy:CPU 在内核空间执行系统进程所花费的时间。

us:CPU 在用户空间运行用户进程所花费的时间。

ni:CPU 在运行具有 nice 值(手动设置)的进程所花费的时间。

id:定义 CPU 空闲时间。

wa:CPU 等待 I/O 结束所花费的时间。

hi:CPU 在服务硬件中断所花费的时间。

si:CPU 在服务软件中断所花费的时间。

st(窃取时间):CPU 因执行虚拟机而丢失的时间。

我们可能需要单击左右箭头按钮来查看所有列。所有列中的值如下:

PID:进程 ID。

PR:进程优先级的缩写。

USER:定义进程所有者的名称。

NI:指定进程的 nice 值。

RES:进程使用的驻留内存。

VIRT:进程使用的虚拟内存。

SHR:进程使用的共享内存。

S:表示进程状态。

%MEM:定义使用的物理内存份额。

%CPU:定义自上次更新以来进程使用的 CPU 时间份额。

COMMAND:表示命令名称或行(选项 + 名称)。

TIME+:指定操作在 100 分之一秒内使用的总 CPU 时间。

S 列中显示的 S 状态可以是以下任何一种:

D:不可中断睡眠。

S:睡眠

R:运行

Z:僵尸

T:被跟踪(停止)

htop 命令用于检查进程内存负载

htop 命令提供的信息与 top 命令相同。但是,top 命令的实际优点在于其改进的控件和用户友好的环境。

该命令使用颜色显示结果,为进程显示完整的命令行,并提供水平和垂直滚动的选项。

语法


How to Inspect Memory in Linux

顶部包含文本计数器和图形仪表。它还提供摘要信息。

下部设计了每个进程的详细信息。它允许我们轻松地对单个进程执行操作。

屏幕底部提到的许多快捷方式使我们能够快速执行和自定义进程,而无需键入特定命令。

注意:如果尝试执行 htop 命令时遇到“Command htop not found”消息,首先需要安装 htop 函数。


How to Inspect Memory in Linux

改用以下命令


How to Inspect Memory in Linux

使用 GUI 在 Linux 中检查内存使用情况

对于服务器管理,使用 GUI 不是基本实践。但是,某些数据集通过内存使用可视化表示更易于查看。

访问系统监视器

1. 操作 显示应用程序

2. 在搜索栏中键入 System Monitor 并访问该应用程序。

How to Inspect Memory in Linux

3. 选择 资源选项卡

4. 将显示实时内存消耗和历史详细信息的(图形)概述。

How to Inspect Memory in Linux

dmidecode

如果我们想查看已安装系统 RAM 的完整信息,可以使用 dmidecode 命令。

它是一个 DMI 表解码器。它将系统的 DMI 表内容转储为用户可读的格式。

DMI 表是一种描述系统组成方式的方法(也是任何系统可能演变的)。

我们需要 sudo 权限才能运行 dmidecode 命令。

因此,我们可以执行 dmidecode -t 17 命令。此命令的结果可能很长,因为它显示了每个内存类型设备的详细信息。

示例


How to Inspect Memory in Linux

Linux 如何利用 RAM

RAM 是一种有限的资源,每个进程,如守护程序和应用程序,都希望获得一部分。它只有那么多。内核会判断内存分配并将分配的内存分发给每个有需求的进程。

未使用的 RAM 就是耗尽的 RAM。Linux 将空闲 RAM 用于许多事情,例如作为缓冲区空间,以保持我们的系统以最佳性能运行。

  • 很容易产生印象,即我们的系统 RAM 被一些内存泄漏和失控进程所利用,但这种情况很少发生。
  • 通常,这只是内核在后台执行其任务。
  • 当有另一个对 RAM 的需求超出内核为设备预留的量时,它会立即释放内存。因此,没有造成损害。
  • 当内核确定它能够启动使用交换空间时,它就会利用这一点。
  • 关于 swappiness 值以及内核何时开始使用交换存在很多混淆。
  • 这个 swappiness 值并不是固定任何 RAM 使用阈值,达到该阈值就会启用交换。这种说法是不正确的。

下一主题Ubuntu GNOME