服务热线:400 863 1256服务时间:09:00 ~ 18:00金沙手机版app会员登陆
产品推展
系统运行缓慢,CPU 100%,以及Full GC次数过多问题的排查思路
2019-03-15 金沙手机版app

过高在前面第一点中,我们讲到,CPU过高可能是系统频繁的进行FullGC,导致系统缓慢。 而我们平常也肯能遇到比较耗时的计算,导致CPU过高的情况,此时查看方式其实与上面的非常类似。

首先我们通过top命令查看当前CPU消耗过高的进程是哪个,从而得到进程id;然后通过top-Hppid来查看该进程中有哪些线程CPU过高,一般超过80%就是比较高的,80%左右是合理情况。 这样我们就能得到CPU消耗比较高的线程id。 接着通过该线程id的十六进制表示在jstack日志中查看当前线程具体的堆栈信息。

在这里我们就可以区分导致CPU过高的原因具体是FullGC次数过多还是代码中有比较耗时的计算了。

如果是FullGC次数过多,那么通过jstack得到的线程信息会是类似于VMThread之类的线程,而如果是代码中有比较耗时的计算,那么我们得到的就是一个线程的具体堆栈信息。 如下是一个代码中有比较耗时的计算,导致CPU过高的线程信息:这里可以看到,在请求UserController的时候,由于该Controller进行了一个比较耗时的调用,导致该线程的CPU一直处于100%。

我们可以根据堆栈信息,直接定位到UserController的34行,查看代码中具体是什么原因导致计算量如此之高。 3.不定期出现的接口耗时现象对于这种情况,比较典型的例子就是,我们某个接口访问经常需要2~3s才能返回。

这是比较麻烦的一种情况,因为一般来说,其消耗的CPU不多,而且占用的内存也不高,也就是说,我们通过上述两种方式进行排查是无法解决这种问题的。

而且由于这样的接口耗时比较大的问题是不定时出现的,这就导致了我们在通过jstack命令即使得到了线程访问的堆栈信息,我们也没法判断具体哪个线程是正在执行比较耗时操作的线程。 对于不定时出现的接口耗时比较严重的问题,我们的定位思路基本如下:首先找到该接口,通过压测工具不断加大访问力度,如果说该接口中有某个位置是比较耗时的,由于我们的访问的频率非常高,那么大多数的线程最终都将阻塞于该阻塞点,这样通过多个线程具有相同的堆栈日志,我们基本上就可以定位到该接口中比较耗时的代码的位置。 如下是一个代码中有比较耗时的阻塞操作通过压测工具得到的线程堆栈日志:从上面的日志可以看你出,这里有多个线程都阻塞在了UserController的第18行,说明这是一个阻塞点,也就是导致该接口比较缓慢的原因。 4.某个线程进入WAITING状态对于这种情况,这是比较罕见的一种情况,但是也是有可能出现的,而且由于其具有一定的不可复现性,因而我们在排查的时候是非常难以发现的。

笔者曾经就遇到过类似的这种情况,具体的场景是,在使用CountDownLatch时,由于需要每一个并行的任务都执行完成之后才会唤醒主线程往下执行。

而当时我们是通过CountDownLatch控制多个线程连接并导出用户的gmail邮箱数据,这其中有一个线程连接上了用户邮箱,但是连接被服务器挂起了,导致该线程一直在等待服务器的响应。

最终导致我们的主线程和其余几个线程都处于WAITING状态。

对于这样的问题,查看过jstack日志的读者应该都知道,正常情况下,线上大多数线程都是处于TIMED_WAITING状态,而我们这里出问题的线程所处的状态与其是一模一样的,这就非常容易混淆我们的判断。 解决这个问题的思路主要如下:。

上一篇:羽西(YUE-SAI)官方网站 下一篇:125涓囧洓娌冲湴閾佸彛姝h3鎴?鍗冲彲鍏ヤ綇锛屾垚閮藉ぉ搴滄柊鍖哄崕闃抽缚闃佹柊搴т簩鎵嬫埧涓夊
联系我们
  • 联系电话: +86 21 54125241 / 54125242
  • 传真:+86 21 54125241
  • 联系地址:上海市长宁区延安西路593号一号楼
  • 联系邮箱:contact@www.foro-blog.com

码上享咨询,扫一扫关注金沙手机版app官方微信,随时了解最新消息