java学习基地

微信扫一扫 分享朋友圈

已有 1516 人浏览分享

怎么排查CPU飙升

[复制链接]
1516 2
本帖最初由 进修派 于 2020-12-6 16:14 编纂



怎样排查CPU飙降

线上又供体系,原来跑的好好的,忽然有一天便会呈现报警,CPU利用律降,然后制紧以后就行了。比方,多线程操纵一个线程没有宁静的list常常便会呈现这类征象。那末怎样定位到详细的代码范畴呢?明天敝н便教各人一个小本领


代码筹办[backcolor=rgba(64, 184, 250, 0.498)]

此次,敝н筹办了一个demo代码,大抵线程模子是如许的:





代码下所示:


  1. public class CpuHighExample {
  2.     public static void cpuHigh() {
  3.         final List<String> list = new LinkedList<>();
  4.         Thread thread1 = new Thread(new Runnable() {
  5.             @Override
  6.             public void run() {
  7.                 int count = 1;
  8.                 while (true) {
  9.                     // 机关thread1为耗损很下cpu当边程
  10.                     count = count + 1;
  11.                 }
  12.             }
  13.         });
  14.         thread1.setName("thread1");
  15.         Thread thread2 = new Thread(new Runnable() {
  16.             @Override
  17.             public void run() {
  18.                 while (true) {
  19.                     try {
  20.                         // 机关thread2为耗损很低cpu当边程
  21.                         Thread.sleep(1000);
  22.                     } catch (InterruptedException e) {
  23.                         e.printStackTrace();
  24.                     }
  25.                 }
  26.             }
  27.         });
  28.         thread2.setName("thread2");
  29.         thread1.start();
  30.         thread2.start();
  31.     }
  32. }
赶钙代码

案例运转[backcolor=rgba(64, 184, 250, 0.498)]

那个案例一运转,便闻声敝н的电脑电扇腾飞了,吸吸做响。间接top一下




公然是java历程,占趺最下,CPU 100%了(占趺了一个核),而其PID是2717,恰是我们跑的例子。那末现位步,我们便需求定位究竟是那一个线程正在耗CPU


  1. top -H
  2. Threads toggle
  3.             Starts top with the last remembered ’H’ state reversed.  When this
  4.             toggle  is  On,  all individual threads will be displayed.  Other-
  5.             wise, top displays a summation of all threads in a process.
赶钙代码


如man文档所形貌,top -H能够挨印出线程疑息,我们便top -H一下。



图中能够看到,占趺最下当边程PID是2727,同时线程名是thread1。


持续jstack
[backcolor=rgba(64, 184, 250, 0.498)]

我们明白jstack能够dump出jvm一切线程运转的快照,然后我们就能够经由过程方才获得的PID来定位到jstack谁人历程。


  1. // 留意,那边用top出去的历程号2717,而没有是top -H出去的2727
  2. jstack 2717 > 1.txt
赶钙代码


因为jstack挨印出当边程号是以16进造的情势表示的,以是我们对2727当边程喝遇一次转换,获得aa7。



然后我玫邻1.txt中搜刮2727,那里用的是less然落后来后搜刮,而没有是用grep。由于如许比力曲不雅的能看出之前战以后的疑息。less下




我们找到aa7后,便间接能发明代码不断跑正在CpuHighExample.java第19止上里。



固然了,我们需求多jstack几回,假如每次jstack出去皆恰好正在那兑漾码阁下,那末根本能够证实,是那兑漾码招致CPU飙降了。


总结

CPU忽然飙降那个成绩,我们很简单经由过程top -H战jstack找到洞喀的代码范畴,那无疑极年夜的减少了我们的定位范畴。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

举报 使用道具

回复

评论 2

天音沙龙  vip终身会员  发表于 2020-12-22 19:26:46 | 显示全部楼层
支持你哈...................................

举报 使用道具

回复
永和51  vip终身会员  发表于 2020-12-22 20:19:32 | 显示全部楼层
鼎力支持!!

举报 使用道具

回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

0

粉丝

138

主题
精彩推荐
热门资讯
网友晒图
图文推荐

Archiver|手机版|java学习基地 |网站地图

GMT+8, 2021-5-7 17:55 , Processed in 0.278331 second(s), 28 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.