Linux命令之vmstat命令

一、命令简介

        vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控。他是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。vmstat 工具提供了一种低开销的系统性能观察方式。因为 vmstat 本身就是低开销工具,在非常高负荷的服务器上,你需要查看并监控系统的健康情况,在控制窗口还是能够使用vmstat 输出结果。

二、命令参数及格式

1、参数说明

-a:显示活跃和非活跃内存
-f:显示从系统启动至今的fork数量 。
-m:显示slabinfo
-n:只在开始时显示一次各字段名称。
-s:显示内存相关统计信息及多种系统活动数量。
delay:刷新时间间隔。如果不指定,只显示一条结果。
count:刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷。
-d:显示磁盘相关统计信息。
-p:显示指定磁盘分区统计信息
-S:使用指定单位显示。参数有 k 、K 、m 、M ,分别代表1000、1024、1000000、1048576字节(byte)。默认单位为K(1024 bytes)
-V:显示vmstat版本信息。

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]

三、字段说明

[root@lvext4test ~]# vmstat
procs -----------memory---------- —swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 1536456 15248 202684 0 0 58 19 48 114 1 0 98 1 0

  • r 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。
  • b 表示阻塞的进程,这个不多说,进程阻塞,大家懂的。
  • swpd 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
  • free 空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。
  • buff Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M
  • cache cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)
  • si 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。
  • so 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
  • bi 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒
  • bo 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
  • in 每秒CPU的中断次数,包括时间中断
  • cs 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。
  • us 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。
  • sy 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
  • id 空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。
  • wt 等待IO CPU时间。

四、使用示例

1、3秒采用1次,采样3次

[root@lvext4test ~]# vmstat 3 3
procs -----------memory---------- —swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 1536504 15248 202684 0 0 59 19 48 114 1 0 98 1 0
0 0 0 1536448 15248 202684 0 0 0 0 25 35 0 0 100 0 0
0 0 0 1536480 15248 202684 0 0 0 0 28 38 0 0 100 0 0

2、显示活跃和非活跃内存

[root@lvext4test ~]# vmstat -a 3 3

procs -----------memory---------- —swap-- -----io---- -system-- ------cpu-----
r b swpd free inact active si so bi bo in cs us sy id wa st
2 0 0 1536504 110012 129548 0 0 57 18 48 111 1 0 98 1 0
0 0 0 1536480 110012 129560 0 0 0 0 27 40 0 0 100 0 0
0 0 0 1536448 110012 129572 0 0 0 0 28 39 0 0 100 0 0

3、查看系统已经fork了多少次

[root@lvext4test ~]# vmstat -f
16063 forks
这个数据是从/proc/stat中的processes字段里取得的

4、查看内存使用的详细信息

[root@lvext4test ~]# vmstat -s
1882624 K total memory
128188 K used memory
129552 K active memory
110012 K inactive memory
1536504 K free memory
15248 K buffer memory
202684 K swap cache
6291444 K total swap
0 K used swap
6291444 K free swap
1733 non-nice user cpu ticks
0 nice user cpu ticks
1363 system cpu ticks
309190 idle cpu ticks
3985 IO-wait cpu ticks
0 IRQ cpu ticks
7 softirq cpu ticks
0 stolen cpu ticks
172823 pages paged in
55628 pages paged out
0 pages swapped in
0 pages swapped out
148320 interrupts
343846 CPU context switches
1609986998 boot time
16064 forks
这些信息的分别来自于/proc/meminfo,/proc/stat和/proc/vmstat。

5、查看磁盘的读/写

[root@lvext4test ~]# vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 7448 0 308926 124412 914 1704 111256 357569 0 47
sdb 232 0 22784 3864 0 0 0 0 0 2
sdc 226 0 11880 3382 0 0 0 0 0 2
sr0 18 0 2056 5 0 0 0 0 0 0
dm-0 7113 0 273138 119383 2549 0 85000 1052773 0 43
dm-1 88 0 4656 1537 0 0 0 0 0 1
dm-2 96 0 4666 459 3 0 24 4 0 0
这些信息主要来自于/proc/diskstats.

6、查看某磁盘的读/写

[root@lvext4test ~]# vmstat -p /dev/sdc1
sdc1 reads read sectors writes requested writes
137 6472 0 0
[root@lvext4test ~]# vmstat -p /dev/sda2
sda2 reads read sectors writes requested writes
7212 280372 869 85024
这些信息主要来自于/proc/diskstats。

7、查看系统的slab信息

