博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cpu 指定cpu执行 java_性能分析之CPU分析-从CPU调用高到具体代码行(JAVA)
阅读量:5939 次
发布时间:2019-06-19

本文共 1980 字,大约阅读时间需要 6 分钟。

【原创】:高楼(Zee)BeeTest众测平台

从CPU到具体的代码行(JAVA语言)

今天和大家絮叨絮叨从CPU到具体的代码行(JAVA语言)。通常情况下,性能报告中只说CPU使用率高的时候,并不能帮助定位问题。因为CPU高会有多种不同的情况。

CPU的状态(us sy id wa st)

在vmstat中能显示出来,想必很多人都清楚。

在代码消耗CPU的时候(这也是通常性能分析中会遇到的),是US状态的CPU。

当然还存在一种情况,就是代码产生的系统调用特别高,这种情况下SY的CPU也会高。

对于JAVA语言来说,我们不需要特别复杂的profile工具就可以做到定位到代码。

在写具体的分析方法之前,需要说一下线程的状态转换关系,我们先来看一下系统级的线程状态转换关系。

通过这个转换关系,可以看到:在线程产生之后,会先到ready的状态。在这个状态上是在等待CPU的。而在runing状态才是真正在CPU上执行的。

vmstat显示的 r 列是包括了ready和running的线程(会因操作系统的不同有区别,但是对大部分linux系统都是这样)。请注意这一点,因为网上有很多在写vmstat的解释的时候,说 r 列是表示正在运行的进程数或者说 r 是表示正在运行的线程数,这一点是不对的。给大家看一个例子(这也是下面要说到的例子):

这是我的一个云服务器上正在运行的top。可以看到当前tasks(进程)中只有一个是running的状态的。而这时的vmstat呢?

这个服务器只有两个CPU,所以如果r是说正在运行的进程或线程数的话肯定是不正确的,因为两个CPU同时运行的最多是两个线程。

所以请记住:这个 r 值就包括了等待CPU的线程(也就是ready状态的)和正在运行的线程(也就是running状态的)。

以后有时间再解释其他系统级的线程状态,在性能分析中,线程的状态和一些性能计数器是有关联关系的。

比如说suspended状态是CPU时间片用完导致暂时被换出;而blocked是因为要等待某个条件被满足而阻塞;并且这两种状态都有可能导致CPU使用率高。

在分析的过程中,这些信息给我们的是一个方向。所以前面说到仅说CPU高不能帮助分析问题,因为CPU高有多种原因。

JAVA的线程状态转换关系

从这个图中,我们可以看到JAVA的进程有多种状态,想看到这些状态都在干什么,就需要把栈打出来看。在栈中,可以看到具体对应的代码(对其他编译语言来说,要看看到正在运行的code也是要看栈的)。

另外,在性能分析中,栈的分析是非常重要的一块内容,本文为了说明从CPU高怎么定位到代码层,所以不过多解释线程的状态了从这个图中,我们可以看到JAVA的进程有多种状态,想看到这些状态都在干什么,就需要把栈打出来看。在栈中,可以看到具体对应的代码(对其他编译语言来说,要看看到正在运行的code也是要看栈的)。

另外,在性能分析中,栈的分析是非常重要的一块内容,本文为了说明从CPU高怎么定位到代码层,所以不过多解释线程的状态了

实例:

下面来操作一下。

首先,执行一个消耗CPU的JAVA实例,查看vmstat的状态。

从上图可以看到:左边窗口在执行一个消耗CPU的Demo,而右边的窗口看到当前系统的CPU已经完全被消耗掉了。

进程号通过top命令就可以知道:

进程中的哪些线程消耗了CPU

通过pidstat可以看到:有10个线程消耗着CPU资源。我把命令放在这里,有兴趣的可以自己操作。

pidstat -p 8294 -u -d -t -w -h 1 1000

从上命令可以看到:有多个线程消耗着CPU。线程ID是:8306、8307、8308等等。用jstack做一下thread dump

[root@7dgroup ~]# jstack -l 8294 > 8294.threaddump再打开这个生成的文件

其中nid是指native ID,对应着系统级的tid。只不过TID显示的是10进程的,NID显示的是16进制的。我们转换一个线程号来查找。

[root@7dgroup ~]# printf %x'\n' 8306

2072再对应到threaddump文件中。

显然可以去查这个CPUTestThreadDemo.java的第13行了

从这个例子可以看出:

对java的代码消耗CPU高的分析只需要通过系统级的命令和JDK自带的命令就可以完成了。

这个例子非常简单,步骤比较清楚。但在实际分析代码众多,逻辑复杂的应用,有可能你看到的是CPU在线程上的消耗是在不停的切换的,所以就需要多做些thread dump,一个个分析。当然借助些工具分析,通常可以让我们在分析复杂的应用时事半功倍。

加入BeeTest众测,成为众测专家。

转载地址:http://iqltx.baihongyu.com/

你可能感兴趣的文章
Android图片处理
查看>>
2015年第21本:万万没想到,用理工科思维理解世界
查看>>
大家谈谈公司里的项目经理角色及职责都是干什么的?
查看>>
剑指offer
查看>>
Velocity魔法堂系列二:VTL语法详解
查看>>
NopCommerce架构分析之八------多语言
查看>>
转:Eclipse自动补全功能轻松设置
查看>>
ES6新特性:Javascript中的Reflect对象
查看>>
hibernate逆向工程生成的实体映射需要修改
查看>>
mysql update操作
查看>>
Robots.txt - 禁止爬虫(转)
查看>>
MySQL数据库
查看>>
项目分析_xxoo-master
查看>>
SQLServer2012自增列值跳跃的问题
查看>>
ViewBag对象的更改
查看>>
Mysql 监视工具
查看>>
hdu1025 Constructing Roads In JGShining's Kingdom(二分+dp)
查看>>
Android PullToRefreshListView和ViewPager的结合使用
查看>>
禅修笔记——硅谷最受欢迎的情商课
查看>>
struts2入门(搭建环境、配置、示例)
查看>>