一次CPU占用过高问题排查记录

  首先,我周五把服务部署到服务器后,查看各项指标都基本正常,就觉得应该没什么了,但是到了第二天下午,我查看服务器的CPU使用率非常高(非正常情况)。因为当时服务器部署的服务也比较多,所以一时也不知道到底是什么原因导致的,下面说说我的排查思路:

  1. 在服务器使用命令top查看各项服务的情况,发现我的服务占用了90%的CPU而且一直降不下去。
  2. 第一步基本确认了是我的服务问题,接下来就是考虑查找服务出现这个问题的原因了。
  3. 这个时候因为没有人用(只是测试),所以我果断选择了先重启(因为重启可以解决90%的问题)。
  4. 重启过后CPU那些就正常了,然后我过来一个小时后,查看也是基本正常,因为是周末所以就暂时没有管了,打算第二天再去看看。
  5. 第二天去公司的时候发现,CPU又占用了60%,而且一直那么高,下面有图,下降的地方就是我重启的地方。
  6. 通过监控图发现重启了9个小时后CPU在一直不断增加。
  7. 我脑海中浮现CPU过高的情况是:频繁的full GC、死循环、死锁等。
  8. 但是我的代码里面就没有多线程,基本排除死锁。
  9. 然后死循环这个,我用https://blog.csdn.net/bolg_hero/article/details/53126744的方式检测,也没有发现。
  10. 然后我把怀疑重点放到 full GC上了。那么问题就是什么情况会发生full GC呢?
  11. 我也查看了些文章比如:https://blog.csdn.net/chenleixing/article/details/46706039
  12. 但是我通过分析CPU使用率的走势图,感觉应该是我那里的代码是时间越久full GC越频繁,内存越不足,肯定是那里频繁的应用了大对象,比如大集合,大文件等。
  13. 于是我过滤我的代码,发现有个地方是不断将高频的位置信息放入Redis。放入的方式是先将Redis里面的全部取出来,然后放入后再存入。
  14. 这个地方才是致命的,因为随着时间的推移,Redis肯定越来越大,开始的时候小对象,所以没有问题,随着时间的推移变为大对象了,就会高频率的触发full GC,导致CPU负载过高。
  15. 最终结局办法,换种方式,使用Redis的list数据结构来存储。后来启动一天时间都是正常的。

猜你喜欢

转载自www.cnblogs.com/staunchwp/p/9140206.html