`

JAVA程序性能分析及调优浅析

阅读更多
搬掉绊脚石,将内容不断靠近用户!

keep it simple, stupid

关键词:CPU时间占比、当前执行的SQL语句、执行时间过长的方法、代码屏蔽

1. 性能分析本质

寻找系统的性能瓶颈(木桶理论/短板效应),并处理系统的性能瓶颈

2. 性能分析主要指标

负载、响应和服务器CPU\MEM\IO等的使用率

3. 性能分析主要工具

LoadRunner、VisualVM、MySql 客户端工具(或类似工具)和Linux命令(或监控工具)

4. 性能分析及处理思路

4.1. 代码

避免代码里面的循环数据库查询(梳理业务,基本都可以实现为非循环方式)

避免代码里面的循环数据库更新处理(插入、更新等),尽量采用批量方式

注意合并类似的SQL语句(主要是谓词,即查询条件大致相同),将某些计算放置到程序中,减少对数据库的查询等操作

避免生产新的、耗时和耗内存的对象,即消耗内存,又消耗CPU
比如获取方法调用栈轨迹,有人采用new Throwable().getStackTrace() 方式来获取,就比较有问题了,该对象的生成相对来说很耗资源,测试某个长事务过程中,CPU占比达整个的4%,实际上可以采用Thread.currentThrread.getStackTrace() 来处理该需求

使用private、final和static方法,即使代码结构合理,也能运行更有效率

采用必要的缓存(主要针对不易变化的,非实时性要求的数据,比如字典表,排名等)

前台能处理的,尽量放到前台,以充分利用客户电脑,节约带宽及服务器CPU\MEM等资源

4.2. 业务

业务是否可以简化?
简化之后是不是可以去掉不必要的代码?是不是可以实现更简单,逻辑更清晰?
对代码的调整很多其实也是对业务的精炼!

4.3. SQL(MySql)

1、开启慢查询(捕获慢查询SQL语句)
在my.cnf文件[mysqld]后面,添加如下:
slow_query_log
slow_query_log_file=/export/servers/mysql/mysql_slow.log
long_query_time=0.1

2、show full processlist
压力测试期间,捕获当前执行SQL语句,重点关注state列和info列
IdUserHostdbCommand TimeStateInfo
318236rootdb_name7085sending dataSELECT …

state列正常情况下应该都是空(应为执行都很快),但假如你看到了sending data, statistics等,很不幸(如果很多),这往往伴随着CPU时间占比很高,这个时候往往表明你需要调整该SQL语句,或者相关调用代码或者其余处理措施(当然,有时候是负载实在太高了!)
Info列则是当前执行的SQL语句,show full processlist中的full的作用就是你可以查看完整的SQL语句

3、解释相关SQL语句
Explain/相关MySql客户端工具

4、show index from tbname/alter table tbname add index idx_idxname(colname)
根据explain和show index等,对相关sql语句进行索引优化

4.4. 配置

1、数据库服务器配置,重点关注以下配置(具体参数配置标准请google):
max_connections=1000
key_buffer_size = 16M :主要针对MyISAM存储引擎
table_open_cache=10000
innodb_buffer_pool_size = 10g :主要针对InnoDB存储引擎
query_cache_size=32m
可通过SHOW GLOBAL STATUS LIKE 'qcache%';查看查询缓存的使用情况,单交易压力
测试表征意义不大,要在混合场景稳定性测试等环境中观察

2、应用服务器配置(内存、线程池)
请参考TOMCAT6性能优化文档  http://shuhucy.iteye.com/admin/blogs/1709296

3、数据库连接池
根据实际需要配置、调整,(一般小于线程池数目,可设置为其一半)

5. 瓶颈定位方式

5.1. 基于单交易压力测试
单交易压力测试等,最好排除相关影响因数,比如你要测试一个添加,但你需要先进入一个列表,才能处理添加,这个时候,你可能需要在脚本里面将这个列表的代码去掉,避免该处代码对添加事务的影响,使添加事务更纯净,更易于定位问题

5.2. 监控相关服务器资源使用情况
重点关注CPU时间占比,内存等使用情况,可通过top、vmstat等命令监控
比如此次性能分析过程中数据库库服务器CPU占比很容易很高(往往解决了一个又来了另一个),这时可以通过数据库客户端工具摘取当前执行SQL语句,并通过工具分析(或者自己explain),查看索引使用情况,如果没有索引或不存在有效索引,则添加相关索引,并且注意调用该语句的代码是否是循环处理的,如果是循环处理,请提炼至循环外层

5.3. 通过VisualVM进行CPU、内存使用采样及垃圾回收监控
比如通过CPU采用,分析相关方法执行CPU占比,定位执行时间过长的方法,进行相关优化。


5.4. 通过代码屏蔽方式定位
可以通过屏蔽代码的方式以定位瓶颈点或者确认瓶颈点

注意事项:
1、避免压力测试脚本问题及其与环境、配置问题
    比如压力测试脚本不纯净,服务器对某一IP过多访问存在限制、线程池配置太小,数据库连接池配置太小,文件打开数超过系统限制等
2、避免问题定位错误
   某次压测发现CPU占比很高(90%),进行过一定的分析,发现数据库服务器网络负载在
   200多M(浏览器压测情况下没有启用缓存,页面图片量比较大),开始认为是网络带宽问题,但实际上,把页面的代码都注释掉(基本空页面),带宽很低,但CPU并没有降低,最后通过添加MySql查询缓存解决该问题!

   某次压测发现数据库服务器A的CPU占比很低,但就是TPS很低(正常情况下,数据库没有压力,适当的迸发环境下TPS一般应比较高),用工具连接数据库服务器,执行show processlist 发现state基本为空,很正常,查询相关配置参数,也没做更改。之后想起来还有另外一台数据库服务器B,会不会是B服务器导致的了?在B服务器上top一看,CPU占比90%,show full processlsit数据库一看,state很多sending data,info列重复很多一个查询语句,explain该语句,发现该语句缺少相应的索引!添加相关索引即TPS恢复正常
  • 大小: 94.8 KB
2
4
分享到:
评论
3 楼 天涯牧风 2013-01-08  
学习了~
2 楼 lvwenwen 2013-01-05  
mark下
1 楼 lsjinpeng 2013-01-05  
好深奥,mark下

相关推荐

    高校Java程序设计课程教学改革浅析.pdf

    高校Java程序设计课程教学改革浅析.pdf

    浅析Sybase数据库系统性能调优

    性能调优的主要目标在于减少系统公共资源的竞争,提高数据库响应速度和处理能力,从而提升整个应用程序或系统的整体性能。对于Sybase数据库而言,性能优化是一项长期且复杂的任务,涉及到多个层面的因素,包括但不...

    浅析Sybase数据库系统性能调优中文最新版本

    本文档主要讲述的是浅析Sybase数据库系统性能调优;性能调优”是对应用程序的性能优化。SYBASE数据库“性能调优”的主要目的是减少对系统公共资源的争用。对sybase数据库系统的性能进行优化,是一项长期且受诸多因素...

    Java程序与C语言的区分浅析_.docx

    Java程序与C语言之间的主要区别在于它们的设计哲学、语法特性以及对安全性、可移植性和效率的处理方式。这里我们将深入探讨这些差异。 首先,Java是一种面向对象的语言,而C语言则是面向过程的。这意味着在Java中,...

    浅析Sybase数据库系统性能调优.doc

    Sybase数据库系统的性能调优是一个复杂而重要的任务,旨在减少系统资源的争用,提升整体运行效率。这个过程涵盖了多个层次,包括服务器层、数据库层、应用层以及运行环境层。 1. **服务器层优化** - **内存分配**...

    Java程序设计中异常处理技术浅析.pdf

    Java程序设计中异常处理技术浅析

    Java语言中This关键字应用浅析

    Java语言中This关键字应用浅析,看完后帮助于JAVA中类的操作。

    Java内存分配浅析

    理解Java内存分配原理有助于优化程序性能,避免内存泄露等问题。 在JVM中,内存主要划分为以下几个区域: 1. **寄存器**:这是JVM内部的虚拟寄存器,用于存储快速存取的数据,但程序员无法直接控制。 2. **栈...

    浅析《Java程序设计》的微课设计与实现.pdf

    《Java程序设计》是计算机专业的核心课程之一,它培养了学生使用Java语言进行软件开发的能力,同时也为学生今后在Android开发、J2EE网站开发等领域的职业生涯打下坚实的基础。然而,由于Java语言本身具有一定的抽象...

    java 声音技术浅析

    Java声音技术浅析 在Java世界里,多媒体技术的集成一直是开发者关注的焦点,其中声音技术尤为关键。本文将深入探讨Java对声音处理的支持,包括Applet中的声音播放、Java应用程序中的声音处理以及JavaX中Sound包的...

    浅析《Java程序设计》课程的整体教学设计.pdf

    《Java程序设计》课程的整体教学设计是当前计算机专业教育中一个重要的话题,尤其对于培养学生的实际编程能力、项目开发能力以及解决实际问题的能力具有重要意义。教学设计的核心在于如何提高学生的实践能力和理论...

    Java编写Mapreduce程序过程浅析

    3. **Mapper/Reducer性能调优**:合理设置内存大小、槽位数量、并行度等参数。 通过以上介绍,你应该对Java MapReduce编程有了基本的认识。实际上,这只是冰山一角,更深入的学习还包括理解HDFS的工作原理、容错...

    浅析图论在某地区电网规划中利用及MATLAB程序最优分析.pdf

    浅析图论在某地区电网规划中利用及MATLAB程序最优分析.pdf

    Java中main()方法浅析.docx

    ### Java中main()方法浅析 #### 一、概述 在Java编程语言中,`main()`方法具有特殊的意义,它是所有Java应用程序的起点。当Java虚拟机(JVM)启动并加载了一个包含`main()`方法的类时,它会自动调用这个方法来开始...

    Java中文乱码浅析及解决方案

    Java 中文乱码问题是一个常见的编程困扰,尤其对于处理中文字符的Java程序而言。这个问题通常源于字符编码的不一致,即不同环节采用的字符编码标准不统一。本文将深入探讨这一问题,并提供相应的解决方案。 首先,...

    提高ASP.NET应用程序性能方法浅析

    综上所述,提高ASP.NET应用程序性能涉及多个方面,包括代码优化、资源管理、数据库调优、网络通信优化以及系统架构设计等。通过综合运用这些方法,我们可以打造出运行高效、用户体验良好的ASP.NET Web应用程序。

    浅析Java卡应用执行机制及虚拟机能效优化.pdf

    浅析Java卡应用执行机制及虚拟机能效优化 本文将对Java卡应用执行机制和虚拟机的能效优化进行深入分析。首先,我们将介绍Java卡应用执行机制的基本过程,然后讨论影响Java卡运算能效的因素,并探讨Java卡性能优化的...

    基于Java的Web开发技术浅析.pdf

    - Servlet:Servlet是Java编写的服务器端程序,主要功能是处理客户端的请求,并返回响应。Servlet可以扩展Web服务器的功能,处理HTTP协议以及其他网络协议。Servlet生命周期包括加载、实例化、初始化、服务、销毁几...

    浅析《Java程序设计》的微课设计与实现.zip

    在本压缩包中,主要包含了一份关于“浅析《Java程序设计》的微课设计与实现”的PDF文档,这显然是一份深入探讨如何利用微课技术来教授Java编程的资料。微课是一种短小精悍的教学模式,通常涵盖一个特定的主题或技能...

Global site tag (gtag.js) - Google Analytics