一. 引言html
性能测试与分析是软件开发过程当中介于架构和调整的一个普遍并比较不容易理解的领域,更是一项较为复杂的活动。就像下棋游戏同样,有效的性能测试和分析只能在一个良好的计划策略和具有了对不可预料事件的处理能力的条件下顺利地完成。一个下棋高手赢得比赛靠的不只仅是对游戏规则的认识,更是靠他的本身的能力和不断地专一于分析本身对手的实力来更加有效地利用和发挥规则的做用。一样一个优秀的性能测试和分析人员将要面对的是来自一个全新的应用程序和环境下带来的整个项目的挑战。本文中做者结合本身的使用经验和参考文档,对Tomcat性能方面的调整作一简要的介绍,并给出Tomcat性能的测试、分析和调整优化的一些方法。java
二. 测量Web服务器的性能linux
测量web服务器的性能是一项让人感到畏缩的任务,可是咱们在这里将给出一些须要注意的地方而且指点你了解其中更多的细节性的内容。它不像一些简单的任务,如测量CPU的速率或者是测量程序占用CPU的比例,web服务器的性能优化中包括许调整许多变量来达到目标。许多的测量策略中都包含了一个看似简单的浏览其实是在向服务器发送大量的请求,咱们称之为客户端的程序,来测量响应时间。客户端和服务器端是在同一台机器上吗?服务器在测试的时候还运行着其它的什么程序吗?客户端和服务器端的通信是经过局域网,100baseT,10baseT仍是使用调制解调器?客户端是否一直重复请求相同的页面,仍是随机地访问不一样的页面?(这些影响到了服务缓存的性能)客户端发送请求的有规律的仍是突发的?你是在最终的配置环境下运行服务的仍是在调试的配置环境下运行服务的?客户端请求中包含图片仍是只有HTML页面?是否有请求是经过servlets和JSP的,CGI程序,服务端包含(Server-Side Includes ,SSI是一个可让你使用动态HTML文件的技术)?全部这些都将是咱们要关心的,而且几乎咱们不可能精确地把全部的问题都清楚地列出来。程序员
1.压力测试工具web
“工欲善其事,必先利其器”,压力测试只有借助于一些工具才可得以实施。数据库
大多数web压力测试工具的实现原理都是经过重复的大量的页面请求来模拟多用户对被测系统的并发访问,以此达到产生压力的目的。产生压力的手段都是经过录制或者是编写压力脚本,这些脚本以多个进程或者线程的形式在客户端运行,这样经过人为制造各类类型的压力,咱们能够观察被测系统在各类压力情况下的表现,从而定位系统瓶颈,做为系统调优的基础。目前已经存在的性能测试工具林林总总,数量不下一百种,从单一的开放源码的免费小工具如 Aapache 自带的 web 性能测试工具 Apache Benchmark、开源的Jmeter 到大而全的商业性能测试软件如 Mercury 的 LoadRunner 等等。任何性能测试工具都有其优缺点,咱们能够根据实际状况挑选用最合适的工具。您能够在这里找到一些web压力测试工具http://www.softwareqatest.com/qatweb1.html#LOADapache
这里咱们所使用的工具要支持web应用服务认证才能够,要支持接收发送cookies,不只如此Tomcat支持多种认证方式,好比基本认证、基于表单的认证、相互认证和客户端认证,而一些工具仅仅支持HTTP基本认证。真实地模拟用户认证是性能测试工具的一个重要的部分,由于认证机制将对一个web站点的性能特征产生重要的影响。基于你在产品中使用的不一样的认证方式,你须要从上面的工具列表中选择使用这种特性的测试工具。api
Apache Benchmark和http_load是命令行形式的工具,很是易于使用。Apache Benchmark能够模仿单独的URL请求而且重复地执行,可使用不一样的命令行参数来控制执行迭代的次数,并发用户数等等。它的一个特色是能够周期性地打印出处理过程的信息,而其它工具只能给出一个全局的报告。浏览器
2.压力测试工具介绍缓存
1) Apache Benchmark
下面是运行Apache Benchmark的例子,响应时间很是长是由于它运行在一个配置很是低的系统上(Pentium 233)。在这里咱们用它来访问一个URL,模拟127个并发用户重复执行1000次。
Root$ ab -k -n 1000 -c 127 -k http://tomcathost:8080/examples/date/date.jsp
This is ApacheBench, Version 2.0.36 <$Revision: 1.1 $> apache-2.0
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/
Benchmarking tomcathost (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Finished 1000 requests
Server Software: Apache
Server Hostname: tomcathost
Server Port: 8080
Document Path: /examples/date/date.jsp
Document Length: 701 bytes
Concurrency Level: 127
Time taken for tests: 53.162315 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Non-2xx responses: 1000
Keep-Alive requests: 0
Total transferred: 861000 bytes
HTML transferred: 701000 bytes
Requests per second: 18.81[#/sec] (mean)
Time per request: 6.752(mean)
Time per request: 0.053(mean, across all concurrent requests)
Transfer rate: 15.80>Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 51 387.5 0 2999
Processing: 63 6228 2058.4 6208 12072
Waiting: 17 4236 1855.2 3283 9193
Total: 64 6280 2065.0 6285 12072
Percentage of the requests served within a certain time (ms)
50% 6285
66% 6397
75% 6580
80% 9076
90% 9080
95% 9089
98% 9265
99% 12071
100% 12072 (longest request)
2) Apache JMeter 中请求响应时间(图略)
3) Mercury LoadRunner测试实时监控(图略)
这三个工具是全部相似性能测试工具的典型表明,能够根据你本身的须要选择不一样的测试工具。这里不对以上工具作详细的介绍,若是您对这些测试工具感兴趣的话能够参阅附加资料。
3.性能评测技巧
1) 因为评测时要用到系统时钟,因此当进行测试时不要运行无关的进程或程序,以避免影响测试结果;
2) 若是对本身的程序进行了修改,并试图改善它的性能,那么在修改先后应分别测试一下代码的执行时间;
3) 尽可能在彻底一致的环境中进行每一次测试;
4) 若是可能,应设计一个不依赖于任何用户输入的测试,测试中使用的数据应彻底一致,避免用户的不一样的反应或者数据的问题致使测试结果出现偏差;
5) 有可能您还须要考虑是在运行着的系统(包括操做系统和被测试的系统)上继续进行测试仍是从新启动系统后再进行测试;
6) 对于有些系统第一次使用可能要进行初始化,这种工做在系统使用过程当中仅进行一次,因此有必要在重启系统后先进行一次初始化工做,而后进行性能测试。
三. 外部环境的调整
在Tomcat和应用程序进行了压力测试后,若是您对应用程序的性能结果不太满意,就能够采起一些性能调整措施了,固然了前提是应用程序没有问题,咱们这里只讲Tomcat的调整。因为Tomcat的运行依赖于JVM,因此在这里咱们把Tomcat的调整能够分为两类来详细描述:
外部环境调整
调整非Tomcat组件,例如Tomcat运行的操做系统和运行Tomcat的java虚拟机。
自身调整
修改Tomcat自身的参数,调整Tomcat配置文件中的参数。
下面咱们将详细讲解外部环境调整的有关内容,Tomcat自身调整的内容将在第2部分中阐述。
1.JAVA虚拟机性能优化
Tomcat自己不能直接在计算机上运行,须要依赖于硬件基础之上的操做系统和一个java虚拟机。您能够选择本身的须要选择不一样的操做系统和对应的JDK的版本(只要是符合Sun发布的Java规范的),但咱们推荐您使用Sun公司发布的JDK。确保您所使用的版本是最新的,由于Sun公司和其它一些公司一直在为提升性能而对java虚拟机作一些升级改进。一些报告显示JDK1.4在性能上比JDK1.3提升了将近10%到20%。
能够给Java虚拟机设置使用的内存,可是若是你的选择不对的话,虚拟机不会补偿。可经过命令行的方式改变虚拟机使用内存的大小。以下表所示有两个参数用来设置虚拟机使用内存的大小。
参数
描述
-Xms<size>
JVM初始化堆的大小
-Xmx<size>
JVM堆的最大值
这两个值的大小通常根据须要进行设置。初始化堆的大小执行了虚拟机在启动时向系统申请的内存的大小。通常而言,这个参数不重要。可是有的应用程序在大负载的状况下会急剧地占用更多的内存,此时这个参数就是显得很是重要,若是虚拟机启动时设置使用的内存比较小而在这种状况下有许多对象进行初始化,虚拟机就必须重复地增长内存来知足使用。因为这种缘由,咱们通常把-Xms和-Xmx设为同样大,而堆的最大值受限于系统使用的物理内存。通常使用数据量较大的应用程序会使用持久对象,内存使用有可能迅速地增加。当应用程序须要的内存超出堆的最大值时虚拟机就会提示内存溢出,而且致使应用服务崩溃。所以通常建议堆的最大值设置为可用内存的最大值的80%。
Tomcat默承认以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,须要调大。
Windows下,在文件{tomcat_home}/bin/catalina.bat,Unix下,在文件{tomcat_home}/bin/catalina.sh的前面,增长以下设置:
JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可使用的最大内存】'
须要把这个两个参数值调大。例如:
JAVA_OPTS='-Xms256m -Xmx512m'
表示初始化内存为256MB,可使用的最大内存为512MB。
另外须要考虑的是Java提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾能够接受的速度与应用有关,应该经过分析实际的垃圾收集的时间和频率来调整。若是堆的大小很大,那么彻底垃圾收集就会很慢,可是频度会下降。若是你把堆的大小和内存的须要一致,彻底收集就很快,可是会更加频繁。调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。在基准测试的时候,为保证最好的性能,要把堆的大小设大,保证垃圾收集不在整个基准测试的过程当中出现。
若是系统花费不少的时间收集垃圾,请减少堆大小。一次彻底的垃圾收集应该不超过 3-5 秒。若是垃圾收集成为瓶颈,那么须要指定代的大小,检查垃圾收集的详细输出,研究 垃圾收集参数对性能的影响。通常说来,你应该使用物理内存的 80% 做为堆大小。当增长处理器时,记得增长内存,由于分配能够并行进行,而垃圾收集不是并行的。
2.操做系统性能优化
这里说的操做系统是指运行web服务器的系统软件,固然,不一样的操做系统是为不一样的目的而设计的。好比OpenBSD是面向安全的,所以在它的内核中有许多的限制来防止不一样形式的服务攻击(OpenBSD的一句座右铭是“默认是最安全的”)。这些限制或许更多地用来运行活跃的web服务器。
而咱们经常使用的Linux操做系统的目标是易用使用,所以它有着更高的限制。使用BSD内核的系统都带有一个名为“Generic”的内核,代表全部的驱动器都静态地与之相连。这样就使系统易于使用,可是若是你要建立一个自定义的内核来增强其中某些限制,那就须要排除不须要的设备。Linux内核中的许多驱动都是动态地加载的。可是换而言之,内存如今变得愈来愈便宜,因此由于加载额外的设备驱动就显得不是很重要的。重要的是要有更多的内存,而且在服务器上腾出更多的可用内存。
小提示:虽然如今内存已经至关的便宜,但仍是尽可能不要购买便宜的内存。那些有牌子的内存虽然是贵一点,可是从可靠性上来讲,性价比会更高一些。
若是是在Windows操做系统上使用Tomcat,那么最好选择服务器版本。由于在非服务器版本上,最终用户受权数或者操做系统自己所能承受的用户数、可用的网络链接数或其它方面的一些方面都是有限制的。而且基于安全性的考虑,必须常常给操做系统打上最新的补丁。
3.Tomcat与其它web服务器整合使用
虽然tomcat也能够做web服务器,但其处理静态html的速度比不上apache,且其做为web服务器的功能远不如apache,所以咱们想把apache和tomcat集成起来,将html与jsp的功能部分进行明确分工,让tomcat只处理jsp部分,其它的由apache,IIS等这些web服务器处理,由此大大节省了tomcat有限的工做“线程”。
4.负载均衡
在负载均衡的思路下,多台服务器为对称方式,每台服务器都具备同等的地位,能够单独对外提供服务而无须其余服务器的辅助。经过负载分担技术,将外部发送来的请求按必定规则分配到对称结构中的某一台服务器上,而接收到请求的服务器都独立回应客户机的请求。
提供服务的一组服务器组成了一个应用服务器集群(cluster),并对外提供一个统一的地址。当一个服务请求被发至该集群时,根据必定规则选择一台服务器,并将服务转定向给该服务器承担,即将负载进行均衡分摊。
经过应用负载均衡技术,使应用服务超过了一台服务器只能为有限用户提供服务的限制,能够利用多台服务器同时为大量用户提供服务。当某台服务器出现故障时,负载均衡服务器会自动进行检测并中止将服务请求分发至该服务器,而由其余工做正常的服务器继续提供服务,从而保证了服务的可靠性。
负载均衡实现的方式大概有四种:第一是经过DNS,但只能实现简单的轮流分配,不能处理故障,第二若是是基于MS IIS,Windows 2003 server自己就带了负载均衡服务,第三是硬件方式,经过交换机的功能或专门的负载均衡设备能够实现,第四种是软件方式,经过一台负载均衡服务器进行,上面安装软件。使用Apache Httpd Server作负载平衡器,Tomcat集群节点使用Tomcat就能够作到以上第四种方式。这种方式比较灵活,成本相对也较低。另一个很大的优势就是能够根据应用的状况和服务器的状况采起一些策略。
四. 自身调整
本节将向您详细介绍一些加速可以使Tomcat实例加速运行的技巧和方法,不管是在什么操做系统或者何种Java虚拟机上。在有些状况下,您可能没有控制部署环境上的操做系统或者Java虚拟机。在这种状况下,您就须要逐行了解如下的的一些建议,然而你应该在修改后使之生效。我认为如下方法是Tomcat性能自身调整的最佳方式。
1.禁用DNS查询
当web应用程序向要记录客户端的信息时,它也会记录客户端的IP地址或者经过域名服务器查找机器名转换为IP地址。DNS查询须要占用网络,而且包括可能从不少很远的服务器或者不起做用的服务器上去获取对应的IP的过程,这样会消耗必定的时间。为了消除DNS查询对性能的影响咱们能够关闭DNS查询,方式是修改server.xml文件中的enableLookups参数值:
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查询可能没有大流量站点的效果明显,可是此举仍不失为一良策。谁又见到一个低流量的网站一晚上之间就流量大增呢?
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站点的流量都是同样的,所以没有一刀切的方案来肯定线程数的值。
3.加速JSP编译速度
当第一次访问一个JSP文件时,它会被转换为Java serverlet源码,接着被编译成Java字节码。你能够控制使用哪一个编译器,默认状况下,Tomcat使用使用命令行javac进行使用的编译器。也可使用更快的编译器,可是这里咱们将介绍如何优化它们。
另一种方法是不要把全部的实现都使用JSP页面,而是使用一些不一样的java模板引擎变量。显然这是一个跨越很大的决定,可是事实证实至少这种方法是只得研究的。若是你想了解更多有关在Tomcat可以使用的模板语言,你能够参考Jason Hunter和William Crawford合著的《Java Servlet Programming 》一书(O'Reilly公司出版)。
在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.ja
r</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
在Tomcat 4.1(或更高版本),JSP的编译由包含在Tomcat里面的Ant程序控制器直接执行。这听起来有一点点奇怪,但这正是Ant有意为之的一部分,有一个API文档指导开发者在没有启动一个新的JVM的状况下,使用Ant。这是使用Ant进行Java开发的一大优点。另外,这也意味着你如今可以在Ant中使用任何javac支持的编译方式,这里有一个关于Apache Ant使用手册的javac page列表。使用起来是容易的,由于你只须要在 元素中定义一个名字叫“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>
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页面的一种有力的手段。
能够经过浏览器访问再确认一下编译的结果。这样就确保了文件被转换成serverlet,被编译了可直接执行。这样也准确地模仿了真实用户访问JSP页面,能够看到给用户提供的功能。也抓紧这最后一刻修改出现的bug而且修改它J
Tomcat提供了一种经过请求来编译JSP页面的功能。例如,你能够在浏览器地址栏中输入http://localhost:8080/examples/jsp/dates/date.jsp?jsp_precompile=true,这样Tomcat就会编译data.jsp而不是执行它。此举唾手可得,不失为一种检验页面正确性的捷径。
4. 其它
前面咱们提到过操做系统经过一些限制手段来防止恶意的服务攻击,一样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>
若是没有给出容许主机的指定,那么与拒绝主机匹配的主机就会被拒绝,除此以外的都是容许的。与之相似,若是没有给出拒绝主机的指定,那么与容许主机匹配的主机就会被容许,除此以外的都是拒绝的。
五. 容量计划
容量计划是在生产环境中使用Tomcat不得不提的提升性能的另外一个重要的话题。若是你没有对预期的网络流量下的硬件和带宽作考虑的话那么不管你如何作配置修改和测试都无济于事。
这里先对说起的容量计划做一个简要的定义:容量计划是指评估硬件、操做系统和网络带宽,肯定应用服务的服务范围,寻求适合需求和软件特性的软硬件的一项活动。所以这里所说的软件不只包括Tomcat,也包括与Tomcat结合使用的任何第三方web服务器软件。
若是在购买软硬件或部署系统前你对容量计划一无所知,不知道现有的软硬件环境可以支撑多少的访问量,甚至更糟直到你已经交付而且在生产环境上部署产品后才意识到配置有问题时再进行变动可能为时已晚。此时只能增长硬件投入,增长硬盘容量甚至购买更好的服务器。若是事先作了容量计划那么就不会搞的如此焦头烂额了。
咱们这里只介绍与Tomcat相关的内容。
首先为了肯定Tomcat使用机器的容量计划,你应该从一下列表项目种着手研究和计划:
1. 硬件
采用什么样的硬件体系?须要多少台计算机?使用一个大型的,仍是使用多台小型机?每一个计算机上使用几个CPU?使用多少内存?使用什么样的存储设备,I/O的处理速度有什么要求?怎样维护这些计算机?不一样的JVM在这些硬件上运行的效果如何(好比IBM AIX系统只能在其设计的硬件系统上运行)?
2. 网络带宽
带宽的使用极限是多少?web应用程序如何处理过多的请求?
3. 服务端操做系统
采用哪一种操做系统做为站点服务器最好?在肯定的操做系统上使用哪一个JVM最好?例如,JVM在这种系统上是否支持本地多线程,对称多处理?哪一种系统可以使web服务器更快、更稳定,而且更便宜。是否支持多CPU?
4. Tomcat容量计划
如下介绍针对Tomcat作容量计划的步骤:
1) 量化负载。若是站点已经创建并运行,可使用前面介绍的工具模仿用户访问,肯定资源的需求量。
2) 针对测试结果或测试过程中进行分析。须要知道那些请求形成了负载太重或者使用过多的资源,并与其它请求作比较,这样就肯定了系统的瓶颈所在。例如:若是servlet在查询数据库的步骤上耗用较长的时间,那么就须要考虑使用缓冲池来下降响应时间。
3) 肯定性能最低标准。例如,你不想让用户花20秒来等待结果页面的返回,也就是说甚至在达到访问量的极限时,用户等待的时间也不能超过20秒种(从点击连接到看到返第一条返回数据)。这个时间中包含了数据库查询时间和文件访问时间。同类产品性能在不一样的公司可能有不一样的标准,通常最好采起同行中的最低标准或对这个标准作出评估。
4) 肯定如何合理使用底层资源,并逐一进行测试。底层资源包括CPU、内存、存储器、带宽、操做系统、JVM等等。在各类生产环境上都按顺序进行部署和测试,观察是否符合需求。在测试Tomcat时尽可能多采用几种JVM,而且调整JVM使用内存和Tomcat线程池的大小进行测试。同时为了达到资源充分合理稳定地使用的效果,还需针对测试过程当中出现的硬件系统瓶颈进行处理肯定合理的资源配置。这个过程最为复杂,并且通常因为没有可参考的值因此只能靠理论推断和经验总结。
5) 若是经过第4步的反复测试若是达到了最优的组合,就能够在相同的生产环境上部署产品了。
此外应牢记必定要文档化你的测试过程和结果,由于此后可能还会进行测试,这样就能够拿之前的测试结果作为参考。另外测试过程要反复屡次进行,每次的条件可能都不同,所以只有记录下来才能进行结果比较和最佳条件的选择。
这样咱们经过测试找到了最好的组合方式,各类资源获得了合理的配置,系统的性能获得了极大的提高。
六. 附加资料
很显然本文也很难全面而详尽地阐述性能优化过程。若是你进行更多研究的话可能会把性能调优作的更好,好比Java程序的性能调整、操做系统的调整、各类复杂环境与应用系统和其它全部与应用程序相关的东西。在这里提供一些文中提到的一些资源、文中提到的相关内容的连接以及本文的一些参考资料。
1. Web性能测试资料及工具
1) Jmeter Wiki首页,Jmeter为一个开源的100%Java开发的性能测试工具
http://wiki.apache.org/jakarta-jmeter/
2) Apache Benchmark使用说明
http://httpd.apache.org/docs-2.0/programs/ab.html
3) 一些Java相关测试工具的介绍,包含能够与Tomcat集成进行测试的工具
http://blog.csdn.net/wyingquan/
4) LoadRunner® 是一种预测系统行为和性能的工业标准级负载测试工具。它经过模拟数据以千万计用户来实施并发负载来对整个企业架构进行测试,来帮助您更快的查找和发现问题。
loadrunner/">http://www.mercury.com/us/products/performance-center/loadrunner/
2. 文中介绍的相关内容的介绍
1) Apache 2.x + Tomcat 4.x作负载均衡,描述了如何利用jk配置集群的负载均衡。
http://raibledesigns.com/tomcat/index.html
2) 容量计划的制定,收集了许多有关制定web站点容量计划的例子:
http://www.capacityplanning.com/
3) 评测Tomcat5负载平衡与集群,
http://www.javaresearch.org/article/showarticle.jsp?column=556&thread=19777
4) Apache与Tomcat的安装与整合之整合篇
http://www.javaresearch.org/article/showarticle.jsp?column=23&thread=18139
5) 性能测试工具之研究,介绍了性能测试工具的原理与思路
http://www.ltesting.net/emagzine/no2_2.htm
6) Java的内存泄漏
http://www.matrix.org.cn/resource/article/409.html
7) Web服务器和应用程序服务器有什么区别?
http://www.matrix.org.cn/resource/article/1429.html
8) 详细讲解性能中数据库集群的问题
http://www.theserverside.com/articles/article.tss?l=db_break