每天一个 Linux 命令(15)—— vmstat

569 阅读8分钟

这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战

命令简介

vmstat 是 Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU 活动进行监控。他是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。

vmstat命令提供的统计数据主要来自系统内核维护的 /proc/meminfo/proc/stat 和 /proc/*/stat 等文件。

命令格式

vmstat [-a] [-n] [-S unit] [delay [ count]]
vmstat [-s] [-n] [-S unit]
vmstat [-m] [-n] [delay [ count]]
vmstat [-d] [-n] [delay [ count]]
vmstat [-p disk partition] [-n] [delay [ count]]
vmstat [-f]
vmstat [-V]//原文出自【易百教程】,商业转载请联系作者获得授权,非商业请保留原文链接:https://www.yiibai.com/linux/vmstat.html

命令参数

参数解释
-a显示活动/不活动内存的统计数据。
-d
-f
-m显示系统的缓存分配信息。
-n仅显示一次字段标题信息,而非周期性地重复显示。
-p partition显示指定设备分区的详细统计数据。
-s以列表的方式显示各种事件计数器和内存的统计数据。注意,使用这个选项时不能连续地重复显示。
-S unit按照指定的字节单位 k(1000)K(1024)m(10002)或 M(10242)显示统计数据。
-t在显示的统计数据中增加时间信息。
-V显示命令的版本信息,然后退出。
-w增加显示字段的宽度,以便能够显示较大的内存数据。

VM 模式输出字段说明

Procs(进程状态信息)

字段解释
r运行队列中等待运行的进程数量。
b因等待 I/O 资源或面页调度而处于不可中断睡眠状态的进程数量。

Memory(内存使用情况)

字段解释
swpd正在使用的虚拟内存数量。
free空闲内存的数量。
buff用作 buffer 的内存数量。
cache用作 cache 的内存数量。
inact不活动内存的数量(-a 选项)。
active活动内存的数量(-a 选项)。

Swap(内存磁盘交换)

字段解释
si每秒从磁盘交换到内存的内存数量。
so每秒交换到磁盘的内存数量。

IO

字段解释
bi每秒读取块设备的数据块数量。
bo每秒写入块设备的数据块数量。

System

字段解释
in每秒产生的中断数量(包括时钟中断)。
cs每秒上下文切换的数量。

CPU(整个CPU时间分配的百分比)

字段解释
us用户模式运行时间(用户时间)占用整个 CPU 时间的百分比。
sy内核模式运行时间(系统时间)占用整个 CPU 时间的百分比。
id系统空闲时间占用整个 CPU 时间的百分比。
wa等待 I/O 时间占用整个 CPU 时间的百分比。
st从虚拟机偷取的时间占用整个 CPU 时间的百分比。

磁盘模式输出字段说明

Reads

字段解释
total成功读取磁盘次数的总和。
merged把多个逻辑读操作合并成一次读操作的数量。
sectors成功读取的扇区数量。
ms读磁盘花费的时间(毫秒)。

Writes

字段解释
total成功写入磁盘次数的总和。
merged把多个逻辑写操作合并成一次写操作的数量。
sectors成功写入磁盘的扇区数量。
ms写磁盘花费的时间(毫秒)。

IO

字段解释
cur当前正在执行的 I/O 数量。
s读写磁盘花费的时间(秒)。

磁盘分区模式输出字段说明

字段解释
reads读取磁盘分区次数的总和。
read sectors读取磁盘分区的扇区总和。
writes写入磁盘分区次数的总和。
requested writes请求写磁盘分区次数的总和。

SLAB 模式输出字段说明

字段解释
cache缓存的名字。
num当前活动对象的数量。
total可用对象的总和。
size每个对象的大小。
pages具有至少一个活动对象的页面数量。
totpages已分配的页面总和。
pslab每个 slab 结构的页面数量。

物理内存和虚拟内存区别

本部分内容来自 vmstat命令

我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念。物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在 linux 下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(Swap Space)。作为物理内存的扩展,linux 会在物理内存不足时,使用交换分区的虚拟内存,更详细的说,就是内核会将暂时不用的内存块信息写到交换空间,这样以来,物理内存得到了释放,这块内存就可以用于其它目的,当需要用到原始的内容时,这些信息会被重新从交换空间读入物理内存。linux 的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。

要深入了解 linux 内存运行机制,需要知道下面提到的几个方面:

  • 首先,Linux 系统会不时的进行页面交换操作,以保持尽可能多的空闲物理内存,即使并没有什么事情需要内存,Linux 也会交换出暂时不用的内存页面。这可以避免等待交换所需的时间。
  • 其次,linux 进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟内存,linux 内核根据”最近最经常使用“算法,仅仅将一些不经常使用的页面文件交换到虚拟内存,有时我们会看到这么一个现象:linux 物理内存还有很多,但是交换空间也使用了很多。其实,这并不奇怪,例如,一个占用很大内存的进程运行时,需要耗费很多内存资源,此时就会有一些不常用页面文件被交换到虚拟内存中,但后来这个占用很多内存资源的进程结束并释放了很多内存时,刚才被交换出去的页面文件并不会自动的交换进物理内存,除非有这个必要,那么此刻系统物理内存就会空闲很多,同时交换空间也在被使用,就出现了刚才所说的现象了。关于这点,不用担心什么,只要知道是怎么一回事就可以了。
  • 最后,交换空间的页面在使用时会首先被交换到物理内存,如果此时没有足够的物理内存来容纳这些页面,它们又会被马上交换出去,如此以来,虚拟内存中可能没有足够空间来存储这些交换页面,最终会导致 linux 出现假死机、服务异常等问题,linux虽然可以在一段时间内自行恢复,但是恢复后的系统已经基本不可用了。因此,合理规划和设计 linux 内存的使用,是非常重要的。

虚拟内存原理

在系统中运行的每个进程都需要使用到内存,但不是每个进程都需要每时每刻使用系统分配的内存空间。当系统运行所需内存超过实际的物理内存,内核会释放某些进程所占用但未使用的部分或所有物理内存,将这部分资料存储在磁盘上直到进程下一次调用,并将释放出的内存提供给有需要的进程使用。

在 Linux 内存管理中,主要是通过“调页 Paging”和“交换 Swapping ”来完成上述的内存调度。调页算法是将内存中最近不常使用的页面换到磁盘上,把活动页面保留在内存中供进程使用。交换技术是将整个进程,而不是部分页面,全部交换到磁盘上。
分页(Page)写入磁盘的过程被称作 Page-Out,分页(Page)从磁盘重新回到内存的过程被称作 Page-In。当内核需要一个分页时,但发现此分页不在物理内存中(因为已经被 Page-Out了),此时就发生了分页错误(Page Fault)。

当系统内核发现可运行内存变少时,就会通过 Page-Out 来释放一部分物理内存。经管 Page-Out 不是经常发生,但是如果 Page-out 频繁不断的发生,直到当内核管理分页的时间超过运行程式的时间时,系统效能会急剧下降。这时的系统已经运行非常慢或进入暂停状态,这种状态亦被称作 thrashing。

参考文档

  • vmstat命令
  • 《Linux 常用命令简明手册》—— 邢国庆编著