Java web应用性能分析之【CPU飙高分析之MySQL】-CSDN博客
Java web应用性能分析之【Linux服务器性能监控分析概叙】-CSDN博客
Java web应用性能分析之【sysbench基准测试】-CSDN博客
Java web应用性能分析之【CPU飙升分析概述】-CSDN博客
CPU飙高的指标
一般情况下,我们服务器的都比较空闲,因为cpu一般不是性能瓶颈。偶尔有进程的%cpu>100%,也是正常情况。毕竟是在多核cpu服务器上,进程里面起了多线程,%cpu>100%很正常。说明进程对CPU多核利用很充分。
我们一般说cpu飙高,并不只是%CPU这一个参考值。上面“性能分析概叙”中有讲我们关注的点是下面这些,而且这些指标都是相互关联的,并不是某一项很高就说明有问题:
cup利用率[us <70%,sy<35%,id>=95% ]
cs每秒上下文切换次数,越小越好[cs<100];
cs和cpu利用率相关,如果能保持上面所说的利用率大量的切换可以接受
%iowait <= 100/cpu核心 %,等待 io 的 cpu 时间占比,这个值将在磁盘监控中再讲。
load avg运行队列/平均负载 [ load avg/cpu核心数 < 5] (平均负载高有可能是cpu密集型任务)
思考一个问题:%CPU低,Load avg>5,会出现这种情况吗,要命吗,是否要关注?
直接说结果,需要关注、这种情况也要命。在文件服务器、数据库服务器上可能出现这种情况:CPU低、Load高的问题,即系统的负载很高,但实际上CPU的使用率却很低。这可能是因为等待磁盘I/O完成的进程过多,导致进程队列长度过大,而实际上CPU运行的进程很少。
如果不加以关注和处理,最终会导致整个应用卡顿。下面将介绍几种可能出现这种情况的场景,并给出相应的处理办法:
场景一:磁盘读写请求过多导致的问题
当系统中磁盘读写请求过多时,CPU可能会被空闲等待磁盘I/O完成的进程所占用,从而导致CPU低、Load高的情况。这种情况下,我们可以通过查看CPU等待IO时间的命令(如top命令中的%wa),来判断磁盘读写请求是否过多。
解决方法:
针对这种情况,我们可以优化磁盘访问的方式,如合并磁盘访问请求、使用更高性能的磁盘设备等。另外,我们也可以优化程序的磁盘访问方式,减少磁盘读写的频率,从而降低磁盘I/O的压力。
场景二:MySQL中存在没有索引的语句或存在死锁等情况
在MySQL数据库中,如果执行的SQL语句没有合适的索引,或者存在死锁等情况,可能会导致大量的磁盘I/O等待,从而造成CPU低、Load高的问题。
解决方法:
针对这种情况,我们可以通过检查MySQL数据库的慢查询日志或者执行SHOW FULL PROCESSLIST命令来查看是否存在没有索引的语句或者死锁情况。然后,我们可以对这些语句进行优化,添加合适的索引或解决死锁问题,从而减少对磁盘的访问。
场景三:外接硬盘故障
如果我们的系统挂载了外接硬盘(如NFS共享存储),如果外接硬盘发生故障,可能会导致大量的读写请求无法完成,进而导致CPU低、Load高的情况。
解决方法:
针对这种情况,我们需要检查外接硬盘的连接和状态,确保其正常工作。如果外接硬盘故障,我们需要及时修复或更换硬盘。
综上所述,CPU低、Load高的问题通常是由于等待磁盘I/O完成的进程过多所导致的。我们可以通过分析CPU等待IO时间、查看磁盘IO情况、检查MySQL数据库的慢查询日志等方法来定位问题,并采取相应的优化措施来解决问题。
问题定位
同样是通过top -Hp定位mysql中的线程,然后定位sql,最后结合业务,进行综合分析。