Tomcat调优指南 收藏 下载本文

Tomcat调优指南 收藏

Tomcat调优指南1概述本文档主要介绍了Tomcat的性能调优的原理和方法。可作为公司技术人员为客户Tomcat系统调优的技术指南,也可以提供给客户的技术人员作为他们性能调优的指导手册。2调优分类由于Tomcat的运行依赖于JVM,从虚拟机的角度我们把Tomcat的调整分为外部环境调优和自身调优两类来描述。2.1外部环境调优调整Tomcat运行环境的操作系统参数和运行Tomcat的java虚拟机参数。2.1.1 JAVA虚拟机性能优化Tomcat需要依赖Java虚拟机运行。根据客户选用的主机的操作系统选择对应的JDK的版本。无论哪个厂商的JDK,都建议使用最新的版本。虚拟机可通过命令行的方式改变虚拟机使用内存的大小。如下表所示有两个参数用来设置虚拟机使用内存的大小。参数描述-Xms size JVM初始化堆的大小-Xmx size JVM堆的最大值Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大。[LD1]Windows下,在文件tomcat_home/bin/catalina.bat,Unix下,在文件tomcat_home/bin/catalina.sh的前面,增加如下设置:JAVA_OPTS='-Xms【初始化内存大小】-Xmx【可以使用的最大内存】''需要把这个两个参数值调大。例如:JAVA_OPTS='-Xms256m-Xmx512m'表示初始化内存为256MB,可以使用的最大内存为512MB。另外需要考虑的是Java提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾可以接受的速度与应用有关,应该通过分析实际的垃圾收集的时间和频率来调整。如果堆的空间很大,那么完全垃圾收集(FULL GC)就会很慢,但是频度会降低。如果在客户系统中把堆的大小和内存的需要一致,完全收集就很快,但是会更加频繁。调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。对于SUN和HP等虚拟机,推荐将最小堆大小和最大堆大小设置为同一值,因为这样可以避免浪费用于时常调整堆大小所需的VM资源。当然,客户系统如果用到IBM虚拟机,要特别的注意设置-Xms和-Xmx一样大小会耽误垃圾回收的开始直到堆满,这样第一次垃圾回收就会变成非常昂贵的操作。推荐把-Xms设置为应用所需的最小值,这样会产生高效的垃圾回收。2.1.2操作系统性能优化以客户系统为HP-UX为例。HP系统中对Tomcat有影响的参数:其中:max_thread_proc:一个进程所能创建的线程的最大数nkthread:在系统上同时允许的核心线程的最大数maxfiles上表给的建议是不

是不合适?如果在输出里看到消息:java.lang.OutOfMemoryError:unable to create new native thread,则说明名为max_thread_proc的Unix内核设置过小。max_thread_proc是单个进程中的最大线程数。它必须大到能够容纳Java应用程序中的所有线程以及虚拟机本身中的部分额外线程。查看核心参数:$ulimit-a显示[LD2]输出中的nofiles是指用户的进程能同时打开的最大文件句柄数。如果日志中出现\的异常,需要重点检查这个参数。coredump参数是core文件最大值的,限制当进程coredump时将产生core文件的大小不能超过这个最大值。如果在日志文件检查时,发现core文件不完整,需要增大这个参数值。执行ulimit-n命令可以设置nofiles参数,执行ulimit-c命令设置core文件最大值。如果是在Windows操作系统上使用Tomcat,那么最好选择服务器版本。因为在非服务器版本上,最终用户授权数或者操作系统本身所能承受的用户数、可用的网络连接数或其它方面的一些方面都是有限制的。并且基于安全性的考虑,必须经常给操作系统打上最新的补丁。2.1.3 Tomcat与其它web服务器整合使用虽然tomcat也可以作web服务器,但其处理静态html的速度比不上apache,且其作为web服务器的功能远不如apache,因此我们想把apache和tomcat集成起来,将html与jsp的功能部分进行明确分工,让tomcat只处理jsp部分,其它的由apache,IIS等这些web服务器处理,由此大大节省了tomcat有限的工作线程[LD3]。2.2自身调优本节将说明Tomcat性能调优的技巧和方法,这些技巧和方法与操作系统或Java虚拟机的种类无关。以下方法都是针对Tomcat性能自身调整的最佳方式。2.2.1禁用DNS查询当web应用程序要记录客户端的信息时,它也会记录客户端的IP地址或者通过域名服务器查找机器名转换为IP地址。DNS查询需要占用网络,并且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的IP的过程,这样会消耗一定的时间。为了消除DNS查询对性能的影响我们可以关闭DNS查询,方式是修改server.xml文件中的enableLookups参数值:不同的tomcat版本稍有不同。Tomcat4 Connector

className=\essors=\cceptCount=\k=\

port=\leLookups=\

ionTimeout=\除非客户需要连接到站点的每个HTTP客户端的机器名,否则我们建议在生产环境上关闭DNS查询功能。可以通过Tomcat以外的方式来获取机器名。这样不仅节省了网络带宽、查询时间和内存,而且更小的流量会使日志数据也会变得更少,显而易见也节省了硬盘空间。对流量较小的站点来说禁用DNS查询可能没有大流量站点的效果明显。2.2.2调整线程数另外一个可通过应用程序的连接器(Connector)进行性能控制的参数是创建的处理请求的线程数。Tomcat使用线程池加速响应速度来处理请求。在Java中线程是程序运行时的路径,是在一个程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮助程序员写出CPU最大利用率的高效程序,使空闲时间保持最低,从而接受更多的请求。Tomcat4中可以通过修改minProcessors和maxProcessors的值来控制线程数。这些值在安装后就已经设定为默认值并且是足够使用的,但是随着站点的扩容而改大这些值。minProcessors服务器启动时创建的处理请求的线程数应该足够处理一个小量的负载。也就是说,如果一天内每秒仅发生5次单击事件,并且每个请求任务处理需要1秒钟,那么预先设置线程数为5就足够了。但在你的站点访问量较大时就需要设置更大的线程数,指定为参数maxProcessors的值。maxProcessors的值也是有上限的,应防止流量不可控制(或者恶意的服务攻击),从而导致超出了虚拟机使用内存的大小。如果要加大并发连接数,应同时加大这两个参数。web server允许的最大连接数还受制于操作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右。在Tomcat5对这些参数进行了调整,请看下表:属性名描述maxThreads Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。

acceptCount指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。connnectionTimeout网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。minSpareThreads Tomcat初始化时创建的线程数。maxSpareThreads一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。最好的方式是多设置几次并且进行测试,观察响应时间和内存使用情况。在不同的机器、操作系统或虚拟机组合的情况下可能会不同,而且并不是所有的web站点的流量都是一样的,因此没有一刀切的方案来确定线程数的值。2.2.3加速JSP编译速度当第一次访问一个JSP文件时,它会被转换为Java servlet源码,接着被编译成Java字节码。客户工程师可以控制使用哪