如何在 Linux 上使用 vmstat 命令

您的 Linux 或 macOS 计算机正在使用虚拟内存。了解它如何影响系统对物理内存、CPU 和硬盘资源的使用。
什么是虚拟内存?
您的计算机配备了有限数量的物理内存,称为随机存取内存 (RAM)。该 RAM 需要由内核管理,并在操作系统和任何正在运行的应用程序之间共享。如果这些组合需求要求的内存比计算机中实际安装的内存多,那么内核可以做什么?
Linux 和类似 Unix 的操作系统(例如 macOS)可以使用硬盘上的空间来帮助它们管理内存需求。可以使用称为“交换空间”的硬盘驱动器空间保留区域,就好像它是 RAM 的扩展一样。这是虚拟内存。
Linux 内核可以将内存块的内容写入交换空间,并释放该 RAM 区域以供另一个进程使用。换出(也称为“分页”)内存可以从交换空间中检索并在需要时恢复到 RAM 中。
当然,页面调出内存的访问速度要比 RAM 中的内存慢。这不是唯一的权衡。虽然虚拟内存确实为 Linux 提供了一种管理其内存需求的方法,但使用虚拟内存会增加计算机其他地方的负担。
您的硬盘驱动器必须执行更多的读写操作。内核——因此,CPU——必须做更多的工作,因为它要换出内存,换入内存,并保持所有的盘子旋转以满足不同进程的内存需求。
Linux 以 vmstat
命令的形式为您提供了一种监视所有这些活动的方法,该命令报告虚拟内存统计信息。
vmstat 命令
如果您键入 vmstat
作为不带参数的命令,它将显示一组值。这些值是自您的计算机上次重新启动以来每项统计数据的平均值。这些数字不是“现在”值的快照。
vmstat

显示一个简短的值表。

有标题为 Procs、Memory、Swap、IO、System 和 CPU 的列。最后一列(最右侧的列)包含与 CPU 相关的数据。

这是每列中数据项的列表。
过程
- r:可运行的进程数。这些是已启动并正在运行或正在等待下一次 CPU 周期时间片突发的进程。
- b:处于不可中断睡眠状态的进程数。该进程没有休眠,它正在执行阻塞系统调用,并且在完成当前操作之前不能被中断。通常,该进程是等待某些资源释放的设备驱动程序。当进程恢复其正常活动时,将处理该进程的任何排队中断。
记忆
- swpd:使用的虚拟内存量。换句话说,换出了多少内存。,
- free:空闲(当前未使用)内存量。
- buff:用作缓冲区的内存量。
- cache:用作缓存的内存量。
交换
- si:从交换空间交换的虚拟内存量。
- so:交换空间的虚拟内存量。
输入输出
- bi:从块设备接收到的块。用于将虚拟内存交换回 RAM 的数据块数。
- bo:发送到块设备的块。用于将虚拟内存从 RAM 交换到交换空间的数据块数。
系统
- in:每秒的中断次数,包括时钟。
- cs:每秒上下文切换的次数。上下文切换是指内核从系统模式处理切换到用户模式处理。
中央处理器
这些值都是总 CPU 时间的百分比。
- us:运行非内核代码所花费的时间。即,用户时间处理和 nice 时间处理花费了多少时间。
- sy:运行内核代码所花费的时间。
- id:空闲时间。
- wa:等待输入或输出所花费的时间。
- st:从虚拟机窃取的时间。这是虚拟机必须等待管理程序完成对其他虚拟机的服务,然后才能返回并处理该虚拟机的时间。
使用时间间隔
我们可以使用 delay
值让 vmstat
定期更新这些数字。 delay
值以秒为单位提供。要每五秒更新一次统计信息,我们将使用以下命令:
vmstat 5

每五秒 vmstat
将向表中添加另一行数据。你需要按 Ctrl+C 来停止它。

使用计数值
使用太低的 delay
值会给您的系统带来额外的压力。如果您需要快速更新以尝试诊断问题,建议您使用 count
值和 delay
值。
count
值告诉 vmstat
在它退出并返回到命令提示符之前要执行多少更新。如果您不提供 count
值,vmstat
将一直运行,直到被 Ctrl+C 停止。
要让 vmstat
每五秒提供一次更新——但只更新四次——使用以下命令:
vmstat 5 4

四次更新后 vmstat
自行停止。

更改单位
您可以使用 -S
(单位字符)选项选择以千字节或兆字节显示内存和交换统计信息。这后面必须跟有 k
、K
、m
或 M
之一。这些代表:
- k:1000字节
- K:1024 字节
- m:1000000 字节
- M:1048576 字节
要每 10 秒更新一次统计信息,并以兆字节为单位显示内存和交换统计信息,请使用以下命令:
vmstat 10 -S M

