`
san_yun
  • 浏览: 2594981 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

找到最耗CPU的java线程

 
阅读更多

找到最耗CPU的java线程ps命令

命令:ps -mp pid -o THREAD,tid,time   或者  ps -Lfp pid

结果展示:

 

这个命令的作用,主要是可以获取到对应一个进程下的线程的一些信息。 比如你想分析一下一个java进程的一些运行瓶颈点,可以通过该命令找到所有当前Thread的占用CPU的时间,也就是这里的最后一列。

 

比如这里找到了一个TID : 30834 ,所占用的TIME时间最高。

通过 printf "%x\n" 30834 首先转化成16进制, 继续通过jstack命令dump出当前的jvm进程的堆栈信息。 通过Grep命令即可以查到对应16进制的线程id信息,很快就可以找到对应最耗CPU的代码快在哪。

简单的解释下,jstack下这一串线程信息内容: 

 

Java代码  

  1. "DboServiceProcessor-4-thread-295" daemon prio=10 tid=0x00002aab047a9800 nid=0x7d9b waiting on condition [0x0000000046f66000]  

nid : 对应的linux操作系统下的tid,就是前面转化的16进制数字

tid: 这个应该是jvm的jmm内存规范中的唯一地址定位,如果你详细分析jvm的一些内存数据时用得上,我自己还没到那种程度,所以先放下

top命令

命令:top -Hp pid 

结果显示:

 

和前面的效果一下,你可以实时的跟踪并获取指定进程中最耗cpu的线程。 再用前面的方法提取到对应的线程堆栈信息。

 

判断I/O瓶颈

mpstat命令

命令:mpstat -P ALL 1 1000

结果显示:

 

注意一下这里面的%iowait列,CPU等待I/O操作所花费的时间。这个值持续很高通常可能是I/O瓶颈所导致的。

通过这个参数可以比较直观的看出当前的I/O操作是否存在瓶颈

 

iostat命令

命令: iostat -m -x 1 1000

 

同样你可以观察对应的CPU中的%iowait数据,除此之外iostat还提供了一些更详细的I/O状态数据,比如比较重要的有: 

avgqu-sz :  The average queue length of the requests that were issued to the device. (磁盘队列的请求长度,正常的话2,3比较好。可以和cpu的load一样的理解)

await : The average time (in milliseconds) for I/O requests issued to the device to be served. (代表一个I/O操作从wait到完成的总时间)

svctm和%util都是代表处理该I/O请求花费的时间和CPU的时间比例。 判断是否瓶颈时,这两个参数不是主要的

 

r/s w/s 和 rMB/s  wMB/s 都是代表当前系统处理的I/O的一些状态,前者是我们常说的tps,后者就是吞吐量。这也是评价一个系统的性能指标

 

pid命令

命令: pidstat -p pid -u -d -t -w -h 1 1000

 

结果显示:

 

相当实用的一个命令,可以基于当个进程分析对应的性能数据,包括CPU,I/O,IR , CS等,可以方便开发者更加精细化的观察系统的运行状态。不过pidstat貌似是在2.6内核的一些较新的版本才有,需要安装sysstat包。

ubuntu下,可以通过sudo apt-get install sysstat进行安装。

sar命令

命令:sar -x pid 1 1000

 

 

sar也可以指定对应的pid,关注固定的几个参数,没有pidstat那么强大。 看不到对应的I/O, IR等信息。

sar的功能可以覆盖mpstat , iostat的相关功能。

dstat命令

命令:dstat -y --tcp 1 1000

 

通过dstat --tcp可以比较方便的看到当前的tcp的各种状态,不需要每次netstat -nat去看

 

其他命令

netstat -natp  :  查看对应的网络链接,关注下Recv-Q , Send-Q , State。

lsof -p pid :  查找对应pid的文件句柄

lsof -i : 80  : 查找对应端口被哪个进程占用

lsof  /tmp/1.txt :查找对应文件被哪个进程占用

 

tcpdump / wireshark :抓包分析工具

jstat / jmap / jstack / jps 等一系列的java监控命令

 

最后

  如果你想做一些性能调优的工作,一定要善于利用一些工具进行关注相应的状态。通过linux命令你可以比较方便的观测到CPU , I/O , network等一些比较外围的状态, 很多时候就已经可以解决大部分的问题。jvm内部的一些运行状态监控,得需要借助一些特有的工具进行细粒度的观测。 

 

参考:常用的linux系统监控命令

分享到:
评论

相关推荐

    Java线程CPU占用高原因排查方法

    Java线程CPU占用高原因排查方法,Java线程CPU占用高原因排查方法

    如何找到占用cpu最高的java线程

    服务端开发者必备技能、面试必问技巧,下载者也可以延伸为如何找到占用内存最大的线程

    Java线程详解.ppt

    3、进程切换,它需要保留当前进程的CPU环境和设置新选中进程的CPU环境。 为此需要花费不少处理时间。正因为进程拥有资源,所以在并发执行进程的时候, 在创建、撤销和切换,系统需要付出较大的开销,因此,系统中...

    Java多线程编程指南

    Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。 ...

    java多线程作业.docx

    Java语言的一大特性点就是内置对多线程的支持。多线程是指一个应用程 序中同时存在几个执行体,按几条不同的执行线索共同工作的情况,它使得编 ...这些线程将被轮流执行,使得每个线程都有机会使用CPU资源。

    Java线程总结教程

    在论坛上面常常看到初学者对线程的无可奈何,所以总结出了下面一篇文章,希望对一些正在学习使用java线程的初学者有所帮助。 首先要理解线程首先需要了解一些基本的东西,我们现在所使用的大多数操作系统都属于多...

    threadBandCpu:将java线程绑定到具体的cpu上执行

    threadBandCpu将java线程绑定到具体的cpu上执行环境:Ubuntu 12.04具体介绍请移步这里:如何使用?调用ThreadBandCpu.bandCpu并实现Runnable的run方法,第二个参数的意思是在第几个cpu上执行假如有4个cpu,那么就是 ...

    Java多线程之基础篇(一).docx

    与此相反,像java所使用的这种并发系统会共享内存或I/O这样的资源,因此编程编写多线程程序最基本的困难在于,协调不同线程驱动的任务之间这些资源的使用,以便使得这些资源不会同时被多个任务访问。

    让双核cpu利用率100%的代码

    让双核cpu利用率100%的代码,增加多线程就可以,如果想要内存满了,就不断开辟内存,仅仅是eclipse内存。 资源利用率 java 100% cpu 死机 资源利用率 java 100% cpu 死机 资源利用率 java 100% cpu 死机 资源利用率 ...

    Java 线程状态、线程池

    线程已经在JVM中运行,但是是否运行不确定,看当前线程是否由CPU执行权 BLOCKED(锁阻塞) 同步代码需要获取对应的锁对象,如果锁对象被其他线程持有,则当前线程就会进入一个block状态,当当前线程持有锁对象时,...

    java多线程

    要求线程“运货司机”占有CPU资源之后联合线程“装运工”,也就是让“运货司机”一直等到“装运工”完成工作才能开车。 线程“装运工”占有CPU资源之后联合线程“仓库管理员”,也就是让“装运工”一直等到“仓库...

    java多线程下载课程设计工程源码

    网上找了份资料,是别人完成的Java实现多线程下载的功能。Java多线程的好处挺多的,可以充分利用CPU的资源,简化编程模型,简化异步事件的处理,使GUI更有效率,节约成本...

    Java线程的6种状态及切换(透彻讲解).docx

    2. 运行(RUNNABLE) :Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。 线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被...

    java多线程安全性基础介绍.pptx

    java多线程安全性基础介绍 线程安全 正确性 什么是线程安全性 原子性 竞态条件 i++ 读i ++ 值写回i 可见性 JMM 由于cpu和内存加载速度的差距,在两者之间增加了多级缓存导致,内存并不能直接对cpu可见。 ...

    java学习多线程处理

    部分内容如下所示: 进程:应用程序的执行实例 进程的特征:动态性,并发性,独立性 线程:进程内部的一个执行...系统中进程包含多个线程,CPU通过分配时间片的方式管理线程,由这个新的线程来执行线程对象的run方法

    java多线程与并发库高级处理.txt

    如果对什么是线程、什么...说这个话其实只有一半对,因为反应“多角色”的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的“生产者,消费者模型”。

    CPU压测JAR包,可以将多核CPU资源吃满

    java -jar xxx.jar调用 输入线程数,回车【想压满的话,输入CPU线程数】,开始压测 按S退出

    java查询cpu内存工具

    #通过任务管理器查询pid #打印指定pid堆栈日志到指定文件 ...#在ProcessExplorer上查看进程cpu和内存使用情况,找到java进程点开可以看tid线程使用情况,通过tid可在线程日志中找到指定线程进行分析

    java获取cpu、内存信息

    利用 java 获取电脑的cpu信息、内存信息

    2020最新Java面试题及答案(带完整目录).pdf

    Hotspot JVM 中的 Java 线程与原生操作系统线程有直接的映射关系。当线程本地存储、缓 冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。 Java 线程结束,原生线程随之被回收。操作...

Global site tag (gtag.js) - Google Analytics