CPU load过高导致

Posted by Clear Blog on June 12, 2017

昨天有同事反应自己存在Redis中的数据失效了(正常情况下是不应该失效的)。 于是去定位下问题,发现redis占用cpu略高,这在测服有点反常,同时发现有另外一个进程占用的cpu达到了120%多,于是先从这个进程开始查。 这是一个java进程,再去看其线程情况,

1
top -Hp $pid

其中有个线程i(如:17495)占用CPU有90+,打算看下堆栈信息。 直接输出java进程的堆栈信息,

1
jstack $pid > $pid.jstack。

将我们查询的线程id转为16进制,可直接在命令行输出

1
printf %0x $pid

输出了4457。 接下来就是查看堆栈信息

1
less $pid.jstack

直接定位到线程的堆栈信息/4457。 从堆栈信息中看到这个线程是业务心跳线程,一直在获取redis中某个zset集合。 再去查业务代码,发现这个Thread中一直在while,于是添加判断逻辑, 当zset为空的时候,Thread.sleep(500)。重新部署项目,发现CPU占用下来了,redis的CPU也随之有所下降,该问题也就如此解决了。