命令详解
vmstat - 主要用于查看虚拟内存的使用情况(vmstat virtual memory performance monitoring)
关于虚拟内存
在系统中运行的每个进程都需要使用到内存,但不是每个进程都需要每时每刻使用系统分配的内存空间。当系统运行所需内存超过实际的物理内存,内核会释放某些进程所占用但未使用的部分或所有物理内存,将这部分资料存储在磁盘上直到进程下一次调用,并将释放出的内存提供给有需要的进程使用。
在Linux内存管理中,主要是通过“调页Paging”和“交换Swapping”来完成上述的内存调度。调页算法是将内存中最近不常使用的页面换到磁盘上,把活动页面保留在内存中供进程使用。交换技术是将整个进程,而不是部分页面,全部交换到磁盘上。
分页(Page)写入磁盘的过程被称作Page-Out,分页(Page)从磁盘重新回到内存的过程被称作Page-In。当内核需要一个分页时,但发现此分页不在物理内存中(因为已经被Page-Out了),此时就发生了分页错误(Page Fault)。当系统内核发现可运行内存变少时,就会通过Page-Out来释放一部分物理内存。尽管Page-Out不是经常发生,但是如果Page-out频繁不断的发生,直到当内核管理分页的时间超过运行程序的时间时,系统性能就会急剧下降。这时的系统已经运行非常慢或进入暂停状态,这种状态亦被称作thrashing。
语法
vmstat [options] [delay] [count]
语法说明
vmstat 可以统计 处理器、内存、页面调度、IO块、traps、磁盘、以及cpu活动状况。
此命令首次统计的是自上次启动以来的平均情况。 随后的统计数据是在delay周期时间内的取样信息。不管是哪一种情况下,该命令统计的处理器和内存信息都是瞬时的。
命令选项
命令选项说明
delay - 更新的时间间隔,单位是秒。如果没有指定delay的话,就只会输出一条统计报告,这条统计报告中的内容是自启动以来的平均值。
count - 更新的次数,当定义了delay,而没有指定count的话,默认就是无限,不断地输出。
选项简称 | 完整选项名 | 含义 |
---|---|---|
-a | active | 展示活跃和非活跃的内存 |
-f | forks | -f开关会展示出自从启动之后,系统总共fork的个数,它包括:fork、vfork、clone system call。就相当于创建的总任务数。取决于线程的使用,每个进程可以由一个或多个任务来表示 |
-m | slabs | 展示slab信息 |
-n | one-header | 头部信息只展示一次,而不是周期性地展示 |
-s | stats | 把各种事件计数器和内存统计放到一个表中展示,这种方式不会重复性地展示输出信息 |
-d | disk | 展示磁盘的统计信息 |
-D | disk-sum | 统计一些关于磁盘活动的汇总信息 |
-p | partition | 展示关于分区的详细信息 |
-S | unit | 使用指定单位显示。参数有 k 、K 、m 、M ,分别代表1000、1024、1000000、1048576字节(byte)。默认单位为K(1024 bytes)。注意:此选项并不改变si/so、bi/bo的展示 |
-t | timestamp | 在每一行中增加时间戳 |
-w | wide | 宽输出模式,在这种模式下,每行的输出宽度超过80个字符 |
-v | version | 展示版本信息并退出 |
-h | help | 展示帮助信息并退出 |
命令输出结果
下面对命令在不同模式下的输出结果进行说明:
虚拟内存模式下的输出
处理器
r: 表示处于运行状态的进程数量
b: 表示处于不可中断睡眠状态的进程数量
内存
swpd: 已使用的虚拟内存总量
free: 空闲内存总量
buff: 作为buffer使用的内存总量
cache: 作为cache使用的内存总量
inact: 不活跃内存的总量
active:活跃内存的总量
swap交换区
si: Amount of memory swapped in from disk (/s).即:每秒从磁盘读入虚拟内存的大小
so: Amount of memory swapped to disk (/s) 即:每秒从虚拟内存写入到磁盘的大小
IO
bi:Blocks received from a block device (blocks/s).即:每秒从块设备中接收的块数
bo:Blocks sent to a block device (blocks/s).即:每秒发送到块设备的块数
系统
in: The number of interrupts per second, including the clock. 即:每秒中断的个数,包括时钟
cs: The number of context switches per second.即:每秒执行上下文切换的个数
CPU
下面这些是占总的CPU时间的比例
us: 运行非内核代码的时间。(用户时间,包括:nice time)
sy: 运行内核代码的时间。(系统时间)
id: 空闲时间
wa: 等待IO的时间。(被包含到空闲时间中)
st: 虚拟主机占用的时间
磁盘模式下的输出
读操作
total: 已完成的成功读取次数
merged: 被合并的读操作的个数
sectors: 成功读取的分区数
ms: 读操作耗费的毫秒数
写操作
total: 已完成的成功写次数
merged: 被合并的写操作的个数
sectors: 成功写的分区数
ms: 写操作耗费的毫秒数
IO
cur: 进行中的IO
s: IO花费的秒数
磁盘分区模式下的输出
reads: 提交到此分区的读操作个数
read sectors: 此分区总的读取分区数
writes: 提交到此分区的总的写操作个数
requested writes: 此分区总的写请求个数
SLAB模式下的输出
cache:缓存名称
num :当前活跃对象的个数
total:可用对象的总数
size : 每个对象的大小
pages: 至少含有一个活跃对象的页面个数
常用示例
[root@01r5840viotftelmrcx2Z ~]#
[root@01r5840viotftelmrcx2Z ~]# vmstat -a 2 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free inact active si so bi bo in cs us sy id wa st
1 0 0 1114348 3510560 10542308 0 0 8 86 6 3 1 0 98 0 0
0 1 0 1111472 3510628 10542756 0 0 4 988 3058 3500 1 0 98 1 0
0 1 0 1112836 3510600 10542824 0 0 0 540 2334 2758 1 0 98 0 0
[root@01r5840viotftelmrcx2Z ~]#
[root@01r5840viotftelmrcx2Z ~]# vmstat -s
15732096 K total memory
2244076 K used memory
10517148 K active memory
3513080 K inactive memory
1127760 K free memory
146384 K buffer memory
12213876 K swap cache
0 K total swap
0 K used swap
0 K free swap
4568779 non-nice user cpu ticks
19 nice user cpu ticks
595514 system cpu ticks
404812994 idle cpu ticks
1281694 IO-wait cpu ticks
0 IRQ cpu ticks
84346 softirq cpu ticks
0 stolen cpu ticks
32875380 pages paged in
354599478 pages paged out
0 pages swapped in
0 pages swapped out
1144664542 interrupts
1690316285 CPU context switches
1607075802 boot time
46254 forks
[root@01r5840viotftelmrcx2Z ~]#
以M为单位展示内存的使用情况
[root@01r5840viotftelmrcx2Z ~]# vmstat -S M
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 1085 142 12611 0 0 8 86 9 6 1 0 98 0 0
[root@01r5840viotftelmrcx2Z ~]#