CPU占用过高排查


CPU占用过高排查

一.简介

最近一段时间 某台服务器上的一个应用总是隔一段时间就自己挂掉 用top看了看 从重新部署应用开始没有多长时间CPU占用上升得很快

排查步骤

1.使用top 定位到占用CPU高的进程PID
top

2.通过ps aux | grep PID命令
获取线程信息,并找到占用CPU高的线程
ps -mp pid -o THREAD,tid,time | sort -rn

3.将需要的线程ID转换为16进制格式
printf "%x\n" tid

4.打印线程的堆栈信息 到了这一步具体看堆栈的日志来定位问题了
jstack pid |grep tid -A 30

二.例子

1.top 可以看出PID 733进程 的占用CPU 172%
null

2.查找进程733下的线程 可以看到TID 线程775占用了96%且持有了很长时间 其实到这一步基本上能猜测到应该是 肯定是那段代码发生了死循环
ps -mp 733 -o THREAD,tid,time | sort -rn
null

3.线程ID转换为16进制格式
printf "%x\n" 775
null

4.查看java 的堆栈信息
jstack 733 |grep 307 -A 30
null

null

显然是 SmsQueueServiceImpl 中的produceMissSms 和 consumeMissSms 方法有问题
一下为精简的部分代码

/** * Created by dongxc on 2015/7/7. 通知消息队列 */@Service("smsQueueService")public class SmsQueueServiceImpl {    // 生产异常队列方法    public void produceMissSms(SmsLogDo smsLogDo) {        /*         * try{ String key = EnumRedisPrefix.SMS_QUEUE_MISS_DEAL.getValue(); boolean result = redisService.lpush(key,         * smsLogDo, 0); if(result==false){ logger.error("通知消息异常队列生产消息返回失败!"+smsLogDo.getId()); } }catch(Exception e){         * logger.error("通知消息异常队列生产消息失败!", e); }         */    }    // 消费异常队列方法    public SmsLogDo consumeMissSms() {        try {            String destKey = EnumRedisPrefix.SMS_QUEUE_MISS_DEAL.getValue();            SmsLogDo smsLogDo = new SmsLogDo();            Object obj = null;            if (obj == null) {                return null;            } else {                smsLogDo = (SmsLogDo) obj;            }            return smsLogDo;        } catch (Exception e) {            logger.error("通知消息队列消费方法失败!", e);            return null;        }    }}

在应用一启动的时候 spring初始化的就会执行这一段处理丢失消息的代码 然后这段死循环代码 没有任何作用

解决方法 即 注释掉whlie(true)这一段代码

重新部署后 cpu占用就很正常了
null



 上一篇
了解 Sync.Pool 了解 Sync.Pool
Go: 了解 Sync.Pool 在项目中的“垃圾回收”中经常会遇到这么一个问题。大量对象被重复分配,导致GC的工作量很大。使用sync.Pool,可以减少分配和GC工作量。 什么是 sync.Pool? Go 1.3 版本的亮点之一是
2020-12-09
下一篇 
Mysql解决主从慢同步问题 Mysql解决主从慢同步问题
一.简介一般主从复制,有三个线程参与,都是单线程:Binlog Dump(主) —–>IO Thread (从) —–> SQL Thread(从)。复制出现延迟一般出在两个地方 1)SQL线程忙不过来(可能需要应用数据量较大,
2020-11-27
  目录