JAVAWEB系统性能调优_第1页
JAVAWEB系统性能调优_第2页
JAVAWEB系统性能调优_第3页
JAVAWEB系统性能调优_第4页
JAVAWEB系统性能调优_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、JAVA WEB系统性能调优V1.0广州合道信息科技有限公司2014年3月 文档信息项目名: 项目编号: 作者: 罗承伟创建日期: 2014-03-21使用者: 标题: Javaweb 系统性能调优方案分类: 部门名称: 研发部版权声明: 文档状态文档状态草稿正式文档评审人员评审组组长:评审组成员: 评审时间 修订文档历史记录日期版本说明作者2014-03-21V1.0初稿罗承伟目录1. 性能调优流程41.1、确定调优目标41.2、测量系统性能51.3、分析性能瓶颈52. JVM性能调优52.1、JVM内存组成及分配62.1.1、JAVA内存组成介绍:堆(Heap)和非堆(Non-heap)内

2、存62.1.2、堆内存分配62.1.3、非堆内存分配72.1.4、JVM内存限制(最大值)82.2、JVM参数详解82.3、参数配置示例143. J2EE应用监控153.1、数据库连接池监控(Druid)153.1.1、Druid连接池配置153.1.2、Druid连接池监控173.2、容器管理及监控(psi-probe)183.2.1、Tomcat下安装部署183.2.2、probe监控界面223.3、JAVA虚拟机监控(Visual VM)253.3.1、VisualVM安装253.3.2、VisualVM简介253.3.3、安装插件263.3.4、监控本地JAVA应用273.3.5、监控

3、远程JAVA应用283.3.6、使用Visual VM查看JVM相关信息313.3.7、使用Visual VM解决内存溢出问题333.3.8、使用Visual VM查看Tomcat的线程状态343.3.8、使用Visual VM查看CPU消耗情况361. 性能调优流程性能调优无疑是个庞大且复杂的话题,也是项目中非常重要的一环。由于性能调优涵盖的面实在是太多了,我们仅看看性能调优过程中常见的一些做法。1.1、确定调优目标性能调优,首先是要确定性能调优的目标是什么,如果现在应用已经满足了需求,就没必要去做性能调优了,毕竟不经过一个系统的过程,其实是无法确定你所做的性能调整是否真的调优了性能,是否没

4、有造成应用中其他的问题,所以确定性能目标是非常重要的,在定义性能目标的时候通常这么定义的呢:1 最大并发数2 Quality of Service 服务的质量,在软件系统方面我们认为主要表现在请求的出错率,系统的load等。3 最长响应时间 对于任何请求所能承受的最大响应时间。4 TPS 每秒需要支持的最大事务数,最典型的指标是:“某页面最高需要支撑每秒3000次 的访问次数”。例如一个web系统,需要定义出来的目标是:并发目标:最高支撑200并发;QoS:出错率须控制在万分之一,系统的load最高只能到达10;TPS:每秒完成3000次请求的处理;最大响应时间:最长允许的响应时间为5秒。至于

5、请求的平均响应时间这些就不在性能调优目标中定义,因为要达到TPS的要求,响应时间是必须要达到一个级别的,而且响应时间随着高并发是会出现劣化的。当然,还可以把性能指标定到更为细节,例如某个方法的TPS在100并发时需要达到多少。在确定好了性能目标后,重要的就是如何来测量系统的性能了。1.2、测量系统性能对于新系统而言,需要评估出其正式运行时的数据量的增长情况;而对于已运行的系统,则需要根据监控获取到系统的运行数据(例如高峰并发数、系统的响应速度情况、系统的load、网络流量、每类请求在总的请求中所占的百分比等)。新系统而言,要评估出具体的性能相对来说稍微好做一点,因为此时系统通常较为单纯,数据量

6、的增长也不可能是一夜之间增长的,因此基本可以按照一种正常的方法在测试环境评估出其正式运行的性能。而对于已运行的系统而言,则较为麻烦,因为通常来讲要在测试环境中模拟正式运行环境基本是不太可能的,因此这个时候通常要采取一些模拟的方法或更高压力的方法来尽量更为准确的评估出系统的性能。在测试系统性能时,通常可采用的方法有:1 单元测试 可借助单元测试来测试某个请求的性能2 压力测试 压力测试无疑是测量系统性能中最常采用的方式,根据定义的性能目标对系统进行压力测试,以确定系统是否满足性能要求,同时也可以根据压力测试的结果来分析系统的瓶颈,进而进行对应的调优,可用于做压力测试的工具还是不少的,像loadr

