外部调校
当您了解应用程序及Tomcat的实例对负载的响应情形后,就可以开始一些性能调校的处 理了,这里有两种基本的调校方式
外部调校
涉及到非Tomcat组件的调校,如Tomcat所运行的操作系统,以及运行Tomcat的Java 虚拟机器。
内部调校
与Tomcat本身有关的调校,包栝改变配置文件中的设定埴,以及修改Tomcat本身的原代码。应用程序的修改也属于此类。
在本节中,笔者会详细说明外部调校的最普遍范畴,然后在下节讨论内部调校。
JVM的性能
Tomcat并不是直接在计算机上运行,在它与底层硬件之间还有JVM及操怍系统。不论是 哪种操作系统及结构组合,可用的全功能Java虚拟机器种类相当少,所以人多数的人上 还是会选择Sun公司的,或其系统供货商所实现的JVM。
如果您的目标是运行最快的Java运行时并获取超出Web应用成果许的最大性能,就应在可用于硬件于操作系统组合的每台JVM上对Tomcat和Web应用程序执行基准调校。不要假定Sun的JVM将会成为最快的虚拟机,因为通常都不是这样(至少根据笔者经验)。 应尝试其他品牌、甚至每个品牌的不同主流版本,以查看什么品牌会以最快速度运行您 的特定Web应用程序。
如果您只为必须支持的JVM选择了要使用的某个版本的Java类文件格式(例如, 要为Java1.6 JVM编译Web应用程序).那么您可以对每个支持这一层面字节代码 (bytecode)的可用品牌的JVM进行基准调校,然后选择最满足您需要的虚拟机。例如,如果选择Java 1.6,那么您可以对Sun的1.6、IBM的1.6和BEA的1.6版本的虚拟机进 行基准调校。其中之一将会以最快的速度运行您的Tomcat和Web应用程序。实际产品中,所有这些品牌的虚拟叽都拥有大量用户,并对不同阵营的用户,使用的品牌也明显不同。
作为JVM品牌的主流版本之间改进性能的一般例子、主要版本的更新能给您带来10%的 性能增长^也就是说,从Java 1.5 JVM更新到Java 1.6 JVM,无需修改任何代码,就能使 您的Web运行程序提速10%。这是一种领域勾画,而不是基准调校结果,实际改进的效果随您测试的JVM品牌、版本和Web应用程序完成的任务而变化。
最可能的是,新JVM能改善性能也会更不稳定,佴发布的主要JVM版本时间越长,以作为最终/稳定版本,就越无需担心其稳定性问题。使用最新稳定版的软件是一个不错的经 验,但除最新版本是下一主要软件版本的第一或第二个稳定发行版之外。例如,如果最 新稳定版是1.7.0,如果1.6.29更稳定且执行效果更好,则您可以选择1.6.29。
通常,人们会设法修改JVM启动参数,以使Tomcat JVM能更快地为Web应用程序网页服 务。这可以提供一些帮助,但通常不会在性能上提高较高百分比。其主要原因是这样处理不会太有用:JVM提供商在发布JDK之前就已进行过自身测试,寻找哪些设置会产生 最佳性能,并让这些设置变成默认值。
JVM的堆找内存(heap memory)分配除外。JVM提供商默认选择分配少量内存(在Sun JVM中是32MB)以启动JVM,且如果Java应用程序需要更多内存,那么在应用程序暂 停时,JVM的heap会被重新分配为更大。在达到heap内存大小的最髙限度之前,JVM会 在小内存增长过程中多次执行前面的重新分配。因为应用程序苺次都要暂停,heap大 小才会增长.那么性能也会受到影响。如果在Tomcat正提供Web应用程序网页时发生这 样的事情,那么对所有此时正在请求这一网页的Web客户端而言,暂停发生了,网页响 应所耗时间将显得比IE常情况下要长。为了避免这种暂停,可以设置最小heap大小与 最大heap大小相等,那样处理的话,JVM将不会在运行的时候尝试扩展heap大小。要在 Tomcat的JVM启动参数中处理这件事情,只要设置JAVA_OPTS环境变量为类似于-Xms512M -Xmx512M之类的值。这意味着最大、最小heap都被设置为512MB。在本级上将该参数设置 为合适值,这依启动后还有多少空闲内存而定。
也可以尝试对不同的碎片收集算法设置进行基准调校,但是,如前面阐述的那样,您会发现默认设置总是最快的设置。尽管只有等到基准调校后,您才能明甶这一点。检査正 被基准调校的JVM的文档,寻找启用不同碎片收集算法的启动参数,因为这些设置是 JVM实现明确的。再次,要在JAVA_OPTS中设罝,从而让Tomcat按这--方式启动JVM。
操作系统的性能
至于操作系统呢?您的服务器的操作系统是最适合于运行大型、髙容量的Web服务器吗?当然,不同的操作系统有截然不同的设计目标。例如,OpenBSD的主要目标在安全防护,所以其核心中许多的限制都设得比较低,以防止各种形式的DOS攻击(OpenBSD 的座右铭之一就是“安全优先”)。若要运行繁忙的Web服务器,则很可能需要提髙这些限制值。
一方面,Linux的目标是容易使用,所以其限制值会设得比较高。现货供应的BSD有一种"通用性"的内核,即已经静态地链接了大多数驱动程序。这使启动系统变得容易,不过如果您在构建自定义的内核以提高某些限制,那么您还要剔除不需要的设备。Linux内核会动态加载大多数驱动程序。而在另一方面,因为内存本身愈来愈便宜,所以使用可加载设备驱动程序的理由就变得没有那么重要了。而重要的是要有很多的内存,并让其可被服务器大量使用。
如果您执行任何版本的Microsoft Windows,请确定是Server (例如Windows Vista Server,而非只是Windows Vista Pro)。在非Server的版本中,终端用户的授权协议和 /或操作系统的程序代码都可能会限制用户数、可使用的网络连接数或在可运行的资源上放置其他限制。除此之外,为了最明显的安佥防护理由,请一定要经常取得最新的Microsoft补丁程序(对任何系统也一样,不过对Windows则特别重要)。