前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面试杂谈 - CPU占用高如何排查

面试杂谈 - CPU占用高如何排查

作者头像
acupt
发布2019-08-26 15:47:38
1.6K0
发布2019-08-26 15:47:38
举报
文章被收录于专栏:一杯82年的JAVA一杯82年的JAVA

程序里少不了运算,如果不是环境太恶劣,CPU基本是能支撑应用运行的。但如果发现CPU居高不下,就需要思考是否程序有问题。

当服务器CPU居高不下,可以从下面几个方面入手定位问题。

找到JAVA进程 pid

方法一: jps

那个jar就是我的一个java程序

代码语言:javascript
复制
[root@iZba13i1mo82ot7a3lhq5oZ ~]# jps
17616 Jps
26016 jar
9353 Bootstrap
26028 Bootstrap
16812 Bootstrap

方法二: ps -ef|grep 应用关键词

和方法一找到的pid是相同的,26016

代码语言:javascript
复制
[root@iZba13i1mo82ot7a3lhq5oZ ~]# ps -ef|grep acupjava
root     17638 17550  0 22:34 pts/0    00:00:00 grep --color=auto acupjava
root     26016     1  0 7月08 ?       00:05:11 java -jar acupjava-1.0-SNAPSHOT.jar

找到进程中CPU高的线程 tid

打印出线程线程基本信息,找到cpu百分比高的一个或几个线程,记住它们的tid。

PS:栗子质量不好,全是0.0%,不要在意~

代码语言:javascript
复制
[root@iZba13i1mo82ot7a3lhq5oZ ~]# ps -mp 26016 -o THREAD,tid,time
USER     %CPU PRI SCNT WCHAN  USER SYSTEM   TID     TIME
root      0.0   -    - -         -      -     - 00:05:11
root      0.0  19    - futex_    -      - 26016 00:00:00
root      0.0  19    - futex_    -      - 26017 00:00:02
root      0.0  19    - futex_    -      - 26018 00:00:00
root      0.0  19    - futex_    -      - 26019 00:00:00
root      0.0  19    - futex_    -      - 26020 00:00:11
(略...)

打印线程栈

选择一个线程,把tid从10进制转为16进制

代码语言:javascript
复制
[root@iZba13i1mo82ot7a3lhq5oZ ~]# printf "%x\n" 26017
65a1

为了方便查看可以把线程栈打印到文件里,jstack pid >> 文件名

使用ls查看文件已经存在

代码语言:javascript
复制
[root@iZba13i1mo82ot7a3lhq5oZ ~]# jstack 26016 >> stack.txt
[root@iZba13i1mo82ot7a3lhq5oZ ~]# ls
test  stack.txt

找到占用CPU高的线程

打开文件,搜索tid所在位置,可以看到线程栈,由此分析定位可能有问题的代码。

代码语言:javascript
复制
"http-nio-9527-AsyncTimeout" #29 daemon prio=5 os_prio=0 tid=0x00007fbf68973800 nid=0x65a1 waiting on condition [0x00007fbf48ab0000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at org.apache.coyote.AbstractProtocol$AsyncTimeout.run(AbstractProtocol.java:1200)
        at java.lang.Thread.run(Thread.java:748)

如此这般,CPU高的问题基本就能定位出来了。(PS: 以上数据做了些许脱敏处理)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一杯82年的JAVA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 找到JAVA进程 pid
    • 方法一: jps
      • 方法二: ps -ef|grep 应用关键词
      • 找到进程中CPU高的线程 tid
      • 打印线程栈
      • 找到占用CPU高的线程
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档