欢迎您, 来到 宁时修博客.^_^

Linux性能分析命令---vmstat

2019/07/05 林木立 linux命令 553
vmstat 命令使用

一、vmstat简介

    vmstat - Report virtual memory statistics,报告虚拟内存统计信息。

    vmstat会报告有关 processes(进程), memory(内存), paging(分页), block IO(块IO), traps, disks(磁盘) and cpu activity(CPU活动)的信息。



二、用法和选项

    用法:

vmstat [options] [delay [count]]


    options(选项):

delay:数据采样之间的延迟(时间间隔)(单位 秒)。如果未指定延迟,则只打印一个报告,其中包含自启动以来的平均值。
count:数据采样的次数。在没有计数的情况下,当定义采集时间间隔时,默认是无限的。

-a, --active:在内核为2.5.41或更高版本时显示活动和非活动内存。
-f, --forks:-f开关显示系统从开机启动至今的fork数,这包括fork,vfork和clone系统调用,相当于创建的任务总数。每个进程由一个或多个任务表示,具体取决于线程使用情况。此显示不重复。
-m, --slabs:显示slabinfo(内核slab分配器统计信息)
-n, --one-header:仅显示一次标题,而不是定期显示
-s, --stats:显示各种事件(系统活动)计数器和内存统计信息的表。此显示不重复。
-d, --disk:报告磁盘统计信息(内核2.5.70或更高版本)
-D, --disk-sum:报告一些关于磁盘活动的汇总统计数据
-p, --partition device:指定磁盘分区的详细统计信息(内核2.5.70或更高版本)
-S, --unit character:使用指定单位显示。参数有 k 、K 、m 、M ,分别代表1000、1024、1000000、1048576字节(byte)。默认单位为K(1024 bytes)。注意:这不会改变 swap(si/so)或block(bi/bo)字段
-t, --timestamp:每行显示都追加时间戳
-w, --wide:宽输出模式,每行字段的间隔加长。对于内存量较大的系统很有用,默认输出模式会出现数据排列不对称
-V, --version:显示vmstat版本信息并退出
-h, --help:显示vmstat帮助信息



三、vmstat用法示例,及输出说明

    直接在命令输入vmstat:

$ vmstat
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 4651744 436008 5115820    0    0     0    27    0    0  4  1 95  0  0
$ vmstat 4 4
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 4651736 436008 5115820    0    0     0    27    0    0  4  1 95  0  0
 0  0      0 4651844 436008 5115820    0    0     0     0 6963 13403  1  1 99  0  0
 0  0      0 4651860 436008 5115820    0    0     0     8 6461 12648  1  1 98  0  0
 0  0      0 4651844 436008 5115820    0    0     0     6 5783 11915  1  1 98  0  0
$ vmstat -w 4 4
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      4652124       436008      5115820    0    0     0    27    0    0   4   1  95   0   0
 1  0            0      4652092       436008      5115820    0    0     0    45 6190 12337   1   1  98   0   0
 0  0            0      4652092       436008      5115820    0    0     0     0 6572 12837   1   1  98   0   0
 0  0            0      4652092       436008      5115820    0    0     0     8 5889 12037   1   1  98   0   0

    生成的第一份报告给出了自上次重启以来的平均值。其他报告提供了有关延迟采样周期性的信息。

    

    输出信息说明:

    Procs(进程相关):

        r:运行队列中进程数量(包括正在运行和等待运行的进程)。如果长期大于服务器cpu的个数,就会出现CPU瓶颈,表示CPU很繁忙,一般会造成CPU使用率很高。

        b:等待资源的进程数,因为等待I/O、内存导致不可中断的进程


    memory(内存相关):

        swpd:使用的虚拟内存(swap 交换分区)量。如果大于0,表示机器物理内存不足,如果不是程序内存泄露的原因,那么该升级内存了或者把耗内存的任务迁移到其他机器。

        free:当前空闲的物理内存量。

        buff:用作缓冲区(从内存写入磁盘)的内存量。

        cache:用作缓存(从磁盘中读入到内存)的内存量,cache用来记忆磁盘中频繁打开的文件。如果cache的值大,说明cache里的文件数多。频繁访问的文件都能从cache里读取,那么磁盘的读IO(bi)会非常小。

        inact:非活动内存量(-a 选项)

        active:活动内存量(-a选项)


    swap(交换分区相关):

        si:从磁盘读入虚拟内存的数据量(单位:kb/s)。

        so:从虚拟内存写入磁盘的数据量(单位:kb/s)。

        内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。

        有些朋友看到空闲内存(free)很少的或接近于0时,就认为内存不够用了,不能光看这一点,还要结合si和so,如果free很少,但是si和so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。因为linux总是先把内存用光。


    io(磁盘input/output 相关):

        bi:从块设备读取的块数量(读磁盘)(单位:blocks/s),从磁盘里出来进入到内存里边去。

        bo:发送(写入)到块设备的块数量(写磁盘)(单位:blocks/s)。

        块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024 byte。

        这两个字段的值频繁的变化证明磁盘被频繁的读写。


    system(显示采集间隔内发生的中断次数):

        in:表示在某一时间间隔中观测到的每秒设备中断数,包括时钟中断。

        cs:表示每秒产生的上下文切换次数。


    cpu(CPU使用状态):

        这些是总CPU时间的百分比。

        us:运行非内核代码所花费的CPU时间(用户态时间,包括nice时间)百分比。如果长期超50%的使用,那么就该考虑优化程序算法或者进行加速。

        sy:运行内核代码所花费的CPU时间(系统内核态时间)百分比。如果太高,表示系统调用时间长,例如是IO操作频繁。

        id:CPU处于空闲时间百分比,在Linux内核2.5.41版本之前,包括IO等待时间。

        wa:等待IO所占用的CPU时间百分比,在Linux内核2.5.41版本之前,包含在空闲时间中。wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。

        st:从虚拟机窃取的CPU时间百分比(一般都为0,不用关注),在Linux内核2.6.11版本之前,未明确。

        注意:us+sy+id=100%



    示例:vmstat -a 显示活跃和非活跃内存,显示增加了inact和active列。

