CPU 负载观察和性能监测

CPU负载和利用率

CPU 的负载和利用率是两个不同的概念,但是他们都可以在top命令中查看。CPU利用率显示的是程序在运行期间实时占用的CPU百分比,而CPU负载显示的是一段时间内正在使用和等待使用CPU的平均任务数。CPU利用率高,并不意味着CPU的负载大。两者之间没有必然的关系。


常用命令介绍:

* uptime


首先我们需要明白load average后面的三个数字代表什么,他们分别代表前一分钟,五分钟,十五分钟的CPU负载,一般来说较重要的指标是最后一个,因为我们需要尽量避免一些突发的情况。那么这些数字处于什么区间是正常的呢?首先我们需要知道,这些数字是和你的服务器的CPU核数是紧密相关的,如果你只有一个核的话,那么数字为1.0就表示刚好在CPU的承受范围之内。这些数字当然是越小越好,但是理论上0.0~1.0之间都是正常范围。根据经验来说,如果一直在0.7上下,那么说明你可能需要花些时间来调查;如果长期徘徊或者超过1.0,那么你就需要进行修复啦!

对应的,提供查看linux下查看逻辑CPU的命令:



* top

top命令不仅可以查看当前系统的平均负载,还可以查看不同进程对于CPU、内存等资源的使用情况。

CPU 负载观察和性能监测_第1张图片

默认情况下,top命令是以CPU使用率由高到低排序显示进程信息的,在 top 信息界面按 K 键,并输入想要终止的PID,就可以直接杀死指定进程。
top的 -b 选项开启批处理模式,将每次刷新全部打印到stdout
top的 -n 选项指定退出top命令前刷新多少次信息。
top命令的输出:
  第1行:与uptime相同;
  第3行:当前的CPU运行情况:
us:非nice用户进程占用CPU的比率
sy:内核、内核进程占用CPU的比率;
ni:如果一些用户进程修改过优先级,这里显示这些进程占用CPU时间的比率;
id:CPU空闲比率,如果系统缓慢而这个值很高,说明系统慢的原因不是CPU负载高;
wa:CPU等待执行I/O操作的时间比率,该指标可以用来排查磁盘I/O的问题,通常结合wa和id判断
hi:CPU处理硬件终端所占时间的比率;
si:CPU处理软件终端所占时间的比率;
st:流逝的时间,虚拟机中的其他任务所占CPU时间的比率;


用户进程占比高,wa低,说明系统缓慢的原因在于进程占用大量CPU,通常还会伴有较低的id,说明CPU空转时间很少。
wa低,id高,可以排除CPU资源瓶颈的可能。  
wa高,说明I/O占用了大量的CPU时间,需要检查交换空间的使用,交换空间位于磁盘上,性能远低于内存,当内存耗尽开始使用交换空间时,将会给性能带来严重影响,所以对于性能要求较高的服务器,一般建议关闭交换空间。另一方面,如果内存充足,但wa很高,说明需要检查哪个进程占用了大量的I/O资源。


* iostat


如果iowait过长,说明是磁盘瓶颈;system过长,说明是内核瓶颈。

在Device一行,可以看到一些IO指标:

tps: 每秒I/O传输请求量;
Blk_read/s:每秒读取多少KB;
Blk_wrtn/s:每秒写多少KB;
Blk_read:一共读了多少KB;
Blk_wrtn:一共写了多少KB

* sar

sar命令查看CPU、内存和磁盘记录。默认情况下,sar命令显示当天的统计信息,不带参数显示CPU统计信息,参数-r显示收集的内存记录,-b显示磁盘I/O


查看当天CPU使用:

CPU 负载观察和性能监测_第2张图片

查看当天内存使用:


查看当天IO统计:


另外,可以使用参数-s和-e限定查看的时间,使用参数-f查看本月内之前某一天的历史统计信息,例如:sar -s 20:00:00 ; sar -f /var/log/sysstat/sa08


*vmstat

相比top,这个可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)


vmstat后面跟两个参数,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数(可以缺省)。


r 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。

b 表示阻塞的进程。

swpd 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。

free   空闲的物理内存的大小。

buff   Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存。

cache cache直接用来记忆我们打开的文件,给文件做缓冲,用空闲的一部分物理内存做缓存,提高程序执行的性能。

si  每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。

so  每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。

bi  块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0。

bo 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。

in 每秒CPU的中断次数,包括时间中断。

cs 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。

us 用户CPU时间。

sy 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。

d  空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。

wt 等待IO CPU时间。

常用的获取Cpu负载和性能的命令大概就总结这么多把,还有一些是关于使用taskset绑定进程到指定CPU上的,我自己并没有使用过,就不在此展开了。


参考:

https://zhangge.net/3257.html

http://blog.csdn.net/longxibendi/article/details/44625703


你可能感兴趣的:(性能,linux,cpu,IO,内存)