7、unner、Jmeter等。由于性能测试属于测试团队的工作范畴,就不在这展开去讲了。1.3、分析性能瓶颈根据测量系统性能的结果,多数是可以分析出系统性能瓶颈,同时还可以结合像jvm堆栈、jprofiler、系统日志等来进行进一步的确定,另外也可以根据性能调优人员的经验,例如可以去了解开发人员是否采用了不适合的数据结构等。2. JVM性能调优工作中我们使用开源的J2EE容器较多,一般常用的就是tomcat及jboss,网上对tomcat和jboss进行优化的资料很多,本文仅仅对JVM参数进行讨论。2.1、JVM内存组成及分配2.1.1、JAVA内存组成介绍:堆(Heap)和非堆(Non-heap

8、)内存按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给 自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。组成图l 方法栈&本地方法栈线程创建时产生,方法执行时生成栈帧l 方法区存储类的元数

9、据信息 常量等l 堆Java代码中所有的new操作l native Memory(C heap)Direct Bytebuffer JNI Compile GC2.1.2、堆内存分配JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指 定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。对象的堆内存由称为垃圾回收器的自动内存管理系统回收。组成详解Young Generati

10、on即图中的Eden + From Space + To SpaceEden存放新生的对象Survivor Space有两个,存放每次垃圾回收后存活的对象Old GenerationTenured Generation 即图中的Old Space 主要存放应用程序中生命周期长的存活对象2.1.3、非堆内存分配JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。组成详解Permanent Generation保存虚拟机自己的静态(refective)数据主要存放加载的Class类级别静态对象

11、如class本身,method,field等等permanent generation空间不足会引发full GC(详见HotSpot VM GC种类)Code Cache用于编译和保存本地代码(native code)的内存JVM内部处理或优化2.1.4、JVM内存限制(最大值)JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然 可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统 下为2G-3G),而64bit以上的处理器就不会有限制了。2.2、JVM参数详解参数名称含义默认值 -

