如何在Linux上使用vmstat命令
Linux或者macOS计算机正在使用虚拟内存。了解它如何影响系统对物理内存,CPU和硬盘资源的使用。
什么是虚拟内存?
计算机装有有限数量的物理内存,称为随机存取内存(RAM)。该RAM需要由内核管理,并在操作系统和任何正在运行的应用程序之间共享。如果这些综合需求要求的内存比计算机中实际安装的内存更多,那么内核可以做什么?
诸如macOS之类的Linux和Unix之类的操作系统可以使用硬盘上的空间来帮助他们管理内存需求。可以使用硬盘空间的保留区域(称为交换空间),就好像它是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:用作缓冲区的内存量。
缓存:用作缓存的内存量。
交换
si:从交换空间交换的虚拟内存量。
因此:交换出虚拟空间以交换空间。
IO
bi:从块设备接收的块。用于将虚拟内存交换回RAM的数据块数。
bo:发送到块设备的块。用于将虚拟内存交换出RAM并交换空间的数据块数。
系统
in:每秒的中断数,包括时钟。
cs:每秒上下文切换数。上下文切换是指内核从系统模式处理切换为用户模式处理时。
中央处理器
这些值是CPU总时间的所有百分比。
us:运行非内核代码所花费的时间。即,在用户时间处理和好时光处理中花费了多少时间。
sy:运行内核代码所花费的时间。
id:空闲时间。
wa:等待输入或者输出所花费的时间。
st:从虚拟机窃取的时间。这是虚拟机必须等待虚拟机管理程序完成对其他虚拟机的服务之后,才能返回并参与该虚拟机的时间。
使用时间间隔
我们可以让vmstat通过使用一个delay值来定期更新这些数据。延迟值以秒为单位。为了使统计信息每五秒钟更新一次,我们将使用以下命令:
vmstat 5
每五秒钟vmstat将向表中添加另一行数据。我们需要按Ctrl + C才能停止。
使用计数值
使用太低的"延迟"值会给系统带来额外的压力。如果我们需要快速更新以尝试诊断问题,建议我们使用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
(active)选项,则buff和cache memory列将被inact和active列替换。正如他们所暗示的那样,它们显示了非活动和活动内存的数量。
要查看这两列而不是buff和cache列,请包含-a
选项,如下所示:
vmstat 5 -a -S M
inact和active列受-S(单位字符)选项影响。
Forks
-f开关显示自启动计算机以来发生的派生次数。
换句话说,这显示了自系统启动以来已启动的任务数量(大部分任务再次关闭),从命令行启动的每个进程都会增加这个数字。每当任务或者进程产生或者克隆新任务时,该数字就会增加。
vmstat -f
显示Slabinfo
内核拥有自己需要担心的内存管理以及操作系统和所有应用程序的内存管理。
我们可能会想像内核正在为它必须处理的许多不同类型的数据对象一遍又一遍地分配内存和取消分配内存。为了使其尽可能有效,它使用了一个称为slab的系统。这是一种缓存形式。
可以为特定类型的内核数据对象分配,使用和不再需要的内存可用于同一类型的另一个数据对象,而无需重新分配和重新分配内存。可以将slab视为预先分配的,可度量的,可满足内核自身需求的RAM段。
要查看平板的统计信息,请使用-m(平板)选项。我们将需要使用sudo
,并且将提示我们输入密码。由于输出可能很长,因此我们将其通过less
传递。
sudo vmstat -m | less
输出有五列。这些是:
缓存:缓存的名称。
num:此缓存中当前活动对象的数量。
total:此缓存中可用对象的总数。
size:缓存中每个对象的大小。
pages:具有(至少)当前与此高速缓存关联的对象的内存页面总数。
按q
离开less
。
显示事件计数器和内存统计信息
要显示事件计数器和内存统计信息的页面,请使用-s
(stats)选项。请注意,这是一个小写的。
vmstat -s
尽管报告的统计信息与构成默认" vmstat"输出的信息基本相同,但其中的一些信息会更详细地拆分。
例如,默认输出将nice和nice用户CPU时间都组合到us列中。 -s(统计信息)显示单独列出这些统计信息。
显示磁盘统计信息
我们可以使用-d
(disk)选项获得类似的磁盘统计信息列表。
vmstat -d | less
对于每个磁盘,将显示三列,分别是读取,写入和IO。
IO是最右边的列。请注意,IO中的sec列以秒为单位,而读和写列中基于时间的统计信息以毫秒为单位。
这是列的含义:
读
total:磁盘读取总数。
合并:分组读取的总数。
扇区:已读入的扇区总数。
ms:用于从磁盘读取数据的总时间(以毫秒为单位)。
写
total:磁盘写入总数。
合并的:分组写入的总数。
扇区:写入的扇区总数。
ms =用于将数据写入磁盘的总时间(以毫秒为单位)。
IO
cur:当前磁盘读取或者写入的次数。
sec:正在进行的任何读取或者写入所花费的时间(以秒为单位)。
显示摘要磁盘统计信息
要快速查看磁盘活动的摘要统计信息,请使用-D(磁盘和)选项。请注意大写D。
vmstat -D
磁盘数量可能看起来异常高。用于研究本文的计算机正在运行Ubuntu。在Ubuntu中,每当我们从Snap安装应用程序时,都会创建一个squashfs
伪文件系统,该文件系统添加到/ dev / loop设备。
令人讨厌的是,许多Linux命令和实用程序都将这些设备条目算作硬盘设备。
显示分区统计信息
要查看与特定分区相关的统计信息,请使用-p
(分区)选项,并提供分区标识符作为命令行参数。
在这里,我们将看一下分区" sda1"。数字1表示这是设备sda上的第一个分区,它是此计算机的主硬盘驱动器。
vmstat -p sda1
返回的信息显示了对该分区进行磁盘读取和磁盘写入的总数,以及磁盘读取和磁盘写入操作中包含的扇区数。