vmstat命令: 用来获得有关进程、虚存、页面交换空间及 CPU活动的信息。这些信息反映了系统的负载情况
root@pms-mysql ~]# vmstat 1 10
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st1 0 0 762072 280348 4051748 0 0 0 3 0 2 0 0 100 0 0
0 0 0 763776 280348 4051748 0 0 0 40 371 154 0 1 98 1 0
0 0 0 763776 280348 4051748 0 0 0 0 40 29 0 0 100 0 0
0 0 0 763744 280348 4051748 0 0 0 0 37 35 0 0 100 0 0
0 0 0 763744 280348 4051748 0 0 0 0 39 32 0 0 100 0 0
0 0 0 763744 280348 4051748 0 0 0 0 36 36 0 0 100 0 0
0 0 0 763744 280348 4051748 0 0 0 12 104 76 0 0 96 4 0
类别 | 项目 | 含义 | 说明 |
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 | 每秒读取的块数(读磁盘) | 现在的Linux版本块的大小为1024bytes |
bo | 每秒写入的块数(写磁盘) |
| |
system | in | 每秒中断数,包括时钟中断 | 这两个值越大,会看到由内核消耗的cpu时间会越多 |
cs | 每秒上下文切换数 | ||
CPU(以百分比表示) | Us | 用户进程执行消耗cpu时间(user time) | us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期超过50%的使用,那么我们就该考虑优化程序算法或其他措施了 |
Sy | 系统进程消耗cpu时间(system time) | sys的值过高时,说明系统内核消耗的cpu资源多,这个不是良性的表现,我们应该检查原因。 | |
Id | 空闲时间(包括IO等待时间) |
| |
wa | 等待IO时间 | Wa过高时,说明io等待比较严重,这可能是由于磁盘大量随机访问造成的,也有可能是磁盘的带宽出现瓶颈。 |
内存监控:
需要关心的指标包括:swpd、free、buff、cache、si和so,尤其需要重视的是free、si和so。很多人都会认为系统的空闲内存(free)少就代表系统性能有问题,其实并不是这样的,这还要结合si和so(内存和磁盘的页面交换)两个指标进行分析。正常来说,当物理内存能满足系统需要的话(也就是说物理内存能足以存放所有进程的数据),那么物理内存和磁盘(虚拟内存)是不应该存在频繁的页面交换操作的,只有当物理内存不能满足需要时系统才会把内存中的数据交换到磁盘中。而由于磁盘的性能是比内存慢很多的,所以如果存在大量的页面交换,那么系统的性能必然会受到很大影响。
CPU的性能监控:
主要关注3个指标:运行队列、CPU使用率和上下文切换,理解这3个指标的概念和原理对于发现和处理CPU性能问题有很大的帮助。
1. 运行队列每个CPU都会维护一个运行队列,调度器会不断地轮询让队列中的进程运行,直到进程运行完毕将其由队列中删除。如果CPU过载,就会出现调度器跟不上系统要求,导致运行队列中等待运行的进程越来越多。正常来说,每个CPU的运行队列不要超过3,如果是双核CPU 就不要超过6
2. CPU使用率
CPU使用率一般可以分为一下几个部分。
a. 用户进程:运行用户进程所占用的CPU时间的百分比。
b. 系统进程:运行系统进程和中断所占用的CPU的时间百分比。
c. 等待IO:因为IO等待而使CPU处于idle状态的时间百分比。
d. 空闲:CPU处于空闲状态的时间百分比
如果CPU的空闲率长期低于10%,那么表示CPU的资源已经非常紧张,应该考虑进程优化或添加更多地CPU。“等待IO”表示CPU因等待IO 资源而被迫处于空闲状态,这时候的CPU并没有处于运算状态,而是被白白浪费了,所以“等待IO应该越小越好。
3. 上下文切换
通过CPU时间轮询的方法,Linux能够支持多任务同时运行。对于普通的CPU,内核会调度和执行这些进程,每个进程都会被分配CPU时 间片并运行。当一个进程用完时间片或者被更高优先级的进程抢占时间块后,它会被转到CPU的等待运行队列中,同时让其他进程在CPU上运行。这个进程切换的过程被称为上下文切换。过多的上下文切换会造成系统的很大的开销。
系统监控的实验:
实例一,大量的算术运算
本程序会进入一个死循环,不断的进行求平方根的操作,模拟大量的算术运算的环境.
测试源程序如下:
void
run_status(void)
{
double pi = M_PI;
double pisqrt;
long i;
while(1){
pisqrt = sqrt(pi);
}
}
int
main (void)
{
run_status();
exit(EXIT_SUCCESS);
}
gcc run.c -o run -lm
./run&
运行:
root@test:~# vmstat 1procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 0 772300 42420 175356 0 31 5 138 22 14 0 0 99 0
1 0 0 772292 42420 175356 0 0 0 0 45 22 5 0 95 0
1 0 0 772284 42420 175356 0 0 0 0 276 15 100 0 0 0
1 0 0 772284 42420 175356 0 0 0 0 298 12 100 0 0 0
1 0 0 772284 42420 175356 0 0 0 0 273 11 100 0 0 0
1 0 0 772284 42420 175356 0 0 0 0 278 16 100 0 0 0
1 0 0 772284 42420 175356 0 0 0 0 276 14 100 0 0 0
1 0 0 772284 42420 175356 0 0 0 0 275 16 100 0 0 0
1 0 0 772284 42420 175356 0 0 0 0 284 14 99 1 0 0
1 0 0 772284 42420 175356 0 0 0 0 285 14 100 0 0 0
1 0 0 772284 42420 175356 0 0 0 0 281 13 100 0 0 0
1 0 0 772284 42420 175356 0 0 0 0 270 18 100 0 0 0
0 0 0 772292 42420 175356 0 0 0 0 51 28 4 0 96 0
0 0 0 772292 42420 175356 0 0 0 0 25 11 0 0 100 0
由于不断地在做算术运算,从上面可以看出:
1. r表示在运行队列中等待的进程数,上面的数据表示r=1,一直有进程在等待,
2. in表示每秒的中断数,包括时钟中断,运行队列中有等待的进程(看参数r的值),中断数in就上来了
3. us表示用户进程使用的cpu时间,随着r=1,用户的cpu占用时间直接达到了100%
4. id表示cpu的空闲时间,一开始的时候id很高,达到95%,后来程序开始跑,cpu一直处于繁忙状态(看参数r,us的值),id就一直为0,等程序终止,id就是上去了
实例二,大量的系统调用
本脚本会进入一个死循环,不断的执行cd命令,从而模拟大量系统调用的环境
测试脚本如下:
#!/bin/bash
while (true)
do
cd ;
done
chmod +x loop.sh
./loop.sh
root@test~# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 0 772300 42500 175364 0 30 5 136 22 14 0 0 99 0
0 0 0 772300 42500 175364 0 0 0 0 27 14 0 0 100 0
1 0 0 772220 42500 175364 0 0 0 0 213 2482 6 70 24 0
1 0 0 772204 42500 175364 0 0 0 0 283 3298 8 92 0 0
1 0 0 772204 42500 175364 0 0 0 0 281 3343 5 95 0 0
1 0 0 772204 42500 175364 0 0 0 0 283 3381 5 95 0 0
1 0 0 772204 42500 175364 0 0 0 0 271 3362 8 92 0 0
1 0 0 772204 42508 175356 0 0 0 12 267 3359 8 92 0 0
0 0 0 772276 42508 175364 0 0 0 0 253 2883 8 76 16 0
0 0 0 772276 42508 175364 0 0 0 0 29 12 0 0 100 0
0 0 0 772276 42508 175364 0 0 0 0 39 18 0 0 100 0
随着程序不断调用cd命令,运行队列有等待的进程r(看参数r),每秒的中断数in(看参数in),下文切换的次数cs骤然提高(看参数cs),系统占用的cpu时间sy(看参数sy)也不断提高,cpu空闲时间id(看参数id)一直为0。当程序终止的时候,r,in,cs,sy数据都下来了,id上去了,表示系统已经空闲下来了。
实例三,大量的io操作
我们用dd命令,从/dev/zero读数据,写入到/tmp/data文件中,如下:
dd if=/dev/zero of=/tmp/data bs=1M count=1000
运行:
root@debian6:~# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 0 772176 42564 175352 0 30 5 134 23 14 0 0 99 0
0 0 0 772176 42564 175352 0 0 0 0 35 15 0 1 99 0
1 0 0 687220 42564 257976 0 0 4 0 181 23 0 55 45 0
1 0 0 545356 42564 397552 0 0 12 142664 667 246 0 100 0 0
1 0 0 400276 42564 540208 0 0 0 147424 576 228 0 100 0 0
1 0 0 254948 42564 683216 0 0 0 173268 625 242 0 100 0 0
1 0 0 110364 42564 825140 0 0 0 136864 477 71 0 100 0 0
2 0 0 15400 11384 950396 0 0 0 140976 531 585 0 100 0 0
0 0 0 15028 11388 952236 0 0 12 199253 638 611 0 76 21 3
root@debian6:~# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 0 911284 11392 69752 0 30 5 143 23 14 0 0 99 0
0 0 0 911284 11392 69752 0 0 0 0 33 15 1 0 99 0
1 0 0 827704 11396 152232 0 0 60 0 98 27 0 24 74 2
1 0 0 304424 11396 667096 0 0 0 520604 1336 710 0 100 0 0
0 0 0 17564 11380 952288 0 0 8 417144 1166 874 0 97 3 0
0 0 0 17572 11380 952288 0 0 0 0 34 10 0 0 100 0
0 0 0 17572 11380 952288 0 0 0 0 38 19 0 0 100 0
root@debian6:~# dd if=/dev/zero of=/mnt/date1 bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 6.31404 s, 166 MB/s
root@debian6:~# dd if=/dev/zero of=/mnt/data1 bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 2.19338 s, 478 MB/s
1. bo写数据到磁盘的速率,bi是从磁盘读的速度
2. dd不断的向磁盘写入数据,所以bo的值会骤然提高,而cpu的wait数值也变高,说明由于大量的IO操作,系统的瓶径出现IO设备上
3. 由于对文件系统的写入操作,cache也从175352KB提高到了952236KB,又由于大量的写中断调用,in的值也从35提高到638,上下文切换cs的值从23到了611
我们用dd命令,从/dev/zero读数据,写入到/tmp/data文件中,如下:
dd if=/dev/zero of=/tmp/data bs=1M count=1000
运行:
root@debian6:~# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 0 772176 42564 175352 0 30 5 134 23 14 0 0 99 0
0 0 0 772176 42564 175352 0 0 0 0 35 15 0 1 99 0
1 0 0 687220 42564 257976 0 0 4 0 181 23 0 55 45 0
1 0 0 545356 42564 397552 0 0 12 142664 667 246 0 100 0 0
1 0 0 400276 42564 540208 0 0 0 147424 576 228 0 100 0 0
1 0 0 254948 42564 683216 0 0 0 173268 625 242 0 100 0 0
1 0 0 110364 42564 825140 0 0 0 136864 477 71 0 100 0 0
2 0 0 15400 11384 950396 0 0 0 140976 531 585 0 100 0 0
0 0 0 15028 11388 952236 0 0 12 199253 638 611 0 76 21 3
root@debian6:~# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 0 911284 11392 69752 0 30 5 143 23 14 0 0 99 0
0 0 0 911284 11392 69752 0 0 0 0 33 15 1 0 99 0
1 0 0 827704 11396 152232 0 0 60 0 98 27 0 24 74 2
1 0 0 304424 11396 667096 0 0 0 520604 1336 710 0 100 0 0
0 0 0 17564 11380 952288 0 0 8 417144 1166 874 0 97 3 0
0 0 0 17572 11380 952288 0 0 0 0 34 10 0 0 100 0
0 0 0 17572 11380 952288 0 0 0 0 38 19 0 0 100 0
root@debian6:~# dd if=/dev/zero of=/mnt/date1 bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 6.31404 s, 166 MB/s
root@debian6:~# dd if=/dev/zero of=/mnt/data1 bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 2.19338 s, 478 MB/s
1. bo写数据到磁盘的速率,bi是从磁盘读的速度
2. dd不断的向磁盘写入数据,所以bo的值会骤然提高,而cpu的wait数值也变高,说明由于大量的IO操作,系统的瓶径出现IO设备上
3. 由于对文件系统的写入操作,cache也从175352KB提高到了952236KB,又由于大量的写中断调用,in的值也从35提高到638,上下文切换cs的值从23到了611