Linux:vmstat指令

学习自:

Vmstat 命令详解-CSDN博客

Linux 内存之vmstat-CSDN博客

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

 

posted @ 2024-10-29 10:12  ShineLe  阅读(11)  评论(0编辑  收藏  举报