Tomcat性能监视和调优研究
作者:孙仁鹏,何淼
来源:《软件导刊》2012年第12
        摘要:为使Tomcat能更好地服务大量的并发请求,提出了不断地进行性能监视、调优、再监视、再调优,直至系统的各个环节达到相对平衡的思路。可以使用测试工具查看测试结果、监视工具监视服务器端状态,结合服务器硬件以及操作系统和Web 程序对资源的需求,从堆、栈、线程池、连接池等多方面进行整体调整。实验结果表明,该方法可以有效提高Tomcat的性能。
        关键词:Tomcat;性能监视;系统调优;测试工具;监视工具
        中图分类号:TP302.7文献标识码:A文章编号:1672-78002012012-0026-02
        0引言
        Tomcat是目前比较流行的Web 应用服务器,最新的Servlet JSP 规范总能在其中得到体现,深受Java 爱好者的喜爱并得到了部分软件开发商的认可。Tomcat在默认配置情况下,性
能难以充分发挥。为了提高处理 HTTP请求的并发能力,应用在生产环境中,需要对Tomcat进行性能监视和调优。
        1Tomcat性能监视
        为了进行性能调优,首先要进行性能监视,出生产环境下Tomcat的各种参数配置效果,确定性能瓶颈,调整资源的分配,提高并发量。
        1.1性能监视思路
        可以通过发送大量HTTP的请求来模拟多用户对Tomcat的并发访问,使其承受不切实际数量的负荷,获得错误的情况。也许是Web服务器拒绝连接、或是Java虚拟机耗光内存、或是数据库连接失败、或是其它方面错误,从而定位系统瓶颈。要选择资源消耗大的代码执行路径,比如有复杂的业务处理、频繁数据库的交互、大量数据的传递、文件的读写等,逐步增加并发访问量,监视Tomcat的状态,查看实际被处理请求的线程并发数、堆栈内存使用情况、数据库连接是否正常等。
        1.2性能监视工具
        JMeterApache组织开发的一个用于压力测试和性能测量工具,可用于对服务器、网络或对象等模拟繁重的负载来测试它们的强度或分析不同压力类型下的整体性能,有助于性能的调整。为了方便,本文中把数据库服务器、Tomcat6JMeter等安装在一台操作系统为XP的电脑上,虽然不同的软硬件环境测试的数据结果会有大的差异,但不影响测试效果。
        1.3实施步骤
        1)建立测试计划。使用JMeter添加线程组、添加取样器、添加监视器,测试结果如图1
        1性能测试结果图2manager工具监视Tomcat运行
        2)性能监视。利用Tomcat自带的Manager控制台进行性能监视,查看JVM参数、处理http请求线程数等情况,如图2。说明默认状态下,TomcatJVM 最大值为64M,可以并发处理的最大线程数为40
        3)增加负载测试。增加请求线程数为600,在JMeterSummary Report中发现Error%4.02%,表明服务器端已经来不及处理所有请求,丢弃了4.02%http请求。通过T
omcat监视器查看,发现并发的请求数已达到最大的数值40,堆内存也几乎使用完。既然有请求的丢弃,说明实际并发的请求数已经超过了能承受的Max threads数。
        急剧增加并发的请求数,将线程数增加为6 000JMeterTomcat的控制台分别出现了错误,Summary Report的错误率急剧上升到100%JMeter控制台错误说明其所需的栈空间已经严重不足,大量并发的请求需要多个线程栈。Tomcat控制台错误说明服务器运行所需的JVM堆内存已经严重不足,最终拖垮Tomcat。错误提示主要有以下几种:
        错误提示一:uncaught Exception java.lang.OutofMemoryErrorunable to create new native thread.
        原因:操作系统没有足够的内存资源来产生线程,需要开辟的栈空间不够。
        解决方法:相应增加线程默认的总栈空间大小,以便能生产更多的线程。
        错误提示二:java.lang.OutOfMemoryError Java heap space.
        原因:JVM可使用的堆内存不够分配。在大量并发请求时,实际需要的内存超出堆的最
