性能监控——vmstat
性能监控是对 IT 系统运行效率和有效性的系统观察和测量。它涉及收集、分析和报告各种组件(包括应用程序、网络、服务器和数据库)的关键性能指标 (KPI)。此过程使用专门的工具来跟踪响应时间、吞吐量、资源利用率和错误率等指标。性能监控有助于识别瓶颈、预测潜在问题和优化系统资源。它对于维护服务水平协议 (SLA)、确保用户满意度和支持容量规划至关重要。在现代 IT 环境中,性能监控通常结合实时分析、AI 驱动的洞察和自动警报系统,从而实现对复杂分布式系统的主动管理,并支持 IT 运营和服务交付的持续改进。
vmstat:该命令( virtual memory statistics的缩写)是 Linux 中内置的监控实用程序。该命令用于获取有关内存、系统进程、分页、中断、块 I/O、磁盘和 CPU 调度的信息。用户可以通过指定采样周期来实时观察系统活动。
vmstat命令是系统监控工具sysstat的一部分,可生成[PU 和设备统计信息和报告。vmstat的安装
yum install sysstat
一、vmstat命令语法
基本vmstat
语法是:
vmstat [option] [delay[count]]
options:用于定制输出的各种开关
delay:定义输出更新之间的时间间隔
count:指定延迟间隔后输出更新的次数,如果未设置count,则默认值为infinite
options | 解释 |
---|---|
-a | 显示活跃和非活跃内存。这有助于你了解系统中内存的使用状态,哪些内存正在被频繁使用(活跃内存),哪些内存处于相对空闲状态(非活跃内存)。 |
-f | 输出从系统启动至今的 fork 次数。fork 是创建新进程的一种方式,此信息可让你了解系统创建进程的总体情况。 |
-m | 显示 slab 信息。slab 是 Linux 内核中用于管理内存分配的数据结构,该参数能帮助你了解内核内存分配的详细情况。 |
-n | 仅在开始时显示一次各字段名称,后续持续输出信息时不再重复显示字段名,使输出更简洁。 |
-s | 以表格形式输出内存和交换空间的统计信息,涵盖了多种内存相关的统计数据,如总内存、空闲内存、已使用内存、交换空间使用情况等。 |
-d | 显示磁盘的统计信息,包括磁盘的读写次数、读写扇区数、读写时间等,可用于监控磁盘的 I/O 性能。 |
-D | 显示磁盘的详细统计信息,包括每个磁盘设备的 I/O 操作情况,如读请求、写请求、合并的读请求、合并的写请求、读扇区数、写扇区数等 |
-p | 后面需跟磁盘分区名,用于显示指定磁盘分区的统计信息,帮助你针对性地了解某个磁盘分区的 I/O 情况。 |
-S | 用于指定输出信息中内存、I/O 等数据的单位,可取值为 k (千字节)、m (兆字节)等。例如,vmstat -S m 会以兆字节为单位显示内存和 I/O 数据。 |
-t | 在输出信息中添加时间戳,方便你关联不同时间点的系统状态信息。 |
-V | 显示版本信息 |
man vmstat | 在终端显示用户手册 |
二、基本vmstat输出字段解释
[root@Rocky ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st2 0 0 521468 4204 637204 0 0 23 3 100 208 0 1 99 0 0
各字段含义如下:
- procs:进程统计
- r:运行队列中的进程数。即等待 CPU 时间片的进程数量。如果这个数字持续高于系统的 CPU 核心数,说明系统的 CPU 资源比较紧张,可能存在性能瓶颈。
- b:处于不可中断睡眠状态的进程数。通常是进程正在等待 I/O 操作完成,比如等待磁盘读写、网络数据接收等。如果该值长期不为 0 且较大,可能表示系统存在 I/O 性能问题。
- memory:内存统计
- swpd:已使用的交换空间大小,单位是 KB。交换空间是磁盘上的一块区域,当物理内存不足时,系统会将一部分内存数据交换到交换空间中。如果这个值不断增大,说明系统的物理内存可能不够用,需要关注系统内存使用情况。
- free:空闲的物理内存大小,单位为 KB。这是系统当前未被使用的内存量,可以直接反映出系统内存的剩余可用资源。
- buff:用于块设备的缓冲区内存大小,单位为 KB。缓冲区主要用于缓存磁盘块数据,以提高磁盘 I/O 的性能。当系统读取或写入磁盘数据时,数据会先在缓冲区中进行缓存,以便后续再次访问时可以直接从缓冲区中获取,减少实际的磁盘 I/O 操作。
- cache:用于文件系统的缓存内存大小,单位为 KB。文件系统缓存主要用于存储最近访问过的文件数据和元数据。与缓冲区不同,它更侧重于文件层面的缓存,而不是磁盘块层面。通过文件系统缓存,可以加速文件的读取操作,提高系统的整体性能。
- swap:交换空间统计
- si:从磁盘交换到内存的交换页数量,单位为 KB/s。表示每秒从交换空间(磁盘)换入到物理内存的数据量。如果这个值较大,说明系统频繁地从交换空间读取数据,可能是物理内存不足,导致系统不得不使用交换空间来满足内存需求。
- so:从内存交换到磁盘的交换页数量,单位为 KB/s。表示每秒从物理内存换出到交换空间(磁盘)的数据量。同样,如果该值较大,也说明系统内存紧张,需要将部分内存数据交换到磁盘上以腾出物理内存空间。
- io:输入/输出统计
- bi:从块设备(如磁盘)读取的块数量,单位为块 /s。这个数值反映了系统对磁盘等块设备的读操作频率和数据量。通过观察该值,可以了解系统的磁盘读负载情况。
- bo:写入到块设备的块数量,单位为块 /s。它体现了系统对磁盘等块设备的写操作频率和数据量,用于评估磁盘的写负载。如果
bi
和bo
的值同时较高,说明系统的磁盘 I/O 活动比较频繁,可能存在 I/O 性能问题。
- system:系统调度
- in:每秒的中断次数,包括时钟中断、硬件中断等。中断是计算机系统中用于处理异步事件的机制,例如硬件设备完成数据传输、定时器到期等都会产生中断。如果
in
的值过高,可能表示硬件设备频繁产生中断,这会消耗 CPU 资源,影响系统性能。 - cs:每秒的上下文切换次数。上下文切换是指 CPU 从一个进程或线程切换到另一个进程或线程时需要保存和恢复的相关状态信息,包括寄存器值、程序计数器等。频繁的上下文切换会消耗 CPU 时间,降低系统的整体性能。如果
cs
的值很大,说明系统中的进程或线程切换比较频繁,可能需要进一步分析原因,例如是否存在过多的进程或线程竞争资源。
- in:每秒的中断次数,包括时钟中断、硬件中断等。中断是计算机系统中用于处理异步事件的机制,例如硬件设备完成数据传输、定时器到期等都会产生中断。如果
- cpu:cpu统计信息,以百分比形式展示
- us:用户空间进程使用 CPU 的时间百分比。即运行在用户态的应用程序、进程等使用 CPU 的时间占总 CPU 时间的比例。如果该值较高,说明用户程序消耗了较多的 CPU 资源,可能是某个或某些应用程序存在性能问题,需要进一步分析优化。
- sy:内核空间进程使用 CPU 的时间百分比。表示运行在内核态的系统进程、内核函数等使用 CPU 的时间占比。内核负责管理系统资源、处理中断、进行进程调度等操作,如果
sy
的值过高,可能是内核任务过于繁重,例如系统调用频繁、内核模块存在性能问题等。 - id:CPU 空闲时间百分比。该值越高,说明 CPU 越空闲,系统的 CPU 资源利用率越低;反之,如果该值较低,表明 CPU 负载较高,系统可能处于繁忙状态。
- wa:CPU 等待 I/O 完成的时间百分比。当 CPU 发起 I/O 操作后,需要等待 I/O 设备完成数据传输才能继续执行后续操作,这段等待时间就是
wa
。如果wa
的值较大,说明系统存在 I/O 瓶颈,CPU 大部分时间都在等待 I/O 操作完成,导致 CPU 利用率不高。此时需要关注磁盘、网络等 I/O 设备的性能情况。 - st:被虚拟机偷走的 CPU 时间百分比(仅在虚拟机环境中有意义)。如果系统是在虚拟机中运行,这个值表示虚拟机监控程序(如 KVM、Xen 等)占用的 CPU 时间,导致客户机操作系统可用的 CPU 时间减少。如果
st
的值较高,说明虚拟机监控程序消耗了较多的 CPU 资源,可能会影响虚拟机内系统和应用程序的性能。
三、示例
3.1 显示活动和非活动系统内存
-
活动内存:进程正在使用的内存。
-
非活动内存:分配给不再运行的进程的内存。
-
使用该**
-a
选项可将buff和cache内存列替换为inact和active**列。这些列显示系统中非活动和活动内存的数量。
[root@Rocky ~]# vmstat -a
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free inact active si so bi bo in cs us sy id wa st2 0 0 521544 815128 253636 0 0 20 3 95 202 0 1 99 0 0
3.2 内存和调度统计
##生成有关内存、事件计数器和 CPU 调度统计信息的更多详细信息
[root@Rocky ~]# vmstat -s
输出显示的报告与vmstat
基本报告类似,但某些部分包含更多详细信息。例如,输出将良好CPU 时间和非良好 CPU 时间分开,并在基本报告中合并vmstat
。
输出中有四个部分:
- 输出的第一部分涉及已使用的内存量:
- 总物理内存。
- 当前使用的内存。
- 活動記憶。
- 非活动内存。
- 释放记忆。
- 缓冲内存。
- 高速缓存内存。
- 交换内存信息。
2.第二部分显示CPU统计信息:
- 非良好 CPU 滴答数 – CPU 用于高优先级 进程的次数。
- 良好的 CPU 滴答数 – CPU 用于低优先级 进程的次数 。
- 系统 CPU 滴答 – CPU 用于内核进程的次数 。
- 空闲 CPU 滴答数——CPU 空闲的次数。
- IO-wait——CPU 用于输入/输出管理的次数。
- IRQ ——CPU 接收中断请求的次数 。
- softirq——CPU 接收软件中断的次数 。
- 被盗 CPU 滴答数——虚拟机窃取 CPU 时间的次数。
3.第三部分显示与内存分页相关的值:
-
从虚拟内存 调入的页面总数。
-
调出 到虚拟内存的总页面数。
-
从交换内存读取的总页面数。
-
写入交换内存的总页面数。
-
最后一节描述了 各种事件计数器:
-
自启动以来的中断次数。
-
执行的上下文切换的次数。
-
上次启动时间的时间戳 。
-
fork的总数 。
3.3 显示自启动以来的Fork次数
-
fork:是从现有正在运行的进程中创建的新进程
[root@Rocky ~]# vmstat -f3026 forks
3.4 显示快速摘要磁盘统计信息
-
该**
-D
**选项会生成所有磁盘活动的快速摘要统计信息[root@Rocky ~]# vmstat -D4 disks2 partitions13241 total reads20 merged reads1765491 read sectors14401 milli reading5312 writes328 merged writes267212 written sectors7249 milli writing0 inprogress IO17 milli spent IO ## 输出显示系统详细信息,例如磁盘数量、分区数量、读取次数、写入次数等
3.5 显示磁盘统计信息(读/写统计信息)
-
-d
:获取每个磁盘使用情况的详细统计信息[root@Rocky ~]# vmstat -d disk- ------------reads------------ ------------writes----------- -----IO------total merged sectors ms total merged sectors ms cur sec sr0 40 0 2083 58 0 0 0 0 0 0 sda 7011 20 932380 7240 2569 332 136489 3175 0 9 dm-0 6090 0 826924 7078 2885 0 132393 4322 0 9 dm-1 104 0 4440 33 0 0 0 0 0 0
输出显示每个磁盘的三列 -读取、写入和IO 。读取和写入以毫秒为单位,而 IO 列以秒为单位。
每栏有若干小节:
- disk:表示磁盘设备的名称。例如
sr0
通常代表光驱设备,sda
一般是第一块 SATA 硬盘,dm-0
和dm-1
通常是与逻辑卷管理(LVM)相关的设备映射。 - reads 部分
- total:从系统启动以来,该磁盘设备执行的读操作总次数。比如
sda
的total
为 7011,表示从系统启动到现在,对sda
磁盘进行了 7011 次读操作。 - merged:合并的读操作次数。操作系统为了提高磁盘 I/O 效率,会尝试将相邻的读请求合并成一个更大的请求。以
sda
为例,merged
为 20,意味着有 20 次读请求被合并处理。 - sectors:从磁盘读取的扇区总数。每个扇区通常为 512 字节。像
sda
的sectors
为 932380,那么读取的数据总量约为 932380 * 512 字节。 - ms:读操作总共花费的时间(以毫秒为单位)。如
sda
的读操作总共花费了 7240 毫秒。
- total:从系统启动以来,该磁盘设备执行的读操作总次数。比如
- writes 部分
- total:从系统启动以来,该磁盘设备执行的写操作总次数。例如
sda
的写操作总次数为 2569 次。 - merged:合并的写操作次数。
sda
有 332 次写请求被合并处理。 - sectors:写入到磁盘的扇区总数。
sda
写入的扇区总数为 136489 个。 - ms:写操作总共花费的时间(以毫秒为单位)。
sda
的写操作总共花费了 3175 毫秒。
- total:从系统启动以来,该磁盘设备执行的写操作总次数。例如
- IO 部分
- cur:当前正在进行的 I/O 操作数量。如果该值长时间不为 0,可能表示磁盘存在 I/O 瓶颈。这里各磁盘的
cur
都为 0,说明当前没有正在进行的 I/O 操作。 - sec:从系统启动以来,该磁盘设备进行 I/O 操作所花费的总时间(以秒为单位)。例如
sda
的sec
为 9,即从系统启动到现在,sda
进行 I/O 操作总共花费了 9 秒。
- cur:当前正在进行的 I/O 操作数量。如果该值长时间不为 0,可能表示磁盘存在 I/O 瓶颈。这里各磁盘的
3.6 显示分区统计信息
-
**
-p
**使用该选项,后跟分区名称,生成与特定分区相关的报告:[root@Rocky ~]# vmstat -p sda1 sda1 reads read sectors writes requested writes615 90088 2 4096 ##在此示例中,输出显示 sda 设备的第一个分区sda1的 摘要。摘要包括该分区上的磁盘读写计数以及磁盘读写任务所涉及的扇区总数
3.7 显示更新的时间戳信息
-
-t:获取时间戳以及请求的输出
[root@Rocky ~]# vmstat -t procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- -----timestamp-----r b swpd free buff cache si so bi bo in cs us sy id wa st CST5 0 0 525784 4204 637264 0 0 17 3 91 197 0 1 99 0 0 2025-03-20 19:43:05 ## 输出与基本输出相同vmstat,但添加了时间戳
3.8使用延迟值
-
[delay]语法指定每次输出更新之间的时间间隔,以秒为单位
[root@Rocky ~]# vmstat 3 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st2 0 0 525784 4204 637264 0 0 17 3 91 197 0 1 99 0 01 0 0 525612 4204 637264 0 0 0 0 122 329 0 1 99 0 00 0 0 525580 4204 637264 0 0 0 0 123 332 0 1 99 0 00 0 0 525580 4204 637264 0 0 0 0 119 326 0 0 100 0 0 ^C ##在此示例中,每次报告更新之间有三秒的延迟。如果没有指定延迟,则只会打印一个输出,给出自上次重启以来的平均值。
3.9 使用计数值
-
注意:较低的延迟值会加重系统负担,因为它会无限期地运行命令,直到您使用Ctrl+C组合键手动停止它 。为避免额外的负载,请将计数值与延迟值一起使用。语法是,
vmstat [delay[count]]
##在这个例子中,我们指定我们想要五秒延迟和三次输出更新。 [root@Rocky ~]# vmstat 5 3 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st2 0 0 525724 4204 637264 0 0 17 2 90 197 0 1 99 0 00 0 0 525612 4204 637264 0 0 0 0 119 318 0 1 99 0 01 0 0 525612 4204 637264 0 0 0 0 122 321 0 1 99 0 0
3.10 更改单位
显示内存和交换统计信息的默认单位是千字节。要更改输出单位,请使用**-S
**选项和以下参数之一:
- k:1000 字节。
- K:1024字节。
- m:1000000 字节。
- M:1048576字节。
要以十进制千字节和兆字节显示统计信息,请分别使用k和m。大写K和M以十六进制千字节和兆字节显示统计信息。
## 使用以下命令每 5 秒更新一次统计信息,并将显示单位更改为兆字节:
[root@Rocky ~]# vmstat 5 -S M
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st2 0 0 513 4 622 0 0 17 2 90 196 0 1 99 0 00 0 0 513 4 622 0 0 0 0 111 313 0 1 99 0 0
^C
3.11 显示Slab统计信息
-
slab 缓存是 Linux 内核用于管理内存分配的数据结构,它有助于提高频繁分配和释放的小对象的内存分配效率。要查看 slab 统计信息,请使用该**
-m
选项。请注意,此操作需要超级用户权限**[root@Rocky ~]# vmstat -m
-
整体列名解释
-
Cache:表示 slab 缓存的名称,不同的名称对应着不同类型的内核对象缓存,例如
xfs
相关的缓存与 XFS 文件系统的内核操作有关。 -
Num:当前处于使用状态(已分配)的对象数量,即该 slab 缓存中已经被内核使用的对象个数。
-
Total:该 slab 缓存中对象的总数量,包括已分配和未分配的对象。
-
Size:每个对象所占用的内存大小,单位是字节(Byte)。
-
vmstat -m
[外链图片转存中...(img-pPGE4ByA-1742476536369)]- 整体列名解释- **Cache**:表示 slab 缓存的名称,不同的名称对应着不同类型的内核对象缓存,例如 `xfs` 相关的缓存与 XFS 文件系统的内核操作有关。- **Num**:当前处于使用状态(已分配)的对象数量,即该 slab 缓存中已经被内核使用的对象个数。- **Total**:该 slab 缓存中对象的总数量,包括已分配和未分配的对象。- **Size**:每个对象所占用的内存大小,单位是字节(Byte)。- **Pages**:该 slab 缓存占用的物理内存页数。在 Linux 系统中,内存以页为单位进行管理,一页的大小通常是 4KB(不同系统可能有所不同)。