vmstat

vmstat命令是最常见的Linux/Unix监控工具,属于sysstat包。可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令,一个是Linux/Unix都支持,二是相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)。

可以通过命令进行安装<font style="color:rgb(56, 58, 66);background-color:rgb(250, 250, 250);">yum </font><font style="color:rgb(166, 38, 164);">install</font><font style="color:rgb(56, 58, 66);background-color:rgb(250, 250, 250);"> -y sysstat</font>

使用

一般vmstat工具的使用是通过两个数字参数来完成,1.采样的时间间隔数(秒),2.采样的次数,如:
  1. $ vmstat 2 3
  2. procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
  3. r b swpd free buff cache si so bi bo in cs us sy id wa st
  4. 2 0 0 2530764 2104 995028 0 0 227 66 628 1309 2 3 95 0 0
  5. 0 0 0 2529872 2104 995100 0 0 0 0 1568 3396 3 3 94 0 0
  6. 0 0 0 2530060 2104 995132 0 0 0 0 1373 2916 2 3 95 0 0

每隔2秒采集一次,共采集3次

需要一直进行采集只需通过一个采集时间间隔数(秒),通过^C结束,如下:

  1. $ vmstat 2
  2. procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
  3. r b swpd free buff cache si so bi bo in cs us sy id wa st
  4. 1 0 0 2530232 2104 995228 0 0 205 59 628 1311 2 3 95 0 0
  5. 0 0 0 2529884 2104 995236 0 0 0 0 1278 2692 2 2 96 0 0
  6. 0 0 0 2529600 2104 995236 0 0 0 0 1197 2679 2 2 97 0 0
  7. ^C

字段含义

类别 指标 含义 说明
procs r 等待执行的任务数 展示了正在执行和等待cpu资源的任务个数。当这个值超过了cpu个数,就会出现cpu瓶颈。
b 等待IO的进程数
memory swpd 正在使用虚拟的内存大小,单位k
free 空闲内存大小
buff 已用的buff大小,对块设备的读写进行缓冲
cache 已用的cache大小,文件系统的cache
inact 非活跃内存大小,即被标明可回收的内存,区别于free和active 具体含义见:概念补充(当使用-a选项时显示)
active 活跃的内存大小 具体含义见:概念补充(当使用-a选项时显示)
swap si 每秒从交换区写入内存的大小(单位:kb/s)
so 每秒从内存写到交换区的大小
IO bi 每秒读取的块数(读磁盘) 块设备每秒接收的块数量,单位是block,这里的块设备是指系统上所有的磁盘和其他块设备,现在的Linux版本块的大小为1024bytes
bo 每秒写入的块数(写磁盘) 块设备每秒发送的块数量,单位是block
system in 每秒中断数,dfdffsd包括时钟中断 这两个值越大,会看到由内核消耗的cpu时间sy会越多

秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,**要考虑调低线程或者进程的数目**
cs 每秒上下文切换数
CPU(以百分比表示) us 用户进程执行消耗cpu时间(user time) us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期超过50%的使用,那么我们就该考虑优化程序算法或其他措施了
sy 系统进程消耗cpu时间(system time) sys的值过高时,说明系统内核消耗的cpu资源多,这个不是良性的表现,我们应该检查原因。这里us + sy的参考值为80%,如果us+sy 大于 80%说明可能存在CPU不足
Id 空闲时间(包括IO等待时间) 一般来说 us+sy+id=100
wa 等待IO时间 wa过高时,说明io等待比较严重,这可能是由于磁盘大量随机访问造成的,也有可能是磁盘的带宽出现瓶颈。

怎么看

  1. 如果r经常大于4,且id经常少于40,表示cpu的负荷很重。
  2. 如果bi,bo长期不等于0,表示内存不足。
  3. 如果disk经常不等于0,且在b中的队列大于3,表示io性能不好。
注:返回结果中的主要数据列说明如下。
  • r:表示系统中CPU等待处理的线程。一个CPU每次只能处理一个线程,所以该数值越大,通常表示系统运行越慢。
  • us:用户模式消耗的CPU时间百分比。该值较高时,说明用户进程消耗的CPU时间比较多。如果该值长期超过50%,则需要对程序算法或代码等进行优化。
  • sy:内核模式消耗的CPU时间百分比。
  • wa:IO等待消耗的CPU时间百分比。该值较高时,说明IO等待比较严重,这可能磁盘大量作随机访问造成的,也可能是磁盘性能出现了瓶颈。
  • id:处于空闲状态的CPU时间百分比。如果该值持续为0,同时sy是us的两倍,则通常说明系统面临CPU资源短缺。

ps

ps -axjf排查是否存在僵尸进程(D+)

top