内存和交换统计信息现在以兆字节显示。请注意,-S
选项不会影响 IO 块统计信息。这些总是以块的形式显示。

活动和非活动内存
如果您使用 -a
(活动)选项,buff 和缓存内存列将替换为“inact”和“active”列。正如他们建议的那样,这些显示了非活动和活动内存的数量。
要查看这两列而不是 buff 和 cache 列,请包含 -a
选项,如下所示:
vmstat 5 -a -S M

非活动列和活动列受 -S(单位字符)选项的影响。

叉子
-f
开关显示自计算机启动以来发生的分叉数。
换句话说,这显示了自系统启动以来已启动的任务数(并且,其中大部分任务再次关闭)。从命令行启动的每个进程都会增加这个数字。每次任务或进程产生或克隆一个新任务时,这个数字都会增加。
vmstat -f

货叉显示不更新。
显示 Slabinfo
内核有自己的内存管理以及操作系统和所有应用程序的内存管理。
正如您可能想象的那样,内核正在为它必须处理的许多不同类型的数据对象一遍又一遍地分配和释放内存。为了使其尽可能高效,它使用了一个称为 slabs 的系统。这是一种缓存形式。
为特定类型的内核数据对象分配、使用和不再需要的内存可以重新用于相同类型的另一个数据对象,而无需释放和重新分配内存。将 slab 视为预先分配的、量身定制的 RAM 段,以满足内核自身的需要。
要查看 slab 的统计信息,请使用 -m
(slabs) 选项。您将需要使用 sudo
,系统会提示您输入密码。由于输出可能很长,我们通过 less
将其管道化。
sudo vmstat -m | less

输出有五列。这些都是:
- 缓存:缓存的名称。
- num:此缓存中当前活动对象的数量。
- 总数:此缓存中可用对象的总数。
- size:缓存中每个对象的大小。
- 页面:当前(至少)一个对象与此缓存相关联的内存页面总数。

按 q
离开 less
。
显示事件计数器和内存统计信息
要显示一页事件计数器和内存统计信息,请使用 -s
(stats) 选项。请注意,这是一个小写的“s”。
vmstat -s

尽管报告的统计数据与构成默认 vmstat
输出的信息大体相同,但其中一些被更详细地拆分出来。
例如,默认输出将 nice 和非 nice 用户 CPU 时间组合到“us”列中。 -s(统计信息)显示分别列出这些统计信息。

显示磁盘统计信息
您可以使用 -d
(磁盘)选项获得类似的磁盘统计信息列表。
vmstat -d | less

对于每个磁盘,显示三列,分别是读取、写入和 IO。

IO 是最右边的列。请注意,IO 中的 sec 列以秒为单位,但 read 和 write 列中基于时间的统计信息以毫秒为单位。

这就是列的含义:
阅读
- total:磁盘读取总数。
- merged:分组读取的总数。
- sectors:已读入的扇区总数。
- ms:从磁盘读取数据所用的总时间(以毫秒为单位)。
写
- total:磁盘写入的总次数。
- merged:分组写入的总数。
- sectors:写入的扇区总数。
- ms=将数据写入磁盘所用的总时间(以毫秒为单位)。
输入输出
- cur:当前磁盘读取或写入的次数。
- sec:任何正在进行的读取或写入所花费的时间(以秒为单位)。
显示摘要磁盘统计信息
要快速查看磁盘活动的摘要统计信息,请使用 -D
(disk-sum) 选项。注意大写的“D”。
vmstat -D

磁盘数量可能看起来异常高。用于研究本文的计算机正在运行 Ubuntu。使用 Ubuntu,每次从 Snap 安装应用程序时,都会创建一个 squashfs
伪文件系统,它附加到 /dev/loop 设备。
令人恼火的是,许多 Linux 命令和实用程序将这些设备条目计为硬盘驱动器设备。

显示分区统计信息
要查看与特定分区相关的统计信息,请使用 -p
(分区)选项并提供分区标识符作为命令行参数。
在这里,我们将查看分区 sda1
。数字 1 表示这是设备 sda
上的第一个分区,它是这台计算机的主硬盘驱动器。
vmstat -p sda1

返回的信息显示对该分区的磁盘读取和磁盘写入总数,以及磁盘读取和磁盘写入操作中包含的扇区数。

引擎盖下的一瞥
知道如何打开引擎盖并查看下面发生的事情总是好的。有时你会试图解决问题,有时它会失去兴趣,因为你想知道你的电脑是如何运转的。
vmstat
可以为您提供大量有用的信息。现在您知道如何访问它及其含义了。预先警告就是预先武装——当您确实需要挽起袖子并进行一些诊断时,您会知道 vmstat
就在您身边。
Linux Commands | ||
Files | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc | |
Processes | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap | |
Networking | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld |
RELATED: Best Linux Laptops for Developers and Enthusiasts