大值时,虚拟机就会提示内存溢出,严重时会导致应用服务崩溃。 解决办法:相应增加JVM可使用的堆内存。
        错误提示三:java.lang.OutOfMemoryError PermGen space.
        原因:JVM可使用的PermGen内存不够分配,该内存是永久保存区域,主要JVM用于存放ClassMeta信息。
        解决方法:相应增加可使用的永久存储区内存。
        2Tomcat性能优化
        性能优化需要逐步调整各方面参数,不断查看测试效果,使软硬件整体性能充分发挥,达到整体最优。
        2.1JVM参数调优
        JVM 参数的调整需要结合操作系统和Web 程序对内存的实际使用情况,在堆、栈和永久存储区之间合理分配,使它们协调。可以在startup.bat文件头中试探性修改,如下:
        set CATALINA_OPTS=-Xms512m -Xmx1 024m –Xss128k
        -XXPermSize=16m -XXMaxPermSize=32m
        使用同样的sample进行测试,发现JmeterTomcat端不再报异常了,只是Error%错误率比较大,测试结果如图3,监视结果如图4。同时还使用指令jstat查看PermGen永久保存区的分配情况以及JDK自带的jconsole监视服务器整体状态。结果表明调整JVM参数起到了效果,堆的大小对性能影响较大,但服务HTTP请求的线程数量不够。
        2.2调整线程池
        服务器来不及响应大量并发请求,会丢弃部分请求,需要修改连接器的并发线程数。在l jvm调优参数的http连接器节点下配置maxThreads="800",发现请求的丢失比调整前相比少很多,即Error%的值变小了,如图5和图6,表明提高线程池的并发量起效果了。
        2.3调整数据库连接池
        如果数据库连接池的最大连接数严重不足,也会产生“Cannot get a connection”错误。
每个线程都可能要访问数据库,调整好JVM的参数和连接器的并发数,还需适当增大数据库连接池的并发数。由原来的maxActive="40"变为maxActive="100",发现错误率降为8.90%,表明数据库连接池参数的调整,对性能也有着重要的作用。但是如果过多地增加maxActive的值,比如为800,和线程池的maxThreads值一致,发现错误率反而上升了。因为与数据库交互时,速度受磁盘转速物理条件的限制,比在内存中创建线程的速度要慢,所以如果数据库连接池容量设置过大,会导致磁盘来不及响应服务连接的请求,操作系统所需内存的资源也会相应增加,反而会降低系统整体的性能。
        3结语
        Tomcat的性能调优需要结合服务器硬件、操作系统和Web 程序对资源的需求,从堆、栈、线程池、连接池等多方面进行调整,需要不断地测试,才能到合理的参数配置。使用测试工具查看测试结果,监视工具监视服务器端状态,分配的各种参数要协调,使各个环节相对平衡,这样才能发挥整体性能,提高并发量。比如,虽然堆内存中存放着JAVA对象,需要较多的空间,但是如果单方面将堆内存设置过大,反而会使Tomcat的运行变慢,因为操作系统会缺乏必要的内存资源,其它参数对应的功能所需的资源也得不到满足,过度的堆内存
反而会白白浪费掉,线程池、连接池等的设置也是同样的道理。还可以精简配置,释放不必要的资源和功能,比如关闭AJP ConnectorDNS查询等。
        参考文献:
        [1]李萍.浅谈TOMCAT之性能优化[J].科技情报开发与经济,201112.
        [2]赵岗耀.Lambda Probe监控Tomcat实例的内存使用[J].软件导刊,20093.
        [3]高张,康小军.提高Tomcat服务器运行性能的研究[J].计算机与数字工程,2008.
        [4]JASON BRITTAINIAN F DARWIN.Tomcat权威指南[M].2.北京:中国电力出版社,2009.
        [5]VIVEK CHOPRASING LI. Apache Tomcat高级编程[M].北京:人民邮电出版社,2009.
        (责任编辑:杜能钢)
        Tomcat Performance Monitoring and Tuning
        AbstractIn order to make the Tomcat to better serve the large number of concurrent requests continuous performance monitoring tuning and then monitor the re-tuning until all aspects of the system to achieve a relatively balanced ideas. Testing tools you can use to view the test results and monitoring tools to monitor server-side state combined with server hardware operating systems and web applications the demand for resources from the heap stack thread pool connection pool and other aspects of the overall adjustment. The experimental results show that can effectively improve the performance of Tomcat.