服务器CPU使用率过高排查与解决思路
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了服务器CPU使用率过高排查与解决思路相关的知识,希望对你有一定的参考价值。
发现服务器的cpu使用率特别高
排查思路:
-使用top或者mpstat查看cpu的使用情况
mpstat -P ALL 2 1
Linux 2.6.32-358.el6.x86_64 (linux—host) 01/05/2016 _x8664 (24 CPU)
04:41:13 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
04:41:15 PM all 0.56 0.00 0.25 0.00 0.00 0.04 0.00 0.00 99.14
04:41:15 PM 0 3.08 0.00 1.03 0.00 0.00 0.51 0.00 0.00 95.38
04:41:15 PM 1 1.50 0.00 0.50 0.00 0.00 0.00 0.00 0.00 98.00
04:41:15 PM 2 0.50 0.00 0.50 0.00 0.00 0.00 0.00 0.00 99.00
04:41:15 PM 3 1.00 0.00 0.50 0.00 0.00 0.00 0.00 0.00 98.51
04:41:15 PM 4 0.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.50
04:41:15 PM 5 0.50 0.00 0.50 0.00 0.00 0.00 0.00 0.00 99.00
04:41:15 PM 6 0.50 0.00 0.50 0.00 0.00 0.00 0.00 0.00 99.00
04:41:15 PM 7 0.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.50
04:41:15 PM 8 0.50 0.00 0.50 0.00 0.00 0.00 0.00 0.00 99.00
04:41:15 PM 9 0.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.50
04:41:15 PM 10 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
04:41:15 PM 11 0.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.50
04:41:15 PM 12 1.50 0.00 0.50 0.00 0.00 0.00 0.00 0.00 98.00
04:41:15 PM 13 1.50 0.00 0.50 0.00 0.00 0.00 0.00 0.00 98.00
04:41:15 PM 14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
04:41:15 PM 15 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
04:41:15 PM 16 0.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.50
04:41:15 PM 17 0.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.50
04:41:15 PM 18 0.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.50
04:41:15 PM 19 0.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.50
04:41:15 PM 20 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
04:41:15 PM 21 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
04:41:15 PM 22 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
04:41:15 PM 23 0.00 0.00 0.50 0.00 0.00 0.00 0.00 0.00 99.50
-top找出占用高的进程ID
-查看进程占用线程数量,如java:
ps -eLf|grep java|wc -l
1065
解决CPU使用不均或者使用过高的问题
taskset
taskset是LINUX提供的一个命令(ubuntu系统可能需要自行安装,schedutils package)。他可以让某个程序运行在某个(或)某些CPU上。
1)显示进程运行的CPU
taskset -p 3495
pid 3495‘s current affinity mask: ffffffff
注:显示结果的ffffffff实际上是二进制32个低位均为1的bitmask,每个1对应于1个CPU,表示该进程在32个CPU上运行
2)指定进程运行在某个特定的CPU上
taskset -pc 3 3495
显示结果:
pid 3495‘s current affinity list: 0-31
pid 3495‘s new affinity list: 3
注:3表示CPU将只会运行在第4个CPU上(从0开始计数)
3)进程启动时指定CPU
taskset -c 1 ./redis-server ../redis.conf
系统CPU负载过高、CPU使用率不高的问题
(1)、问题
线上Tomcat服务器CPU的负载非常高,但是CPU使用率正常,如图:
图片.png
(2)、问题排查
1、首先查看是哪些进程的CPU占用率最高(如下可以看到详细的路径)
ps -aux --sort -pcpu | more
# 定位有问题的线程可以用如下命令
ps -mp pid -o THREAD,tid,time | more
2、查看JAVA进程的每个线程的CPU占用率
ps -Lp 5798 cu | more # 5798是查出来进程PID
3、追踪线程,查看负载过高的原因,使用JDK下的一个工具
jstack 5798 # 5798是PID
jstack -J-d64 -m 5798 # -j-d64指定64为系统
jstack 查出来的线程ID是16进制,可以把输出追加到文件,导出用记事本打开,
再根据系统中的线程ID去搜索查看该ID的线程运行内容,可以和开发一起排查。
(3)、常见的处理办法
网站相关进程导致负载高处理办法:
1、直接把网站php或http或tomcat等网站服务重启,很多时候负载就降下来了
2、也可能是网站代码漏洞导致的,需要反馈开发一起查找原因和处理
3、把重复的tomcat kill全部掉重新启动
mysql进程导致的负载高处理办法:
1、常见的就是mysql慢查询导致,可以在mysql慢查询日志找到相关sql语句,这需要对sql进行优化
2、还可以进入mysql,用show full processlistG;查看那个mysql进程执行时间比较久的慢查询。如果是内部后台使用的语句,可以先kill掉,优化后再执行。
3、mysql读写太频繁,如果是读写频繁可以在%wa等待输入输出看的出来占用cpu百分比很大。也可以通过命令iostat查看系统读写情况。
还有可能是网络原因,系统硬件原因等
以上是关于服务器CPU使用率过高排查与解决思路的主要内容,如果未能解决你的问题,请参考以下文章