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.采样的次数,如:
$ vmstat 2 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 2530764 2104 995028 0 0 227 66 628 1309 2 3 95 0 0
0 0 0 2529872 2104 995100 0 0 0 0 1568 3396 3 3 94 0 0
0 0 0 2530060 2104 995132 0 0 0 0 1373 2916 2 3 95 0 0
每隔2秒采集一次,共采集3次
需要一直进行采集只需通过一个采集时间间隔数(秒),通过^C
结束,如下:
$ vmstat 2
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 2530232 2104 995228 0 0 205 59 628 1311 2 3 95 0 0
0 0 0 2529884 2104 995236 0 0 0 0 1278 2692 2 2 96 0 0
0 0 0 2529600 2104 995236 0 0 0 0 1197 2679 2 2 97 0 0
^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等待比较严重,这可能是由于磁盘大量随机访问造成的,也有可能是磁盘的带宽出现瓶颈。 |
怎么看
- 如果r经常大于4,且id经常少于40,表示cpu的负荷很重。
- 如果bi,bo长期不等于0,表示内存不足。
- 如果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个数
# 总核数 = 物理CPU个数 X 每颗物理CPU的核数
# 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数
# 查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
# 查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq
# 查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l