调校的基本步骤
- 决定需要测量的对象。
- 决定测量的方式。
- 测量。
- 从测量结果中,了解其含义。
- 以预期会提升测量结果的方式来修补系统配置。
- 测量,并与之前的测量结果比较。
- 回到第4步。
依照实际环境架设Tomcat。试着使用相同的硬件、操作系统、数据库等。越接近实际环境就越可能找到在实际系统中的瓶颈。在另一台机器上安装并配置负载测试用的软件。如果在运行Tomcat的同一台机器上运行,测试结果会不可靠,有时会更糟糕。
让负责测试的机器与运行Tomcat的机器之间通信隔离。这样处理的原因在于在运行高流量的测试时,如果追加了不属于测试的网络流量,将导致这些测试结果变得不可靠。
测量Web服务器的性能
- 负载测试客户端与服务器软件包是在同一台机器吗?
- 在测试时,服务器端机器是否正在执行其他的程序?
- 客户端与服务器是以千兆位的以太网络,还是100baseT、10baseT相连呢?如果负载测试客户端机器通过低于千兆以太网速度的网络信道链接到服务器端,那么网络链接会降低测试速度,从而改变测试结果。
- 是屡次请求相同的网页,混合多种不同的并发请求,还是从庞大的网页清单中随机挑选呢?这能影响服务器及多线程缓存性能。
- 测试客户端应按常规方式还是应该以突发方式发送请求呢?按基准调校来说,当您欲知道多快的服务器能完成请求时,应使测试客户端在请求之间不经暂停、快速连续地发送请求。
- 运行的服务器是最终配置吗?根据基准调校的需要,应关闭所有调试工作,且还可能要关闭一些日志。
- HTTP客户端请求了图像还是仅请求了嵌入于其中的HTML页?
测试负载的工具
- Jmeter
Jmeter提供了定制测试结果的最具报表特性的选项,是最能适应不同操作系统的工具,而且支持大部分功能。但是,出于某种原因,Jmeter不能像ab和siege所做的那样,每秒钟请求并完成那么多次HTTP请求。 - ab
是一个基准调校工具,所以一般不会把它用于递归测试。 - Siege
Siege是另一个很好的命令行Web负载测试工具。Siege支持多种不同的认证特性,并可执行基准测试、递归测试,还支持”Internet”模式测试(即尽可能仿真在Internet上Web应用程序进行交互的众多实际用户所产生的负载)。
ab:Apache基准调校工具
在基准调校测试的时候,测试客户端请求HTTP的数量越少,测试客户端提供的测试结果就可能越不精确,因为在基准调校过程中,Java VM的资源回收暂停占用了整个测试时间的较高比重。运行HTTP请求的总数量越多,资源回收暂停变得意义更小,而且基准调校测试结果将更能显示Tomcat的整体性能。您最好运行至少100000个HTTP请求以执行基准调校测试。另外,您可以配置测试客户端,产生您喜欢的客户端线程数,但是,如果您将该线程数设置成超过Tomcat的conf/server.xml文件中提供的连接器(Connector)最大线程数(maxThread),那么实际不会有太大的帮助。在默认的情况下将该线程数设置为150。如果您设置成测试者超过这一数字,而且在更多的线程中产生了比Tomcat拥有的接收线程数和处理线程数还要多的请求,就会影响性能,因为一些客户端请求线程将一直处于等待状态。最好是就保留在连接器的最下线程数(Connector的maxThread)设置下,如使用149的客户端线程。
ab -k -n 100000 -c 149 http://127.0.0.1:8080/test
如果在ab命令行中删除-k,那么ab与Tomcat将不使用保持联机(keep-alive)链接,这样处理效率更低,因为它必须链接一个新的TCP包到Tomcat上,以执行每个HTTP请求。结果是每秒要处理的请求数更好了,而且Tomcat到客户端的吞吐量更小了。
ab -n 100000 -c 149 http://127.0.0.1:8080/test
外部调校
当您了解应用程序及Tomcat的实例对负载的响应情形后,就可以开始一些性能调校的处理了,这里有两种基本的调校方式:
- 外部调校
涉及到非Tomcat组件的调校,如Tomcat所运行的操作系统,以及运行Tomcat的Java虚拟机器。
1.JVM的性能
不同厂商,不同版本之间的基准调校。如果选择Java 1.6,那么您可以对Sun的1.6、IBM的1.6和BEA的1.6版本的虚拟机进行基准调校。
通常,人们会设法修改JVM启动参数,以使Tomcat JVM能更快地为Web应用程序网页服务。这可以提供一些帮助,但通常不会在性能上提高较高百分比。其主要原因是这样处理不会太有用:JVM提供商在发布JDK之前就已进行过自身测试,寻找哪些设置会产生最佳性能,并让这些设置变成默认值。
JVM的堆栈内存(heap memory)分配除外。JVM提供商默认选择分配少量内存以启动JVM,且如果Java应用程序需要更多内存,那么在应用程序暂停时,JVM的heap会被重新分配为更大。为了避免这种暂停,可以设置最小heap大小与最大heap大小相等。那样处理的话,JVM将不会在运行的时候尝试扩展heap大小。只要设置JAVA_OPTS环境变量为类似于-Xms512M -Xmx512M之类的值。这意味着最大、最小heap都被设置为512MB。
2.操作系统的性能
您的服务器的操作系统是最适合于运行大型、高容量的Web服务器吗?OpenBSD的主要目标在安全防护,所以其核心中许多的限制都设得比较低,以防止各种形式的DOS攻击。Linux的目标是容易使用,所以其限制值会设得比较高。如果您执行任何版本的Microsoft Windows,请确定是Server。在非Server的版本中,终端用户的授权协议和程序代码都可能会限制用户数、可使用的网络连接数或其他限制。
- 内部调校
与Tomcat本身有关的调校,包括改变配置文件中的设定值,以及修改Tomcat本身的源代码。
1. 停用DNS查询
DNS查询需要耗费网络资源,并涉及多部服务器的往返响应,而这些服务器可能位于遥远的地方,也可能尚未运行,因此导致延迟。
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
enableLookups="true" redirectPort="8443" />
只要将enableLookups的值”true”改成”false”,然后重新启动Tomcat。这样将不再使用DNS查询,也不会有延迟了。
2. 调整线程数
另一种对应用程序之Connector性能控制的方法是控制其处理的进程数。Tomcat默认使用线程池以便对传入的请求提供快速响应。
通过更改Connector的minThreads与maxThreads的值,可以控制所分配的线程数。
minThreads的值应该大到能够处理最小负载量。即如果在低谷时刻,每秒可访问五次网页,而每次请求在一秒钟之内可完成,则预先分配5个线程就够了。随后在高峰时刻,则需要分配更多线程(最多到maxThreads所设定的数目),为了防止流量暴增(或黑客的DoS攻击)让系统超出JVM的最大内存限制,而使服务器瘫痪,因此一定要设定上限。
3. 加快JSP的编译速度
当第一次访问JSP时,此JSP会转换成Java Servlet的源代码,然后必须再编译成Java的bytecode。用请求预编译JSP。
容量规划
调校Tomcat在线服务器性能的另一重要部分就是容量规划。无论调校多少配置文件与进行多少测试,如果没有符合网站预期流量大小的硬件与带宽,实际上也帮不了忙。
通过研究及(或)预测网站必须处理的总网络流量,决定可接收的服务质量与寻找满足或超越服务器软件需求,来预测网站所需的计算机硬件、操作系统与带宽的活动。
1. 经验式的容量规划
经验式的容量规划师一种轻量级的规划方式,它不一定要很精确,但已足够让公司免于完全不做容量规划的后果。这种方法符合以前的业界经验产生的容量与性能趋势。例如,对于网站在高峰时有多少输出流量,您可以做最佳的预测,然后将该数字加倍。
2. 企业容量规划的目的是要更精确,因此也需要更久的时间。通常这会使用商业及的容量规划分析软件,以及反复的测试与模拟仿真。
Tomcat上的容量规划
- 服务器计算机硬件
- 网络带宽
- 服务器操作系统
适用于Tomcat的各种容量规划的一般程序
1. 找出负载特性。
2. 分析性能的趋势。
3. 决定可接收服务的最低需求。例如,可能希望让用户最多等待20秒钟。
4. 决定要使用何种基础体系的资源,并在分段的环境下测试。
5. 如果第4步可以符合您的服务需求,就可以订购并部署更多的相同的机器,以作为生产用的服务器计算机。否则,请重复第4步,直到满足服务需求为止。