Linux:vmstat指令
学习自:
1、Linux分页管理概述
vmstat(Virtual Memory Statistics,虚拟内存),用于对OS的虚拟内存、进程、CPU活动进行监控。
它是对系统整体情况的分析,无法对某个进程进行深入分析。
1)虚拟内存
Linux系统内存分为物理内存、虚拟内存两种。
物理内存就是物理内存条上的内存。
虚拟内存是逻辑内存,是指利用硬盘上部分空间作为物理内存的补充,将暂时不用的内存页写到硬盘上以空出更多的物理内存供又需要的进程使用。当这些内存页需要再次使用时,才从虚拟内存中读回。这一过程对用户透明。
对Linux来说,虚拟内存就是Swap分区。
2)页面交换
Linux的内存管理采取的是页式存取,为保证物理内存可以得到充分使用,内核会在适当时机将内存中最近不常用到页自动交换到虚拟内存,而将经常使用的信息保存到物理内存。
Linux的页面交换是不定时进行的,以保证尽可能多的空出物理内存,即使当前物理内存充足,它也会交换,以避免出现实际要交换时却等待交换的现象。
Linux的页面交换是有条件的,并非所有页面不用时都会交换到虚拟内存,Linux内核采用最近最常使用算法,仅将一些不经常使用的页面交换到虚拟内存。因此有时会看到这种情况:Liunx的物理内存还有很多,但是swap空间也用了很多,这是正常现象。例如一个占用很多内存的进程运行时需要耗费很多资源,此时会有一些不常用的页面文件交换到swap区,当后续该进程结束并释放内存,刚刚交换出去的页并不会主动交换回来,除非它们将要被使用。此时就会出现上述物理内存空闲、swap空间也有占用的现象。
当swap区要交换进来时,它会首先被交换到物理内存,如果此时没有足够的物理内存容纳这些页,它们会被立刻交换出去。此时swap区也可能没有足够空间来存储这些页,最终导致Linux出现假死机、服务异常情况。
3)Linux页面交换流程
系统中每个进程都需要使用内存,但并非每个进程需要时时刻刻占用内存。
当系统运行所需内存超过了实际物理内存,内核会释放某些进程所占用但未使用的部分或全部物理内存,将这些进程页调度到磁盘空间,即上文提到的swap区。此时在物理内存中空出的内存会提供给有需要的进程使用。
在Linux中,通过调页Paging、交换Swaping实现上述内存调度。调度算法是将最近不常使用的页面交换到swap区,把活动页面留到内存中供进程使用。交换的是整个进程全部页面而非部分页面。
页写入磁盘的过程称为Page-Out。
页从磁盘重回内存的过程称为Page-In。
当内核需要一个页,但是该页不在物理内存中,此时会触发分页错误(Page Fault)。
当内核发现可运行内存减少时,就会通过Page-Out来释放一部分物理内存。
2、vmstat
1)用途
显示swap区内存信息。
2)用法
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]
这里的delay、count不是参数名,而是具体的数字:
delay:每隔多少秒输出一次;
count:一共输出几次
vmstat -a 2 5
每隔2s输出一次,一共输出5次。
3)参数
参数 | 说明 |
a |
显示active、inactive内存: active:当前进程使用的内存 inactive:已经分配了,但是还未被使用的内存 |
s |
显示内存相关统计信息及多种系统活动数量 显示内存使用的详细信息 |
m | 显示slabinfo |
d |
显示磁盘相关统计信息 |
p | 显示指定磁盘分区统计信息 |
n |
只显示一次表头 如果不加该参数,每输出44行就重复显示一次表头 |
S |
使用指定单位,后跟k、K、m、M。 分别代表103,210,106,220B。 默认为K。 |
f |
显示系统启动至今的fork数量。 fork:Linux函数,用于创建子进程,原进程称为父进程。 |
V | vmstat版本信息 |
4)输出字段说明
常规
vmstat procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 3 0 0 389880 3128 281808 0 0 40 17 75 109 0 0 100 0 0 vmstat -a procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free inact active si so bi bo in cs us sy id wa st 3 0 0 470148 156800 76880 0 0 400 79 97 196 0 1 98 0 0
指标 | 用途 | 说明 |
procs | ||
r | running,运行队列中进程数量 |
r>cpu个数,代表当前系统运行慢,有较多进程等待cpu r>4×cpu个数,代表CPU短缺或速率过低 |
b | 等待IO的进程数量 | 如果disk≠0且b>3,代表io性能不好 |
memory | ||
swpd | 已使用swap空间大小 | |
free | 可用物理内存大小 | |
buff | 缓冲区内存大小 | |
cache | 缓存区内存大小 | |
inact | 非活跃内存(参数-a) | |
active | 活跃内存(参数-a) | |
swap | ||
si | 每秒从swap区写到内存的大小 | |
so | 每秒从内存写到swap区的大小 | |
io | ||
bi | 每秒从磁盘读取的页数 | 如果长期bi、bo≠0,代表内存不足 |
bo | 每秒写入磁盘的页数 | |
system | ||
in | 每秒中断数,包括时钟中断 | |
cs | 每秒上下文切换数 | |
CPU | ||
us | 用户进程执行时间百分比 |
1)id+us+sy=100 2)如果r>4,且id经常<40,表示cpu负荷很重 3)如果id持续为0且sy>2×us,代表系统面临CPU资源短缺的问题 |
sy | 系统进程执行时间百分比 | |
id | CPU空闲时间百分比 | |
wa | 等待IO时间 | |
st | 被虚拟机使用的CPU时间百分比 |
磁盘:-d
vmstat -d disk- ------------reads------------ ------------writes----------- -----IO------ total merged sectors ms total merged sectors ms cur sec sda 4199 3 350807 3582 308 28 69832 728 0 3 sr0 31 0 147 292 0 0 0 0 0 0
该信息来自/proc/diskstats
指标 | 用途 | 说明 |
reads | ||
total | 成功读取的总数 | |
merged | 分组读取(产生一个IO) | |
sectors | 成功读取的扇区数 | |
ms | 读取花费的毫秒 | |
writes | ||
total | 成功写入的总数 | |
merged | 分组写入(产生一个IO) | |
sectors | 成功写入的扇区数 | |
ms | 写入花费的毫秒 | |
IO | ||
cur | 正在进行的IO数 | |
sec | IO花费的秒数 |
指定磁盘:-p
vmstat -p /dev/sda1 sda1 reads read sectors writes requested writes 156 89110 2 4096
指标 | 用途 | 说明 |
reads | 来自该分区的读取次数 | |
read sectors | 来自该分区的读扇区次数 | |
writes | 来自该分区的写入次数 | |
requested writes | 来自该分区的写请求次数 |
slab:-m
vmstat -m Cache Num Total Size Pages xfs_dqtrx 0 0 528 15 xfs_dquot 0 0 496 8 xfs_buf 1431 1431 448 9 xfs_bui_item 0 0 200 20 xfs_bud_item 0 0 168 24…… kmem_cache_node 256 256 64 64 kmem_cache 234 234 448 9
该信息来自/proc/slabinfo
Linux的内存分配是以页为单位,但是如果给某些小对象分配一个完整的页,会导致页空间存在浪费。slab可以把页划分为多个相等的小内存单元,再把这些小对象统一分到一个页中,进而减少内部碎片产生(学习自:Linux 内存管理(八)之 slab 分配器_linux slab-CSDN博客)。
5)例子
①每秒采样一次,一共采两次
vmstat 1 2 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 4 0 0 470088 4168 206808 0 0 538 106 108 228 1 1 98 0 0 0 0 0 470028 4168 206808 0 0 0 0 84 127 0 0 100 0 0
②指定输出单位为MB:-S
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 3 0 0 459 4 201 0 0 457 90 103 211 1 1 98 0 0
③显示活跃、非活跃内存:-a
vmstat -a procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free inact active si so bi bo in cs us sy id wa st 3 0 0 470148 156800 76880 0 0 400 79 97 196 0 1 98 0 0
在使用参数-a时,所显示内容相比经典输出,只是增加了active和inact。
④查看系统fork了多少次:-f
vmstat -f 1291 forks
fork是Linux的一个重要函数,代表从原进程中创建一个子进程,原进程称为父进程。
该数据来源于/proc/stat中的processes字段:
cat /proc/stat cpu 216 1 392 69682 39 86 21 0 0 0 cpu0 216 1 392 69682 39 86 21 0 0 0 intr 58434 …… ctxt 111387 btime 1730164117 processes 1295 procs_running 3 procs_blocked 0 softirq 57128 7 18948 133 1764 4572 0 101 0 0 31603
⑤显示内存使用的详细信息:-s
vmstat -s 828592 K total memory 147540 K used memory 76888 K active memory 156836 K inactive memory 470008 K free memory 4168 K buffer memory 206876 K swap cache 1952764 K total swap 0 K used swap 1952764 K free swap 216 non-nice user cpu ticks 1 nice user cpu ticks 397 system cpu ticks 80120 idle cpu ticks 39 IO-wait cpu ticks 95 IRQ cpu ticks 24 softirq cpu ticks 0 stolen cpu ticks 175473 pages paged in 34748 pages paged out 0 pages swapped in 0 pages swapped out 65064 interrupts 121999 CPU context switches 1730164117 boot time 1296 forks
这些信息分别来自于:/proc/meminfo、/proc/stat、/proc/vmstat
默认显示单位为KB,可以用-S将单位调整为MB
vmstat -sS M 809 M total memory 144 M used memory 75 M active memory 153 M inactive memory 458 M free memory 4 M buffer memory 202 M swap cache 1906 M total swap 0 M used swap 1906 M free swap 217 non-nice user cpu ticks 1 nice user cpu ticks 398 system cpu ticks 80731 idle cpu ticks 40 IO-wait cpu ticks 96 IRQ cpu ticks 24 softirq cpu ticks 0 stolen cpu ticks 175473 pages paged in 34748 pages paged out 0 pages swapped in 0 pages swapped out 65420 interrupts 122594 CPU context switches 1730164117 boot time 1297 forks