CPU使用率分为
- 用户态CPU使用率:执行应用程序代码的时间占总CPU时间的百分比
- 系统态CPU使用率:应用执行操作系统调用的时间占总CPU时间的百分比
系统态CPU使用率高意味着共享资源有竞争或者IO设备之间有大量的交互。
目标:理想情况应用达到最高性能和扩展性时,它的系统态CPU使用率为0%,提供应用性能和扩展性一个目标是尽可能降低系统态CPU使用率
对于计算密集型应用
- 监控用户态和系统态CPU使用率
- 监控每时钟指令书IPC或每指令时钟周期CPI(对于计算密集型重要,系统自带工具无法监控)
停滞:CPU等待内存中的数据,操作系统工具仍然报告CPU繁忙,当指令所用的操作数据不在寄存器或者缓存中的就会发生。
目标:减少停滞或者改善CPU高速缓存使用率,从而减少CPU在等待内存数据时浪费的时钟周期
观察CPU使用率工具
vmstat:只能查看整体CPU使用情况
- us: 用户进程执行时间百分比。 us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速
- sy: 内核系统进程执行时间百分比。 sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因
- wa: IO等待时间百分比。 wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈
- id: 空闲时间百分比
mpstat:处理相关统计信息
mpstat [ -P { cpu | ALL } ] [ -V ] [ interval [ count ] ]
查看所有CPU统计信息,每2秒一次
- CPU:CPU 编号
- %user:在监控的时间间隔内,用户级进程(运用程序)占用的CPU时间百分比。
- %nice:在监控的时间间隔内,nice值为负的用户级进程所占用的CPU时间百分比。
- %sys:在监控的时间间隔内,系统及进程(内核)占用的CPU使用率。该时间包括了系统处理软、硬中断所花的时间。
- %iowait:在监控的时间间隔内,等待硬盘I/O的时间,CPU的闲置时间百分比。
- %irq:在监控的时间间隔内,CPU服务硬中断的所占的时间百分比。
- %soft:在监控的时间间隔内,CPU服务软中断的所占的时间百分比。
- %idle:在监控的时间间隔内,CPU闲置时间所占用的时间百分比,不包括等待磁盘IO请求的时间。
CPU调度程序运行队列
作用:监控CPU调度程序运行队列用于分辨系统是否满负荷。
运行队列:那些已经准备好运行,正等待可用CPU的轻量级进程。
如果准备运行的轻量级进程数超过系统所能处理的上限,运行队列就会很长。当系统运行队列等于虚机处理器个数的时候,用户不会明显感觉到性能下降。(虚拟处理器就是系统硬件线程个数.Runtime.availableProcessors()返回值)。运行队列长度达到虚拟处理4倍或是更多时,系统响应非常迟缓。
指导原则:如果在很长时间,运行队列的长度一直超过虚拟处理器个数1倍,需要关注,如果很长一段时间,运行队列长度达到虚拟处理器个数的3-4倍或更高,需要立即引起注意或采取行动。
解决方式
- 增加CPU,分担负载或减少处理器负载,从根本上解决。
- 分析系统中运行的应用,改进CPU使用率。解决算法和数据结构效率
线上vmstat 1观察CPU队列情况
procs
- r:在运行队列中等待的进程数
- b:在等待IO的进程数
mpstat查看CPU个数以及CPU使用情况,系统负载略高
CPU相关监控以及介绍告一段落。
参考:
http://linuxcommand.org/man_pages/vmstat8.html