$ 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
 1  0      0 4623800 805952 26511596    0    0     0    27    0    0  4  1 95  0  0



    示例:vmstat -s 查看内存使用的详细信息。

$ vmstat -s
     32780452 K total memory
     22605940 K used memory
     26511756 K active memory
       805940 K inactive memory
      4623568 K free memory
       435940 K buffer memory
      5115004 K swap cache
            0 K total swap
            0 K used swap
            0 K free swap
    287459313 non-nice user cpu ticks
         1929 nice user cpu ticks
     53344176 system cpu ticks
   6724446685 idle cpu ticks
      2565236 IO-wait cpu ticks
            0 IRQ cpu ticks
      1240450 softirq cpu ticks
            0 stolen cpu ticks
      9625485 pages paged in
   1938392716 pages paged out
            0 pages swapped in
            0 pages swapped out
   3697828060 interrupts
   1323252128 CPU context switches
   1544539102 boot time
     25927757 forks
$ vmstat -s -S M
        32012 M total memory
        22076 M used memory
        25890 M active memory
          787 M inactive memory
         4515 M free memory
          425 M buffer memory
         4995 M swap cache
            0 M total swap
            0 M used swap
            0 M free swap
    287459339 non-nice user cpu ticks
         1929 nice user cpu ticks
     53344197 system cpu ticks
   6724449707 idle cpu ticks
      2565236 IO-wait cpu ticks
            0 IRQ cpu ticks
      1240450 softirq cpu ticks
            0 stolen cpu ticks
      9625485 pages paged in
   1938392732 pages paged out
            0 pages swapped in
            0 pages swapped out
   3697877576 interrupts
   1323349950 CPU context switches
   1544539102 boot time
     25927764 forks



    示例:vmstat -d 查看磁盘的详细信息,隔4秒获取一次数据,总共获取4次。

$ vmstat -d -w 4 4
disk- -------------------reads------------------- -------------------writes------------------ ------IO-------
          total    merged     sectors          ms     total    merged     sectors          ms     cur     sec
vda      318680       740    19250970     2653460 129818178  61861298  3876834576  2247355893       0   40516
vda      318680       740    19250970     2653460 129818178  61861298  3876834576  2247355893       0   40516
vda      318680       740    19250970     2653460 129818188  61861298  3876834696  2247355903       0   40516
vda      318680       740    19250970     2653460 129818203  61861303  3876834920  2247355931       0   40516

    disk:磁盘

    reads:读取

        total:成功完成的读取总数

        merged:分组读取(产生一个 I/O)

        sectors:成功读取的扇区

        ms:读取所用的毫秒数

    writes:写入

        total:成功完成的总写入数

        merged:分组写入(生成一个I/O)

        sectors:成功写入的扇区

        ms:写入所用的毫秒数

    IO:

        cur:正在进行的I/O

        sec:I/O所用的秒数



    示例:查看指定磁盘分区的读/写。

$ vmstat -p /dev/vda1 4 4
vda1          reads   read sectors  writes    requested writes
              318560   19245178  129281747 3876884632
              318560   19245178  129281750 3876884664
              318560   19245178  129281750 3876884664
              318560   19245178  129281757 3876884744

    reads:发送到此分区的读取总数

    read sectors:分区的读取扇区总数

    writes:发给此分区的写入总数

    requested writes:为分区发出的写入请求总数


    示例:查看slab分配器信息

$ vmstat -m
Cache                       Num  Total   Size  Pages
ext4_groupinfo_4k           810    810    136     30
ext4_inode_cache          87551 103850   1032     31
ext4_xattr                  184    184     88     46
ext4_free_data             2880   2880     64     64
ext4_allocation_context     128    128    128     32
ext4_io_end                1736   1736     72     56
ext4_extent_status        86292  90372     40    102
jbd2_journal_handle         340    340     48     85
jbd2_journal_head          1332   1332    112     36

    Cache:缓存名称

    Num:当前活动对象数

    Total:可用对象总数

    Size:每个对象的大小

    Pages:至少有一个活动对象的页数

    可通过  cat /proc/slabinfo 查看更详细的信息(网页:http://www.man7.org/linux/man-pages/man5/slabinfo.5.html)。

点赞
说说你的看法

所有评论: (0)

# 加入组织

1、用手机QQ扫左侧二维码

2、搜Q群:1058582137

3、点击 宁时修博客交流群