12、Xms初始堆大小物理内存的1/64(1GB)默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制.-Xmx最大堆大小物理内存的1/4(K(K), 0. secsFull GC K-10414K(K), 0. secs-XX:+PrintGCDetails 输出形式:GC DefNew: 8614K-781K(9088K), 0. secs K-K(K), 0. secsGC DefNew: 8614K-8614K(9088K), 0. secsTenured: K-10414K(K), 0. secs K-10414K(K), 0.

13、 secs-XX:+PrintGCTimeStamps -XX:+PrintGC:PrintGCTimeStamps 可与-XX:+PrintGC -XX:+PrintGCDetails混合使用输出形式:11.851: GC 98328K-93620K(K), 0. secs-XX:+PrintGCApplicationStoppedTime打印垃圾回收期间程序暂停的时间.可与上面混合使用 输出形式:Total time for which application threads were stopped: 0. seconds-XX:+PrintGCApplicationConcurrent

14、Time打印每次垃圾回收前,程序未中断的执行时间.可与上面混合使用 输出形式:Application time: 0. seconds-XX:+PrintHeapAtGC打印GC前后的详细堆栈信息 -Xloggc:filename把相关日志信息记录到文件以便分析.与上面几个配合使用 -XX:+PrintClassHistogramgarbage collects before printing the histogram. -XX:+PrintTLAB查看TLAB空间的使用情况 XX:+PrintTenuringDistribution查看每次minor GC后新的存活周期的阈值 Desire

15、d survivor size bytes, new threshold 7 (max 15)new threshold 7即标识新的存活周期的阈值为7。2.3、参数配置示例示例参数仅供参考:-server-Xms6000M-Xmx6000M-Xmn500M-XX:PermSize=500M-XX:MaxPermSize=500M-XX:SurvivorRatio=65536-XX:MaxTenuringThreshold=0-Xnoclassgc-XX:+DisableExplicitGC-XX:+UseParNewGC-XX:+UseConcMarkSweepGC-XX:+UseCMSCo

16、mpactAtFullCollection-XX:CMSFullGCsBeforeCompaction=0-XX:+CMSClassUnloadingEnabled-XX:-CMSParallelRemarkEnabled-XX:CMSInitiatingOccupancyFraction=90-XX:SoftRefLRUPolicyMSPerMB=0-XX:+PrintClassHistogram-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-XX:+PrintHeapAtGC说明: -XX:SurvivorRatio=65536 -XX:MaxTenur

17、ingThreshold=0就是去掉了救助空间; -Xnoclassgc禁用类垃圾回收,性能会高一点; -XX:+DisableExplicitGC禁止System.gc(),免得程序员误调用gc方法影响性能; -XX:+UseParNewGC,对年轻代采用多线程并行回收,这样收得快; 带CMS参数的都是和并发回收相关的,不明白的可以查看上面的参数详解或上网搜索。 CMSInitiatingOccupancyFraction,这个参数设置有很大技巧,基本上满足(Xmx-Xmn)*(100-CMSInitiatingOccupancyFraction)/100=Xmn就不会出现promotion

18、 failed。在我的应用中Xmx是6000,Xmn是500,那么Xmx-Xmn是5500兆,也就是年老代有5500兆,CMSInitiatingOccupancyFraction=90说明年老代到90%满的时候开始执行对年老代的并发垃圾回收(CMS),这时还剩10%的空间是5500*10%=550兆,所以即使Xmn(也就是年轻代共500兆)里所有对象都搬到年老代里,550兆的空间也足够了,所以只要满足上面的公式,就不会出现垃圾回收时的promotion failed;3. J2EE应用监控J2EE应用在运行过程中,我们可以通过多种监控手段来对应用进行监控,监控的内容包括数据库资源的访问,CP

19、U占用,内存占用,运行状态。通过对容器及应用的监控,找出性能瓶颈,提高应用的性能。3.1、数据库连接池监控(Druid)应用系统性能出现问题,首先考虑进行排查的就是数据调用的性能问题,是否存在性能较差的查询,是否表结构设计需要进行优化,是否加载了过多的数据,占用了I/O及带宽。公司JAVA平台采用了阿里巴巴的开源数据库连接池,能够对数据库的访问及操作提供实时的监控及分析。3.1.1、Druid连接池配置v 下载Druid1、 下载jar包maven central repository:/maven2/com/alibaba/druid/alibaba

20、 maven repository:/mvn/releases/com/alibaba/druid/2、 或配置Maven依赖,在Maven配置文件pom.xml中添加依赖v 开启Druid内置监控页面Druid内置提供了一个StatViewServlet用于展示Druid的统计信息。这个StatViewServlet的用途包括:l 提供监控信息展示的html页面l 提供监控信息的JSON API注意:使用StatViewServlet,建议使用druid 0.2.6以上版本。1、 配置web.xml根据配置中的url-pattern来访问内

21、置监控页面,如果是上面的配置,内置监控页面的首页是/druid/index.html例如:http:/localhost:8080/druid/index.html 2、 配置allow和denyStatViewSerlvet展示出来的监控信息比较敏感,是系统运行的内部情况,如果你需要做访问控制,可以配置allow和deny这两个参数。比如:判断规则v deny优先于allow,如果在deny列表中,就算在allow列表中,也会被拒绝。v 如果allow没有配置或者为空,则允许所有访问。3.1.2、Druid连接池监控若要开启更多监控,请参见Druid官方文档:https:/github.co

22、m/alibaba/druid/wikiDruid监控界面截图:首页数据源SQL监控3.2、容器管理及监控(psi-probe)PSI Probe 是一个 Lambda Probe 的后续版本,主要是为了替换 Tomcat 自带的管理器,可方便的管理和监控 Tomcat及Jboss 实例(Jboss不支持7以上版本)。3.2.1、Tomcat下安装部署1. 下载地址/p/psi-probe/downloads/list2. 安装1 解压,将probe.war放进webapps目录。2 修改CATALINA_HOME/conf/tomcat-users.

23、xml增加probe角色及人员,以Tomcat7为例:3 其他配置如果要查看System Information,Linux版本:catalina.sh中加入如下语句:JAVA_OPTS=$JAVA_OPTS -Dcom.sun.management.jmxremotewindows版本:catalina.bat中加入:SET JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote4 访问监控应用例如:http:/localhost:8080/probe3. 权限控制probe有 probeuser、poweruser、poweruserplu

24、s、manager(针对不同tomcat版本)等角色,对应可操作的功能如下表:特别注意一点:表格里面的X表示拥有权限,也就是说,manager的权限是最大的,什么都能操作。在实际的生产运维过程中,运维人员可以创建具有manager操作权限的账号,用于应用的部署及服务的维护相关操作。而为了方便项目组开发人员对本项目的维护和操作,可以开放权限较小的账号,便于跟踪应用的运行状态,下载分析错误日志及操作日志。Features by RoleprobeuserpoweruserpoweruserplusmanagerContext: listXXXXContext: statusXXXXContext:

25、 view servletsXXXXContext: view servlet mappingsXXXXContext: view filtersXXXXContext: view filter mappingsXXXXContext: list attributesXXXXContext: remove attributesXXXContext: startXXXContext: stopXXXContext: view web.xmlXXXContext: view context.xmlXContext: deployXContext: undeployXSession: listXXX

26、XSession: list attributesXXXXSession: search attributesXXXXSession: remove attributesXXXSession: view last-accessed IPXXXXSession: expire singleXXXSession: expire multipleXXXJSP: listXXXJSP: view sourceXXXJSP: view servlet sourceXXXJSP: compile singleXXXJSP: compile multipleXXXJSP: compile all on de

27、ploymentXJSP: discard all compiledXData Source: listXXXXData Source: group by JDBC URLXXXXData Source: statusXXXXData Source: resetXXXData Source: testXXData Source: view query historyXXData Source: execute SQLXXLog: listXXXXLog: tail in real-timeXXXXLog: downloadXXXXLog: change levelXThread: listXX

28、XXThread: list poolsXXXXThread: view execution stackXXXThread: killXConnector: statusXXXXConnector: real-time usage chartsXXXXCluster: statusXXXXCluster: real-time traffic chartsXXXXJVM: real-time memory usage chartsXXXXJVM: statusXXXXJVM: advise GCXJava Service Wrapper: statusXXXXJava Service Wrapp

29、er: restart JVMXSystem: overviewXXXXSystem: propertiesXXXXSystem: OS detailsXQuick Check: executeX3.2.2、probe监控界面应用程序(可以启动/停止/卸载应用)应用发布(发布应用)日志(可以在线查看,下载日志)日志(动态调整日志级别)线程监控系统信息运行监控运行监控3.3、JAVA虚拟机监控(Visual VM)VisualVM 提供在 Java 虚拟机 (Java Virutal Machine, JVM) 上运行的Java 应用程序的详细信息。在 VisualVM 的图形用户界面中,您可以

30、方便、快 捷地查看多个Java 应用程序的相关信息。 (摘自官方) 简单说来,VisualVM 是一种集成了多个JDK 命令行工具的可视化工具,它能为您提供强大的分析能力。所有这些都是免费的!它囊括的命令行工具包括 jstat, JConsole, jstack, jmap 和 jinfo,这些工具与JDK 的标准版本是一致的。 可以使用VisualVM 生成和分析海量数据、跟踪内存泄漏、监控垃圾回收器、执行内存和CPU 分析,同时它还支持在MBeans 上进行浏览和操作。尽管VisualVM 自身要在JDK6 这个版本上运行,但是JDK1.4 以上版本的程序它都能监控。 3.3.1、Visu

31、alVM安装VisualVM 的一个最大好处就是,它已经在你的JDK bin目录里了,只要你使 用的是JDK1.6 Update7 之后的版本。点击一下jvisualvm.exe 图标它就可以运行了。 这里是VisualVM 的官方网站:,资料很全,同时提供VisualVM 最近版本下载。3.3.2、VisualVM简介Visual VM 启动成功!可以看到Visual VM 的界面了。通过Visual VM 可以看到本机运行中的所有Java 应用。你会发现根本不需要在VisualVM 里为Java应用程序注册,它们就会自动显示出来。甚至

32、还可以在导航栏里查看到远程的Java应用。导航栏即为Applications,其中分为Local(本地Java 应用)和Remote(远程的Java 应用)。 3.3.3、安装插件Visual VM 有很多好用的插件;而且Sun 为了推广Visual VM,还举办的Visual VM 插件开发大赛。如何安装插件呢?步骤如下:1 点击 工具 - 插件2 推荐安装全部插件(本演示已经安装,所以仅显示已安装,可用插件为空)3.3.4、监控本地JAVA应用Visual VM 本身就是一个Java 应用,所以打开Visual VM看到的第一个可监控应用就是Visual VM 本身;可以用它热热身,小试下

33、牛刀。在Visual VM可视化界面中可以监控到Visual VM 本身的内存使用情况、线程情况、Jvm 启动参数、cpu 消耗情况、垃圾回收情况等很多参数。当然如果在本地启一个Tomcat一样可以看到这些参数,可以方便我们在本地对JVM 进行调优。3.3.5、监控远程JAVA应用监视远程Java 应用稍微复杂些。Visual VM是通过JMX 来和远程Java 应用联系的。 JMX:Java Management Extensions,即Java 管理扩展,是一个为应用程序、设备、系统等植入管理功能的框架。JMX 可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成

34、的系统、网络和服务管理应用。 下面以4 上的tomcat 7为例,叙述下监视远程Java 应用的步骤 如下:1 为4上的tomcat 配置jvm 启动参数。在tomcat 中找到catalina.sh 文件,在该文件的这一行# - Execute The Requested Command -上面添加以下内容:CATALINA_OPTS=$CATALINA_OPTS -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=4 -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=fa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论