top命令经常用来监控linux的系统状况,是常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。 top的使用方式 <font style="color:rgb(77, 77, 77);">top [-d number] | top [-bnp]</font> | 类型 | 参数/命令 | 说明 | | —- | —- | —- | | 参数 | -d | number代表秒数,表示top命令显示的页面更新一次的间隔。默认是5秒。 | | | -b | 以批次的方式执行top | | | -n | 与-b配合使用,表示需要进行几次top命令的输出结果。 | | | -p | 指定特定的pid进程号进行观察。 | | 指令 | ? | 显示在top当中可以输入的命令 | | | P | 以CPU的使用资源排序显示 | | | M | 以内存的使用资源排序显示 | | | N | 以pid排序显示 | | | T | 由进程使用的时间累计排序显示 | | | k | 给某一个pid一个信号。可以用来杀死进程 | | | r | 给某个pid重新定制一个nice值(即优先级) | ## 使用 实例 shell $ top top - 09:16:54 up 1:07, 1 user, load average: 0.03, 0.13, 0.12 Tasks: 174 total, 1 running, 107 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 4004944 total, 2525452 free, 480696 used, 998796 buff/cache KiB Swap: 0 total, 0 free, 0 used. 3219072 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 125288 5196 3840 S 0.0 0.1 0:05.19 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.03 kthreadd 3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp 6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H-kb 7 root 20 0 0 0 0 I 0.0 0.0 0:00.06 kworker/u256:0- 8 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq 9 root 20 0 0 0 0 S 0.0 0.0 0:00.57 ksoftirqd/0 10 root 20 0 0 0 0 I 0.0 0.0 0:03.19 rcu_sched 11 root rt 0 0 0 0 S 0.0 0.0 0:00.02 migration/0 13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0 14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/1 15 root rt 0 0 0 0 S 0.0 0.0 0:01.72 migration/1 16 root 20 0 0 0 0 S 0.0 0.0 0:00.31 ksoftirqd/1 18 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/1:0H-kb 19 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs 20 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 netns 21 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kauditd 23 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khungtaskd 24 root 20 0 0 0 0 S 0.0 0.0 0:00.00 oom_reaper 25 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 writeback 26 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kcompactd0 27 root 25 5 0 0 0 S 0.0 0.0 0:00.00 ksmd 28 root 39 19 0 0 0 S 0.0 0.0 0:00.04 khugepaged 78 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kintegrityd > 1:监控每个逻辑CPU的状况 > > b:top进程加亮(开关) > > y:打开或者关闭运行态进程的加亮效果 > > f:编辑显示视图字段 > > > ## 说明 第一行:top - 09:16:54 up 1:07, 1 user, load average: 0.03, 0.13, 0.12 系统信息:当前时间、系统运行时间(时:分)、登陆的用户数、负载(1分钟、5分钟、15分钟) load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。

第二行:Tasks: 174 total, 1 running, 107 sleeping, 0 stopped, 0 zombie

进程信息:进程总数,正在运行的进程数,睡眠进程数,停止的进程数,监视进程数

第三行:%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

CPU信息:

us 用户空间占用CPU百分比3.7 sy 内核空间占用CPU百分比
ni 用户进程空间内改变过优先级的进程占用CPU百分比
id 空闲CPU百分比
wa 等待输入输出的CPU时间百分比
hi 硬中断(Hardware IRQ)占用CPU的百分比
si 软中断(Software Interrupts)占用CPU的百分比
st st的全称是Steal Time,就是Xen Hypervisor分配给运行在其它虚拟机上的任务的实际CPU时间。

第四行:KiB Mem : 4004944 total, 2525452 free, 480696 used, 998796 buff/cache

第五航:KiB Swap: 0 total, 0 free, 0 used. 3219072 avail Mem

内存信息:

物理内存(Mem) total 物理总内存
free 物理空闲内存
used 使用的物理内存
buff/cache 内核缓存的内存量
虚拟内存(Swap) total 交换空间总量
free 交换空间空间量
used 交换空间使用量
avail Mem 代表可用于进程下一次分配的物理内存数量
cached Mem(Ubuntu) 缓冲的交换总量

进程信息

列名 含义
PID 进程id
PPID 父进程id
USER 进程用户
PR 优先级
NI nice值。负值表示高优先级,正值表示低优先级
VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR 共享内存大小,单位kb
S 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU 上次更新到现在的CPU时间占用百分比
%MEM 进程使用的物理内存百分比
TIME+ 进程使用的CPU时间总计,单位1/100秒
COMMAND 命令名/命令行

uptime

slabtop

w

物理CPU个数,核数,逻辑CPU个数

  1. # 总核数 = 物理CPU个数 X 每颗物理CPU的核数
  2. # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数
  3. # 查看物理CPU个数
  4. cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
  5. # 查看每个物理CPU中core的个数(即核数)
  6. cat /proc/cpuinfo| grep "cpu cores"| uniq
  7. # 查看逻辑CPU的个数
  8. cat /proc/cpuinfo| grep "processor"| wc -l

负载

但是我那台服务器,是双核CPU,等于是有4个内核,每个内核的负载为1的话,总负载为4。这就是说,如果我那台服务器的CPU负载长期保持在4左右,还可以接受。 但是每个内核的负载为1,并不能算是一种理想状态!这意味着我们的CPU一直很忙,不得清闲。网上有说理想的状态是每个内核的负载为0.7左右,我比较赞同,0.7乘以内核数,得出服务器理想的CPU负载,比如我这台服务器,负载在3.0以下就可以。