`
lzzy_alex
  • 浏览: 29081 次
社区版块
存档分类
最新评论

Java项目性能瓶颈定位

 
阅读更多

文章目标

当Java项目出现性能瓶颈的时候,通常先是对资源消耗做分析,包括CPU,文件IO,网络IO,内存;之后再结合相应工具查找消耗主体的程序代码。本文主要介绍系统资源消耗的分析过程,以及常用的Java线程分析方法。

 

CPU分析

在Linux中,CPU主要用于处理中断、内核及用户任务,优先级为:中断>内核>用户。在分析CPU消耗状况的时候,需要了解以下三个概念。

 

上下文切换

每个CPU(或多核CPU的每个核心)在同一时间只能执行一个线程<不包括超线程CPU>,Linux采用抢占式调度。当线程执行到达一个时间片后,如果线程有IO阻塞或高优先级线程要执行的时候,Linux将执行线程切换,切换前先保存当前线程执行状态(现场),并恢复待执行线程状态,这个过程就叫做上下文切换。在Java应用中,文件IO、网络IO、锁等待、线程Sleep操作都会使该线程进行阻塞或睡眠状态,从而触发上下文切换。频繁的上下文切换会造成内核占用较高的CPU,使得响应速度下降。

 

运行队列

每个CPU核心都维护了一个可运行队列,例如一个4核CPU,启动8个线程,且8个线程都处于可运行状态,平均分配情况下,每个核心的可运行队列里就有2个线程。通常而言,系统的load是由CPU运行队列决定的,假设以上状态维持了1分钟,则1分钟内系统load就是2。运行队列值越大,代表线程要消耗越长的时间才能执行完成。通常建议每个核心运行队列为1-3个。

 

利用率

CPU利用率指在用户进程,内核,中断处理,IO等待以及空闲五个部分百分比,这五个值是用来分析CPU消耗情况的关键指标。Linux System and NetWork Performent Monitoring建议用户进程/内核消耗比例为 65%-70% / 30%-35% 左右。

 

常用top, pidstat, sar, vmstat 1 分析占用情况,下图是top示例

 

us:用户进程处理占用百分比

sy:内核线程处理占用百分比

ni:被nice命令改变优先级的任务所占百分比

id:cpu空闲时间占用百分比

wa:在执行过程中等待IO所占百分比

hi:硬件中断占用百分比

si:软件中断占用百分比

st:虚拟机偷取时间百分比

对Java应用而言,线程消耗主要体现在us, sy上:

 

us: 用户进程处理占用百分比

us占用分析,需要依靠相关命令找出主体消耗线程ID(tid),然后转化成十六进制(printf "%x\n" tid),再用 kill -3 java_pid或 jstack -l java_pid 命令dump出线程信息,通过之前的十六进制值在dump信息中找到nid相等的线程,即为消耗CPU的线程。采样的时候要多做几次,保证找到的是真实的消耗线程。

 

在Java应用中如果us占用过高,代表运行的应用程序消耗了大部分CPU,常见为线程一直处理可运行状态(Runnable),并且无阻塞地执行循环,正则或复杂计算;也可能是每次请求都分配大量内存,导致频繁GC甚至频繁FullGC造成的,这时就需要依靠jvm工具查看了(jps, jmap, jstat等) 。

 

sy: 内核线程处理占用百分比

sy值过高表示Linux花费大量时间在线程切换上,Java造成原因通常是启动大量线程,且多数线程处理不断阻塞(如IO等待,锁等待)和执行的状态变化中,造成大量上下文切换。这时可通过 kill -3 java_pid或jstack -l java_pid 命令dump出线程信息,找出不断切换线程执行状态的原因(也可以通过TDA分析)。

 

如下使用 vmstat 1 查看上下文切换(cs)及sy占用

 

如果cs值很高的话,再使用 jstack -l java_pid 查看线程堆栈信息,通常可以发现大量线程处于TIMED_WAITING (on object monitor)与Runnable状态转化中,通过on object monitor可以找到锁竞争激烈的代码,从而找出上下文切换的原因。

 

文件IO分析

Linux在操作文件的时候,会将文件放入文件缓存区,直到内存不够或系统要释放内存给用户进程使用时,才会交换出去。因此在查看内存状态时经常发现可用(free)的物理内存不足,但cached用了很多,这是Linux提升文件IO速度的一种方法。这种情况下,如果物理内存足够用,真正的文件IO只有写文件和第一次读的时候才会产生。

 

在Linux中文件IO主要通过 pidstat, iostat分析:

 

pidstat -d -p java_pid 1 3

KB_rd/s 表示每秒读取的KB数, KB_wr/s表示每秒写入的KB数, 还可以加入-t参数显示具体的线程信息。

 

iostat

iostat只能看到整个系统的文件IO,不能查看具体进程消耗情况。Device表示设备卷标名或分区名,tps是每秒的IO请求,是IO消耗关键指标;Blk_read/s表示每秒读的块数量,Blk_wrtn/s表示每秒写的块数量;Blk_read, Blk_wrtn表示总共读写的块数量;当%iowait占用很高的时候,就要关注IO消耗状况了,这时可以使用 iostat -x 观察:

 

r/s, w/s 表示每秒读写的请求数, await表示平均每次IO操作的等待时间,avgqu-sz表示等待请求的队列的平均长度,svctm表示平均每次设备执行IO操作的时间,util表示一秒之中有百分之几用于IO操作。

 

在Java应用中造成文件IO消耗严重的原因,通常是多个线程进行大量写入操作(如频繁写入日志文件)。这时可以通过pidstat或iostat结合jstack线程信息,找到消耗主体程序。

 

网络IO分析

在分布式Java应用中,网络IO的消耗是非常值得关注的,尤其注意网卡中断是不是均匀地分配到各CPU上(cat /proc/interrupts)。Linux使用sar分析网络IO消耗情况:

 

sar -n ALL 1 2


 

主要观注接包(rxpck/s),发包(txpck/s),接包失败(rxerr/s),发包失败(txerr/s),丢包(rxdrop/s),Socket信息(tcpsck , udpsck)。

 

由于无法观察具体进程的网络IO消耗,在网络IO消耗高时,只能线程dump,通常这些线程都在进行网络读写操作。在Java网络通信中,通常将对象序列化为字节流发送,反序列化生成对象。

 

内存分析

从Java应用角度上看,内存可分为两部分,即JVM内存与非JVM内存。在JVM中内存消耗主要体现在堆内存上,内存消耗过高会导致频繁GC甚至FullGC,CPU占用高,可以通过jmap, jstat, mat, visualvm等工具跟踪内存消耗情况;生产环境下,通常将 -Xms 和 -Xmx调整为相同的值,避免运行时不断申请内存。非JVM内存通常只有在创建线程或使用DirectByteBuffer时才会产生,最值得关注的是swap的消耗与物理内存的消耗。

 

vmstat

swpd表示虚拟内存已使用的部分(kb),free空闲物理内存,buff表示用于缓冲的内存,cache表示用于作为缓存的内存。swap下的si表示每秒从disk读到内存的数据量,so每秒从内存写入disk的数据量。swpd过高表示物理内存不够用,系统需要频繁从虚拟内存与disk交换数据,严重影响系统的性能。

 

sar -r 2 5


 

通过sar工具可以看到内存占用,空闲,buff, cache的情况。当物理内存空闲时,Linux会使用一部分内存用于buffer以及cache,以提高系统运行效率。因此可认为系统可用物理内存为 kbmemfree + kbbuffers + kbcached。

 

此外还可以使用top, pidstat -r -p [pid][interval][times]

 

pidstat -r -p 2448 1 5


 

参考资料

中断:http://blog.csdn.net/pxz_002/article/details/7327668

CPU占用分析:http://www.cnblogs.com/yjf512/p/3383915.html

林昊:分布式Java应用

JVM内存分析:http://my.oschina.net/feichexia/blog/196575

  • 大小: 6.7 KB
  • 大小: 4.5 KB
  • 大小: 3.3 KB
  • 大小: 5 KB
  • 大小: 6.1 KB
  • 大小: 11.2 KB
  • 大小: 3 KB
  • 大小: 4.7 KB
  • 大小: 3.5 KB
分享到:
评论

相关推荐

    java应用瓶颈定位

    讲解java应用下如何定位其性能瓶颈讲解java应用下如何定位其性能瓶颈讲解java应用下如何定位其性能瓶颈讲解java应用下如何定位其性能瓶颈

    koTime是一个轻量级的springboot项目性能分析工具,通过方法调用链路追踪以及运行时长监控快速定位性能瓶颈

    koTime是一个轻量级的springboot项目性能分析工具,通过方法调用链路追踪以及运行时长监控快速定位性能瓶颈,并进行可视化展示,还支持代码热更新与邮件预警; 实时监听方法,统计运行时长; web展示方法调用链路,...

    Java问题定位技术.pdf

    2.通过Java线程堆栈进行性能瓶颈分析 3.Java内存泄漏分析和堆内存设置 4.关于并发和多线程 5.幽灵代码 6.常见的Java泥潭 7.JVM 8.关于字符集与编码 9.常用分析工具 10.Java最佳实践 11.关于数据库 12.工程实践 13....

    Java应用性能调优实践

    笔者根据个人经验,将Java性能优化分为4个层级:应用层、数据库层、框架层、JVM层,如图1所示。图1.Java性能优化分层模型每层优化难度逐级增加,涉及的知识和解决的问题也会不同。比如应用层需要理解代码逻辑,通过...

    软件测试中使用JProfiler结合LoadRunner寻找系统性能瓶颈

    LoadRunner,是一种预测系统行为...接下来给大家讲一下有关在使用JProfiler结合LoadRunner寻找系统性能瓶颈LoadRunner:加压JProfiler:监控1JProfiler是做什么的?JProfiler工具主要用于检查和跟踪系统(限于Java开发

    开源的Android性能测试工具APT

    APT Android Performance Testing Tools 开源项目 适用于开发自测和定位性能瓶颈 帮助测试人员完成性能基准测试 竞品测试 APT提供了CPU利用率实时曲线图 多维度内存实时曲线图 方便竞品对比测试和定位内存泄露问题...

    arthas 压缩包下载

    Arthas提供了丰富的命令行工具和可视化界面,使开发人员能够实时查看应用程序的运行状态、线程堆栈、方法调用等关键信息,帮助他们快速定位和解决性能瓶颈和故障。此外,Arthas还提供了丰富的诊断命令,如查看类加载...

    《SQL Server 2008查询性能优化》英文[PDF]

    内容涵盖了数据库应用系统中各种性能瓶颈的表现形式及其发生的根源和解决方法,从硬件瓶颈到查询、索引设计以及数据库管理等,贯穿了数据库系统知识的各个方面。最后以一个实际的工作负载将所有技巧联系起来,并且...

    Linux之性能分析工具Intel(R) VTune.doc

    可以用来分析C++ JAVA等,使用VTune Amplifier XE 可以定位或者决定如下内容: 1)、 在你的程序中或者整个系统中时间消耗最多的函数; 2)、 没有有效利用处理器时间的代码片段; 3)、 优化串行和线程化性能的最好...

    javaagent:基于javaagent开发的APM工具,收集方法的执行次数和执行时间,定时输出成json格式的日志

    基于javaagent的日志,你可以使用严丽同学开发的进行分析查询,或者可以自己去写分析器,这样可以让你快速定位生产环境的性能瓶颈。 集成 java启动参数中就有javaagent,你只需要在JAVA_OPTS中加入-javaagent:/opt/...

    truetime-1.5

    一个应用程序运行速度较慢,程序员不容易找到到底是在哪里出现了问题,如果不能解决应用程序的性能将降低并极大的影响应用程序的质量,于是查找和修改性能瓶颈是调整整个代码性能的关键。如何快速的查找性能瓶颈呢?...

    常用Java Profiling工具的分析与比较

    在 Java 程序的开发过程中,不可避免地会遇到内存使用、性能瓶颈等问题。Java Profiler 工具能帮助开发人员快速、有效地定位这些问题,因此成为了 Java 开发过程中的一个重要工具。目前市场上的 Java Profiler 工具...

    应用性能分析系统SkyWalking的安装及使用详解

    最后,文章还介绍了Skywalking的使用技巧,包括如何配置监控项、分析监控数据、定位性能瓶颈等,帮助用户更好地利用Skywalking进行应用性能管理。 Skywalking是一个优秀的国产开源框架,由华为开发者吴晟在2015年...

    【闲说】性能测试

    那么,就趁着这次性能测试的机会,重新梳理下对linux,网络IO等基本功的认识已经就性能瓶颈的定位分享下自己的心得。 本次性能测试的目的是测试使用公司内部RPC框架开发的一套接口的性能,目的是准确的拿到接口的...

    jprofiler_windows-x64_11_0_Crack.rar

    此资源为jprofiler_windows-x64_11_0_Crack,jprofiler_...EJ Technologies JProfiler 11.0用于分析Java EE软件性能瓶颈并能准确定位到Java类或者方法,是有效解决性能问题的主流工具,可以集成到 IntelliJ IDEA 中。

    FastDFS分布式文件系统.docx

    1.认识海量文件存储、架构、性能瓶颈 2.能够理解互联网环境中文件服务器选型 3.能够理解FastDFS分布式文件系统架构、及架构思想 4.能够理解文件上传、下载、 文件服务器访问的流程 5.能够完成FastDFS环境搭建(使用...

    Loadrunner从零开始

    对零基础的性能测试详细讲解,新手必看。 响应时间(Response time) 响应时间就是用户感受软件系统为其服务所耗费的时间,对于...细分的目的是为了方便定位性能瓶颈出现在哪个节点上(何为性能瓶颈,下一节中介绍)。

    SQLServer2008查询性能优化 2/2

    内容涵盖了数据库应用系统中各种性能瓶颈的表现形式及其发生的根源和解决方法,从硬件瓶颈到查询、索引设计以及数据库管理等,贯穿了数据库系统知识的各个方面。最后以一个实际的工作负载将所有技巧联系起来,并且...

    SQLServer2008查询性能优化 1/2

    内容涵盖了数据库应用系统中各种性能瓶颈的表现形式及其发生的根源和解决方法,从硬件瓶颈到查询、索引设计以及数据库管理等,贯穿了数据库系统知识的各个方面。最后以一个实际的工作负载将所有技巧联系起来,并且...

Global site tag (gtag.js) - Google Analytics