cpu过高分析

cpu太高,一般来讲或者是有死循环,或者是cpu密集型应用。

定位问题思路:

1. 查看哪个进程战用过高。

2.查到后,查看该进程哪个线程占用过高。

3.查到对应cpu过高线程后,用jstack打印出线程栈,查看对应堆栈信息

以下为整个实例,

一.先查找出哪个进程占用cpu过高

用命令: top

结果:

7907 zhao      20   0 3279m 645m  30m S   52  8.2   8:34.18 java

21372 zhao      20   0 4226m 384m  13m S   41  4.9   4:40.90 java

可以看到7907和21372这个进程比较高,其中7907是eclipse程序,可以用jps看到所有java进程

而21372是我们的应用程序,因此主要定位21372这个进程

二.找出对应进程,cpu占用过高的线程

用命令:top -H -p 21372

结果:

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

21673 zhao      20   0 4226m 384m  13m R   46  4.9   6:06.72 java

21372 zhao      20   0 4226m 384m  13m S    0  4.9   0:00.00 java

21377 zhao      20   0 4226m 384m  13m S    0  4.9   0:06.95 java

21379 zhao      20   0 4226m 384m  13m S    0  4.9   0:00.25 java

可以看到21673线程占用了46%的cpu。

三.打印出占用cpu过高的线程堆栈

第二步查找到的线程id为:21673,由于jstack打印出的进程线程栈为16进程编码,

因此将:21673转成十六进制为54a9

用命令:jstack 21372(进程),如果希望保存到文件中则可以:jstack 21372 > /home/yourpath/c.log

结果:

"http-nio-8082-exec-1" daemon prio=10 tid=0x00007f9a44003800 nid=0x54a9 runnable [0x00007f9acc1a5000]

java.lang.Thread.State: RUNNABLE

at java.io.FileOutputStream.writeBytes(Native Method)

at java.io.FileOutputStream.write(FileOutputStream.java:345)

at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)

at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)

- locked <0x0000000784c1fcd8> (a java.io.BufferedOutputStream)

at java.io.PrintStream.write(PrintStream.java:482)

- locked <0x0000000784c1fcb8> (a java.io.PrintStream)

at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)

at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)

at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:104)

- locked <0x0000000784c1fe08> (a java.io.OutputStreamWriter)

at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:185)

at java.io.PrintStream.write(PrintStream.java:527)

- locked <0x0000000784c1fcb8> (a java.io.PrintStream)

at java.io.PrintStream.print(PrintStream.java:669)

at java.io.PrintStream.println(PrintStream.java:806)

- locked <0x0000000784c1fcb8> (a java.io.PrintStream)

at com.test.mainsite.controller.IndexController.home(IndexController.java:21)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

用转换过的线程号:54a9查找,可以看到上述的线程线

这里:

at com.test.mainsite.controller.IndexController.home(IndexController.java:21)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

就是当前线程发生cpu过高的业务代码

时间: 2024-11-05 18:54:06

cpu过高分析的相关文章

项目CPU异常高分析

今天验收一个项目的时候发现这程序挂在大厅不看视频都能煎鸡蛋,用电比充点还快,所以就决定查下这软件到底是干了点什么 1.首先先看下到底用了多少cpu 果然很离谱,我什么都不干,就已经这么高,一般的游戏都没这么高 2.这个时候介绍下如何看什么函数占用了大量cpu 主要用的是strace 使用方法: ①.推送strace到一个文件夹 adb shell  #adb shell su            #获取管理员权限 chmod 777 /data/    #改变权限 不然会没有权限 adb pu

java进程占用cpu过高分析是哪些线程

拿hbase基准测试列子来分析哪些线程使用比较高的cpu,环境是linux,基准测试命令: hbase org.apache.hadoop.hbase.PerformanceEvaluation  --rows=500000 --nomapred --presplit=5 --writeToWAL=true randomWrite 5 首先查看占用cpu最高的进程和线程id,执行命令: [[email protected] logs]$ ps Hh -eo pid,tid,pcpu | sort

几个常用的内存、CPU飙高 分析工具

Process Hacker.Windbg.vs2017 调试托管内存.Microsoft.Samples.Debugging.ants memory profiler.ants performance profiler 有时间详细介绍这几个工具怎么玩,不过这几个工具只是辅助分析飙高原因,都很难直接定位,需要经验......

性能测试 | 服务器CPU使用率高分析实例

前面我们讨论系统调用的时候结论是耗时200ns-15us不等.不过我今天说的我的这个遭遇可能会让你进一步认识系统调用的真正开销.在本节里你会看到一个耗时2.5ms的connect系统调用,注意是毫秒,相当于2500us! 问题描述 当时是我的一个线上云控接口,是nginx+lua写的.正常情况下,单虚机8核8G可以抗每秒2000左右的QPS,负载还比较健康.但是该服务近期开始出现一些500状态的请求了,监控时不时会出现报警.通过sar -u查看峰值时cpu余量只剩下了20-30%. 图3.jpg

压测过程中故障排查之一:高CPU占用问题分析案例

说明: 一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环 以我们最近出现的一个实际故障为例,介绍怎么定位和解决这类问题. 根据top命令,发现PID为28555的Java进程占用CPU高达200%,出现故障. 通过ps aux | grep PID命令,可以进一步确定是tomcat进程出现了问题.但是,怎么定位到具体线程或者代码呢? 首先显示线程列表: ps -mp pid -o THREAD,tid,time 找到了耗时最高的线程28802,占用CPU时间快两个小

性能测试三十九:Jprofiler分析CPU过高和响应时间长的问题

使用Jprofiler监控分析案例 一.cpu负载过高:http://localhost:8080/PerfTeach/CpuTopServlet?id=1 cpu消耗高的可能原因1.使用了复杂的算法,比如加密.解密2.压缩.解压.序列化等操作3.代码bug,比如死循环 dstat监控起来,先看一下资源是否正常,用5个并发跑60秒 CPU:100% TPS才几百,肯定就有问题 TOP:JAVA占的CPU最多 查看进程,是tomcat 使用jprofiler查看,很明显有个自己写的userToSt

Linux下java进程CPU占用率高分析方法

Linux下java进程CPU占用率高分析方法 在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况.这种情况发生时,我们怎么去找出原因并解决. 一般解决方法是通过top命令找出消耗资源高的线程id,利用strace命令查看该线程所有系统调用 1. 通过top命令找到可疑进程PID top - 09:37:18 up 70 days, 16:29, 2 users, load average: 1.13, 1.04, 0.97 Tasks: 105 total, 1 running

Java虚拟机六:Java进程占用cpu过高问题分析

在平时开发过程中,经常会碰到Java进程占用cpu过高的现象,本篇将简单记录一下自己分析该类问题的步骤. 1.使用 top -p <pid> 命令(<pid>为Java进程的id号)查看Java进程的cpu占用: 该Java进程占用cpu达到92.2%. 2.使用 top -Hp <pid>  命令(<pid>为Java进程的id号)查看该Java进程内所有线程的资源占用情况(按shft+p按照cpu占用进行排序,按shift+m按照内存占用进行排序)此处按

Linux下CPU占用率高分析方法

一.可能有线程一直占用CPU资源 1. 先通过 ps 查看进程状态,找出进程的PID(8209). 2.jstack -l 8209 > /usr/local/work/tomcat/8209.stack 导出PID对应的线程信息到文件 3.对导出的线程文件下载本地做分析(可以文本打开) 4. 通过top -H -p 8209 命令查看对应进程是哪个线程占用CPU过高(eg:8308) 5.printf "%x\n" 8308 转换十进制为十六进制 此处为:2074. 6.在导出