[root@lvext4test ~]# vmstat -m
Cache Num Total Size Pages
nf_conntrack_ffffffffad311640 36 36 320 12
ext4_groupinfo_4k 210 210 136 30
ext4_inode_cache 4829 5160 1032 15
ext4_xattr 0 0 88 46
ext4_free_data 128 128 64 64
ext4_allocation_context 32 32 128 32
ext4_io_end 112 112 72 56
ext4_extent_status 5100 5100 40 102
jbd2_journal_handle 85 85 48 85
jbd2_journal_head 648 648 112 36
jbd2_revoke_table_s 256 256 16 256
jbd2_revoke_record_s 128 128 32 128
kcopyd_job 0 0 3312 9
dm_uevent 0 0 2608 12
dm_rq_target_io 0 0 136 30
ip6_dst_cache 105 144 448 9
RAWv6 13 13 1216 13
UDPLITEv6 0 0 1216 13
UDPv6 13 13 1216 13
tw_sock_TCPv6 0 0 256 16
TCPv6 15 15 2112 15
cfq_queue 0 0 232 17
bsg_cmd 0 0 312 13
mqueue_inode_cache 9 9 896 9
hugetlbfs_inode_cache 13 13 608 13
Cache Num Total Size Pages
configfs_dir_cache 0 0 88 46
dquot 16 16 256 16
kioctx 14 14 576 14
userfaultfd_ctx_cache 0 0 192 21
pid_namespace 0 0 2200 14
posix_timers_cache 0 0 248 16
UDP-Lite 0 0 1088 15
flow_cache 0 0 144 28
UDP 15 15 1088 15
tw_sock_TCP 0 0 256 16
TCP 8 8 1984 8
dax_cache 10 10 768 10
blkdev_queue 26 26 2456 13
blkdev_ioc 78 78 104 39
user_namespace 0 0 480 8
sock_inode_cache 228 228 640 12
fsnotify_mark_connector 135150 135150 24 170
net_namespace 6 6 5248 6
shmem_inode_cache 1020 1020 680 12
Acpi-State 102 102 80 51
task_delay_info 252 252 112 36
taskstats 12 12 328 12
proc_inode_cache 1367 1488 656 12
sigqueue 25 25 160 25
bdev_cache 19 19 832 19
Cache Num Total Size Pages
kernfs_node_cache 32266 32266 120 34
mnt_cache 173 210 384 10
inode_cache 16295 16497 592 13
dentry 27998 28770 192 21
iint_cache 0 0 128 32
avc_xperms_node 657 657 56 73
avc_node 5656 5656 72 56
selinux_inode_security 27186 28152 40 102
buffer_head 7104 8697 104 39
vm_area_struct 3662 3780 216 18
mm_struct 50 50 1600 10
files_cache 48 48 640 12
signal_cache 165 210 1152 14
sighand_cache 160 195 2112 15
task_xstate 172 225 1088 15
task_struct 168 203 4160 7
anon_vma 1632 1632 80 51
shared_policy_node 3060 3060 48 85
numa_policy 15 15 264 15
radix_tree_node 2570 2730 584 14
idr_layer_cache 180 180 2112 15
dma-kmalloc-8192 0 0 8192 4
dma-kmalloc-4096 0 0 4096 8
dma-kmalloc-2048 0 0 2048 8
dma-kmalloc-1024 0 0 1024 8
Cache Num Total Size Pages
dma-kmalloc-512 8 8 512 8
dma-kmalloc-256 0 0 256 16
dma-kmalloc-128 0 0 128 32
dma-kmalloc-64 0 0 64 64
dma-kmalloc-32 0 0 32 128
dma-kmalloc-16 0 0 16 256
dma-kmalloc-8 0 0 8 512
dma-kmalloc-192 0 0 192 21
dma-kmalloc-96 0 0 96 42
kmalloc-8192 44 44 8192 4
kmalloc-4096 234 240 4096 8
kmalloc-2048 679 704 2048 8
kmalloc-1024 1529 1568 1024 8
kmalloc-512 581 640 512 8
kmalloc-256 3703 3744 256 16
kmalloc-192 2665 2961 192 21
kmalloc-128 1560 1856 128 32
kmalloc-96 4242 4242 96 42
kmalloc-64 37440 37440 64 64
kmalloc-32 124800 124800 32 128
kmalloc-16 61696 61696 16 256
kmalloc-8 87040 87040 8 512
kmem_cache_node 128 128 64 64
kmem_cache 112 112 256 16
这组信息来自于/proc/slabinfo。
slab是Linux操作系统的一种内存分配机制。其工作是针对一些经常分配并释放的对象,如进程描述符等,这些对象的大小一般比较小,如果直接采用伙伴系统来进行分配和释放,不仅会造成大量的内存碎片,而且处理速度也太慢。而slab分配器是基于对象进行管理的,相同类型的对象归为一类(如进程描述符就是一类),每当要申请这样一个对象,slab分配器就从一个slab列表中分配一个这样大小的单元出去,而当要释放时,将其重新保存在该列表中,而不是直接返回给伙伴系统,从而避免这些内碎片。slab分配器并不丢弃已分配的对象,而是释放并把它们保存在内存中。当以后又要请求新的对象时,就可以从内存直接获取而不用重复初始化。
对象高速缓存的组织如右下图所示,高速缓存的内存区被划分为多个slab,每个slab由一个或多个连续的页框组成,这些页框中既包含已分配的对象,也包含空闲的对象。
在cache和object中加入slab分配器,是在时间和空间上的折中方案。

猜你喜欢

转载自blog.csdn.net/carefree2005/article/details/112276915