本文档主要介绍了Tomcat的性能调优的原理和方法。可做为公司技术人员为客户Tomcat系统调优的技术指南,也能够提供给客户的技术人员做为他们性能调优的指导手册。html
因为Tomcat的运行依赖于JVM,从虚拟机的角度咱们把Tomcat的调整分为外部环境调优和自身调优两类来描述。前端
调整Tomcat运行环境的操做系统参数和运行Tomcat的java虚拟机参数。java
Tomcat须要依赖Java虚拟机运行。根据客户选用的主机的操做系统选择对应的 JDK的版本。不管哪一个厂商的JDK,都建议使用最新的版本。linux
虚拟机可经过命令行的方式改变虚拟机使用内存的大小。以下表所示有两个参数用来设置虚拟机使用内存的大小。程序员
参数web |
描述数据库 |
-Xms<size>apache |
JVM初始化堆的大小编程 |
-Xmx<size>windows |
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设置为应用所需的最小值,这样会产生高效的垃圾回收。
以客户系统为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 是指用户的进程能同时打开的最大文件句柄数。若是日志中出现”two many open files”的异常,须要重点检查这个参数。coredump 参数是 core 文件最大值的,限制当进程 coredump 时将产生 core文件的大小不能超过这个最大值。若是在日志文件检查时,发现 core文件不完整,须要增大这个参数值。执行 ulimit -n 命令能够设置 nofiles 参数,执行ulimit -c命令设置 core 文件最大值。
若是是在Windows操做系统上使用Tomcat,那么最好选择服务器版本。由于在非服务器版本上,最终用户受权数或者操做系统自己所能承受的用户数、可用的网络链接数或其它方面的一些方面都是有限制的。而且基于安全性的考虑,必须常常给操做系统打上最新的补丁。
虽然tomcat也能够做web服务器,但其处理静态html的速度比不上apache,且其做为web服务器的功能远不如apache,所以咱们想把 apache和tomcat集成起来,将html与jsp的功能部分进行明确分工,让tomcat只处理jsp部分,其它的由apache,IIS等这些 web服务器处理,由此大大节省了tomcat有限的工做线程[LD3] 。
本节将说明Tomcat性能调优的技巧和方法,这些技巧和方法与操做系统或Java虚拟机的种类无关。如下方法都是针对Tomcat 性能自身调整的最佳方式。
当web应用程序要记录客户端的信息时,它也会记录客户端的IP地址或者经过域名服务器查找机器名转换为IP地址。DNS查询须要占用网络,而且包括可能从不少很远的服务器或者不起做用的服务器上去获取对应的IP的过程,这样会消耗必定的时间。为了消除DNS查询对性能的影响咱们能够关闭DNS查询,方式是修改server.xml 文件中的enableLookups参数值:
不一样的tomcat版本稍有不一样。
Tomcat4
<Connector className=“org.apache.coyote.tomcat4.CoyoteConnector”port=“80” minProcessors=“5” maxProcessors=“75” enableLookups=“false” redirectPort=“8443” acceptCount=“100” debug=“0” connectionTimeout=“20000” useURIValidationHack=“false” disableUploadTimeout=“true” />
Tomcat5
<Connector port=“80” maxThreads=“150” minSpareThreads=“25” maxSpareThreads=“75” enableLookups=“false” redirectPort=“8443” acceptCount=“100” debug=“0” connectionTimeout=“20000” disableUploadTimeout=“true”/>
除非客户须要链接到站点的每一个HTTP客户端的机器名,不然咱们建议在生产环境上关闭DNS查询功能。能够经过Tomcat之外的方式来获取机器名。这样不只节省了网络带宽、查询时间和内存,并且更小的流量会使日志数据也会变得更少,显而易见也节省了硬盘空间。对流量较小的站点来讲禁用DNS查询可能没有大流量站点的效果明显。
另一个可经过应用程序的链接器(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站点的流量都是同样的,所以没有一刀切的方案来肯定线程数的值。
当第一次访问一个JSP文件时,它会被转换为Java servlet源码,接着被编译成Java字节码。客户工程师能够控制使用哪一个编译器,默认状况下,Tomcat使用命令行javac进行使用的编译器。也可使用更快的编译器,这里将介绍如何优化它们。
[LD4] 另一种方法是不要把全部的实现都使用JSP页面,而是使用一些不一样的java模板引擎变量。
在Tomcat 4.0中可使用流行并且免费的Jikes编译器。Jikes编译器的速度要高于Sun的Java编译器。首先要安装Jikes(可访问http://oss.software.ibm.com/pub/jikes 得到更多的信息),接着须要在环境变量中设置JIKESPATH包含系统运行时所需的JAR文件。装好Jikes之后还须要设置让JSP编译servlet使用Jikes,须要修改web.xml文件中jspCompilerPlugin的值:
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>
org.apache.jasper.servlet.JspServlet
</servlet-class>
<init-param>
<param-name>logVerbosityLevel</param-name>
<param-value>WARNING</param-value>
</init-param>
<init-param>
<param-name>jspCompilerPlugin</param-name>
<param-value>org.apache.jasper.compiler.JikesJavaCompiler</param-value>
</init-param>
<init-param>
<!-- <param-name>org.apache.catalina.jsp_classpath</param-name> -->
<param-name>classpath</param-name>
<param-value>
/usr/local/jdk1.3.1-linux/jre/lib/rt.jar:
/usr/local/lib/java/servletapi/servlet.jar
</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
在Tomcat 4.1(或更高版本),JSP的编译由包含在Tomcat里面的Ant程序控制器直接执行。客户开发人员须要在元素中定义一个名字叫”compiler”,而且在value中有一个支持编译的编译器名字,示例以下:
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>
org.apache.jasper.servlet.JspServlet
</servlet-class>
<init-param>
<param-name>logVerbosityLevel</param-name>
<param-value>WARNING</param-value>
</init-param>
<init-param>
<param-name>compiler</param-name>
<param-value>jikes</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet[LD5] >
Ant可用的编译器
名称 |
别名 |
调用的编译器 |
classic |
javac1.1, javac1.2 |
Standard JDK 1.1/1.2 compiler |
modern |
javac1.3, javac1.4 |
Standard JDK 1.3/1.4 compiler |
jikes |
|
The Jikes compiler |
JVC |
Microsoft |
Microsoft command-line compiler from the Microsoft SDK for Java/Visual J++ |
KJC |
|
The kopi compiler |
GCJ |
|
The gcj compiler (included as part of gcc) |
SJ |
Symantec |
Symantec's Java compiler |
extJavac |
|
Runs either the modern or classic compiler in a JVM of its own |
因为JSP页面在第一次使用时已经被编译,那么你可能但愿在更新新的jsp页面后立刻对它进行编译。实际上,这个过程彻底能够自动化,由于能够确认的是新的JSP页面在生产服务器和在测试服务器上的运行效果是同样的。
在Tomcat4的bin目录下有一个名为jspc的脚本。它仅仅是运行翻译阶段,而不是编译阶段,使用它能够在当前目录生成Java源文件。它是调试JSP页面的一种有力的手段。
能够经过浏览器访问再确认一下编译的结果。这样就确保了文件被转换成servlet,被编译了可直接执行。这样也准确地模仿了真实用户访问JSP页面,能够看到给用户提供的功能。也抓紧这最后一刻修改出现的bug而且修改它。
Tomcat提供了一种经过请求来编译JSP页面的功能。客户能够在浏览器地址栏中输入http://localhost: 8080/examples/jsp/dates/date.jsp?jsp_precompile=true,这样Tomcat就会编译 data.jsp而不是执行它。此举唾手可得,不失为一种检验页面正确性的捷径。
NIO (No-blocking I/O)从JDK 1.4起,NIO API做为一个基于缓冲区,并能提供非阻塞I/O操做的API被引入[LD6] 。
TOMCAT能够支持高并发的企业级应用。其中有个很大的缘由就是,配置良好的tomcat都会使用APR(Apache Portable Runtime),APR是Apache HTTP Server2.x的核心,它是高度可移植的本地库,它使用高性能的UXIN I/O操做,低性能的java io操做,可是APR对客户开发人员而言可能稍稍有点难度,在不少OS平台上,可能须要从新编译APR。可是从Tomcat6.0之后, 客户开发人员很容易就能够用NIO的技术来提高tomcat的并发处理能力。可是为何NIO能够提高tomcat的并发处理能力呢,咱们先来看一下java 传统io与 java NIO的差异。
Java 传统的IO操做都是阻塞式的(blocking I/O), 若是有socket的编程基础,你会接触过堵塞socket和非堵塞socket,堵塞socket就是在accept、read、write等IO操做的时候,若是没有可用符合条件的资源,不立刻返回,一直等待直到有资源为止。而非堵塞socket则是在执行select的时候,当没有资源的时候堵塞,当有符合资源的时候,返回一个信号,而后程序就能够执行accept、read、write等操做,通常来讲,若是使用堵塞socket,一般咱们一般开一个线程accept socket,当读完此次socket请求的时候,开一个单独的线程处理这个socket请求;若是使用非堵塞socket,一般是只有一个线程,一开始是select状,当有信号的时候能够经过多路复用(Multiplexing)技术传递给一个指定的线程池来处理请求,而后原来的线程继续select状态。 最简单的多路复用技术能够经过java管道(Pipe)来实现。换句话说,若是客户端的并发请求很大的时候,客户系统可使用少于客户端并发请求的线程数来处理这些请求,而这些来不及当即处理的请求会被阻塞在java管道或者队列里面,等待线程池的处理。
在web服务器上阻塞IO(BIO)与NIO一个比较重要的不一样是,客户系统使用BIO的时候每每会为每个web请求引入多线程,每一个web请求一个单独的线程,因此并发量一旦上去了,线程数就上去了,CPU就忙着线程切换,因此BIO不合适高吞吐量、高可伸缩的web服务器;而NIO则是使用单线程(单个CPU)或者只使用少许的多线程(多CPU)来接受Socket,而由线程池来处理堵塞在pipe或者队列里的请求.这样的话,只要OS能够接受TCP的链接,web服务器就能够处理该请求。大大提升了web服务器的可伸缩性。
客户只须要在server.xml里把 HTTP Connector作以下更改,
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
改成
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443" />
而后启动服务器,若是出现org.apache.coyote.http11.Http11NioProtocol start的提示信息,表示NIO已经启动。其余的配置请参考官方配置文档。
前面咱们提到过操做系统经过一些限制手段来防止恶意的服务攻击,一样Tomcat也提供了防止恶意攻击或禁止某些机器访问的设置。
Tomcat提供了两个参数供你配置:RemoteHostValve 和RemoteAddrValve。
经过配置这两个参数,可让你过滤来自请求的主机或IP地址,并容许或拒绝哪些主机/IP。与之相似的,在Apache的httpd文件里有对每一个目录的容许/拒绝指定。
例如你能够把Admin Web application设置成只容许本地访问,设置以下:
<Context path=“/path/to/secret_files” >
<Valve className=“org.apache.catalina.valves.RemoteAddrValve”
allow=“127.0.0.1”deny=““/>
</Context>
若是没有给出容许主机的指定,那么与拒绝主机匹配的主机就会被拒绝,除此以外的都是容许的。与之相似,若是没有给出拒绝主机的指定,那么与容许主机匹配的主机就会被容许,除此以外的都是拒绝的。
在负载均衡的思路下,多台服务器为对等方式,每台服务器都具备同等的地位,能够单独对外提供服务而无须其余服务器的辅助。经过负载分担技术,将外部发送来的请求按必定规则分配到对称结构中的某一台服务器上,而接收到请求的服务器都独立回应客户机的请求。
提供服务的一组服务器组成了一个应用服务器集群(cluster),集群下的对等多机环境能够增长系统的并发处理能力,和单台机器出现故障系统的错误冗余能力;同时实现了负载均衡和系统高可靠性。
四种实现负载均衡的方式:
第一是经过DNS,但只能实现简单的轮流分配,不能处理故障;
第二若是是基于MS IIS,Windows 2003 server自己就带了负载均衡服务;
第三是硬件方式,经过交换机的功能或专门的负载均衡设备能够实现;
第四种是软件方式,经过一台负载均衡服务器进行,上面安装软件。使用Apache Httpd Server作负载平衡器。
客户系统通常采用Apache httpd做为web服务器,即做为Tomcat的前端处理器,根据具体状况而定,有些状况下是不须要Apache httpd做为 web 服务器的,如系统展示没有静态页面那就不须要Apache httpd,那时能够直接使用Tomcat做为web 服务器来使用。使用Apache httpd主要是它在处理静态页面方面的能力比Tomcat强多了。以下图:
在apache下配置负载均衡器分为三步,注意每次修改httpd.conf和workers2.properties时不要忘了从新启动apache。
第一步,安装和调试apache
负载均衡器jk2模块是apache www 服务的插件,因此配置负载均衡器就得先安装apache。假设客户下载的是windows版本 2.0.43,执行setup.exe并回答一些简单问题就可完成apache的任务。值得注意的是,安装并启动apache后若是apache对http://localhost/ 地址没反应,你得修改apache安装路径下htdocs目录下的index.html.xx文件,好比把index.html.en改为index.html。
第二步,安装jk2
把下载到的 mod_jk2-2.0.43.dll改为mod_jk2.dll 放到apache的modules目录下,修改apache的httpd.conf,即在LoadModule foo_module modules/mod_foo.so 行下插入mod_jk2模块的装载信息[LD7] :
# Example: # LoadModule foo_module modules/mod_foo.so # LoadModule jk2_module modules/mod_jk2.dll |
第三步,配置jk2
jk2的配置全在一个配置文件中,文件名为workers2.properties,和apache 的httpd.conf放在同一个目录下。如下是这个文件的内容:
#++++++++++++++++++++++++++++++++++++ # only at beginnin. In production uncomment it out [logger.apache2] level=DEBUG #shm必须配 [shm] file=D:/Program Files/Apache Group/Apache2/logs/shm.file size=1048576 #第一个tomcat的地址 # Example socket channel, override port and host. [channel.socket:tomcat1] port=11009 host=127.0.0.1 #定义第一个工做者指向第一个tomcat # define the worker [ajp13:tomcat1] channel=channel.socket:tomcat1 #第二个tomcat得地址 # Example socket channel, override port and host. [channel.socket:tomcat2] port=12009 host=10.1.36.123 #定义第二个工做者指向第二个tomcat # define the worker [ajp13:tomcat2] channel=channel.socket:tomcat2 #定义负载均衡器,使其包含两个工做者 [lb:lb1] worker=ajp13:tomcat2 worker=ajp13:tomcat1 #指定负载均衡器完成单一地址映射,使得apache服务所在的uri所有指向两个tomcat上的root # Uri mapping [uri:/*] group=lb:lb1 #++++++++++++++++++++++++++++++++++++++++++ |
同属于一个集群下的两个服务实体,要求功能的同一性,因此咱们可先安装和配置第一个tomcat,接着拷贝造成第二个tomcat,最后配置第二个tomcat。
安装tomcat 很是简单,本文就再也不描述。咱们假设第一个tomcat的安装路径为d:/tomcat1。
配置第一个tomcat:
tomcat 中的jk2 connector缺省端口为8009,为了在一台机器上运行两个tomcat,修改D:/Tomcat1/conf/jk2.properties,设置jk2 connector的端口为11009,整个文件内容以下:
#++++++++++++++ channelSocket.port=11009 #++++++++++++++
|
为了让一台机器上运行两个tomcat,修改server.conf的tomcat 中止指令监听端口:
<Server port="8005" shutdown="SHUTDOWN" debug="0"> 改成 <Server port="11005" shutdown="SHUTDOWN" debug="0">
|
而后打开JK2 AJP connector ,关闭其它connector,下面是JK2 AJP 1.3的样子,这里已把它的端口改成11009:
<!-- Define a Coyote/JK2 AJP 1.3 Connector on port 8009 --> <Connector className="org.apache.coyote.tomcat4.CoyoteConnector" port="11009" minProcessors="5" maxProcessors="75" enableLookups="true" redirectPort="8443" acceptCount="10" debug="0" connectionTimeout="20000" useURIValidationHack="false" protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"/> |
接着配置须要集群支持的webapp(好比examples) 的context,添加以下manager:
<Manager className="org.apache.catalina.session.InMemoryReplicationManager" protocolStack="UDP(mcast_addr=228.1.2.3;mcast_port=45566;ip_ttl=32) :PING(timeout=3000; num_initial_members=6):FD(timeout=5000):VERIFY_SUSPECT(timeout=1500): pbcast.STABLE(desired_avg_gossip=10000):pbcast.NAKACK(gc_lag=10; retransmit_timeout=3000):UNICAST(timeout=5000;min_wait_time=2000): MERGE2:FRAG:pbcast.GMS(join_timeout=5000;join_retry_timeout=2000; shun=false;print_local_addr=false)"> </Manager> |
注意protocolStack的值必须在一行内写完。
配置第二个tomcat:
把已经配好的第一个tomcat复制一份,造成第二个tomcat,假设路径为d:/tomcat2。
修改D:/Tomcat2/conf/jk2.properties,设置jk2 connector的端口12009,整个文件内容以下:
#++++++++++++++ channelSocket.port=12009 #++++++++++++++ |
修改server.conf
有了第一个tomcat的配置咱们只需修改server.conf的tomcat 中止指令监听端口:
<Server port="11005" shutdown="SHUTDOWN" debug="0"> 改成 <Server port="12005" shutdown="SHUTDOWN" debug="0">
|
而后设置JK2 AJP connector 端口为12009。
启动apache,tomcat1和tomcat2。
咱们先准备两个文件,第一个文件为test.jsp,拷贝到第一个tomcat 的根web应用的目录即d:/tomcat1/webapps/ROOT 下:
<html> <body bgcolor="red"> <center> <%= request.getSession().getId() %> <h1>Tomcat 1</h1> </body> </html>
|
第二个文件也为test.jsp,拷贝到第二个tomcat 的根web应用的目录即d:/tomcat2/webapps/ROOT 下:
<html> <body bgcolor="blue"> <center> <%= request.getSession().getId() %> <h1>Tomcat 2</h1> </body> </html>
|
从不一样的浏览器中屡次输入地址http://localhost/test.jsp 会看到不一样的颜色,这代表apache中的jk2模块起到了负载均衡的做用。
容量计划是在生产环境中使用Tomcat不得不提的提升性能的另外一个重要的话题。若是你没有对预期的网络流量下的硬件和带宽作考虑的话那么不管你如何作配置修改和测试都无济于事。
这里先对说起的容量计划做一个简要的定义:容量计划是指评估硬件、操做系统和网络带宽,肯定应用服务的服务范围,寻求适合需求和软件特性的软硬件的一项活动。所以这里所说的软件不只包括Tomcat,也包括与Tomcat结合使用的任何第三方web服务器软件。
如 果在购买软硬件或部署系统前你对容量计划一无所知,不知道现有的软硬件环境可以支撑多少的访问量,甚至更糟直到你已经交付而且在生产环境上部署产品后才意 识到配置有问题时再进行变动可能为时已晚。此时只能增长硬件投入,增长硬盘容量甚至购买更好的服务器。若是事先作了容量计划那么就不会搞的如此焦头烂额 了。
咱们这里只介绍与Tomcat相关的内容。
首先为了肯定Tomcat使用机器的容量计划,你应该从一下列表项目种着手研究和计划:
采用什么样的硬件体系?须要多少台计算机?使用一个大型的,仍是使用多台小型机?每一个计算机上使用几个CPU?使用多少内存?使用什么样的存储设备,I/O的处理速度有什么要求?怎样维护这些计算机?不一样的JVM在这些硬件上运行的效果如何(好比IBM AIX系统只能在其设计的硬件系统上运行)?
带宽的使用极限是多少?web应用程序如何处理过多的请求?
采用哪一种操做系统做为站点服务器最好?在肯定的操做系统上使用哪一个JVM最好?例如,JVM在这种系统上是否支持本地多线程,对称多处理?哪一种系统可以使web服务器更快、更稳定,而且更便宜。是否支持多CPU?
如下介绍针对Tomcat作容量计划的步骤:
1) 量化负载。若是站点已经创建并运行,可使用工具模仿用户访问,肯定资源的需求量。
2) 针对测试结果或测试过程当中进行分析。须要知道那些请求形成了负载太重或者使用过多的资源,并与其它请求作比较,这样就肯定了系统的瓶颈所在。例如:若是servlet在查询数据库的步骤上耗用较长的时间,那么就须要考虑使用缓冲池来下降响应时间。
3)肯定性能最低标准。例如,你不想让用户花20秒来等待结果页面的返回,也就是说甚至在达到访问量的极限时,用户等待的时间也不能超过20秒种(从点击连接到看到返第一条返回数据)。这个时间中包含了数据库查询时间和文件访问时间。同类产品性能在不一样的公司可能有不一样的标准,通常最好采起同行中的最低标准或对这个标准作出评估。
4)肯定如何合理使用底层资源,并逐一进行测试。底层资源包括CPU、内存、存储器、带宽、操做系统、JVM等等。在各类生产环境上都按顺序进行部署和测试,观察是否符合需求。在测试Tomcat时尽可能多采用几种JVM,而且调整JVM使用内存和Tomcat线程池的大小进行测试。同时为了达到资源充分合理稳定地使用的效果,还需针对测试过程当中出现的硬件系统瓶颈进行处理肯定合理的资源配置。这个过程最为复杂,并且通常因为没有可参考的值因此只能靠理论推断和经验总结。
5) 若是经过第4步的反复测试若是达到了最优的组合,就能够在相同的生产环境上部署产品了。
此外应牢记必定要文档化你的测试过程和结果,由于此后可能还会进行测试,这样就能够拿之前的测试结果做为参考。另外测试过程要反复屡次进行,每次的条件可能都不同,所以只有记录下来才能进行结果比较和最佳条件的选择。
这样客户系统经过测试找到了最好的组合方式,各类资源获得了合理的配置,系统的性能获得了极大的提高。