上期我们讲到LoaRunner性能测试Tomcat调优,这期我们讲LoaRunner性能测试Tomcat配置。
Tomcat配置
当Tomcat服务器安装好并开始运行后,需要对服务器进行一些基本配置,通常关于Tomcat服务器的配置包括两部分:第一:编辑Tomcat的XML配置文件;第二:确定适当的环境变量;
XML配置文件 关于XML配置文件,Tomcat服务器有两个很重要的XML配置文件需要配置:server.xml和web.xml。通常情况下这两个文件存放Tomcat安装目录下的conf文件夹中。
server.xml文件是Tomcat最主要的配置文件,该文件主要是指定Tomcat启动时的初次配置,并定义Tomcat启动和构建的方式。server.xml文件中包含五类基本类别:顶层元素、连接器、容器、嵌套组件和全局设置。这些类别都有着很多属性,在配置过程中可以对这些值进行微调,通常包括以下几部分的内容:
顶层元素(TopLevelElements) 关于顶层元素主要包括服务器和服务两类,服务器主要定义一个单个的Tomcat服务器,主要包括Logger和ContextManager配置,此外还包括服务器支持的“端口”、“关机”和“类名”属性。服务则是一个元素,该元素嵌套在一个服务器中,服务包含一个或多个用于共享相同引擎的组件,该组件主要功能是定义一个单一服务器的组件,服务的名称在“name”属性中指定。
连接器(Connectors) 在服务器标签中可以定义一个或多个连接器,通过Catalina从这些端口向引擎组件发送请求,Tomcat允许定义HTTP和AJP两种连接器,关于这两种连接器将在连接器部分的内容中进行详细介绍。
容器(Containers) 这些元素使用Catalina直接处理设备的请求。
上下文(Context) 此元素是一个单一的web应用,并且包含如果查找到最适合的应用程序资源的路径信息,当Catalina接收到一个请求后,它使用context去匹配最长的URL,直到找到正确的服务请求元素,context元素为每个元素设置一个最大的嵌套实例,虽然可以通过修改server.xml文件来修改context的内容,但一般情况下不应该修改context内容,因为这些配置如果不重启Tomcat服务器不能被加载。 主机(Host) 这个元素嵌套在引擎元素中,用于关联Catalina服务器所在网络中的网络服务器名,这个元素的功能只有在虚拟机注册DNS管理域的过程中才能正确使用,该元素最大的作用是嵌套别名,可以为同一个虚拟机定义多个不同的别名。 集群(Cluster) 集群元素能够提供上下文属性复制、WAR部署、会话复制并且将其嵌套在一个引擎或主机元素中,虽然可以对这个元素进行配置,但一般情况下缺省设置就可以满足用户的需求。
全局命名资源(GlobalNamingResources) 这个元素主要是为一个指定服务器指定全局Java名和目录接口资源,可以在该元素中定义<resource-ref>和<resource-env-ref>的查找特征并且可以使用<ResourceLink>进行链接。如果使用该技术定义其它的参数,那么必须指定和配置对象属性。
范围(Realm) 这个元素可以被嵌套在任何容器元素中,用于定义数据库用户名、密码和容器的角色,如果嵌套在主机或引擎元素中,那么Realm元素的特征将会继承低级别容器的特性。Realm元素中最重要的属性是“classmate”,其主要提供不同类型容器的安全性,并且实现的方式有多种。
资源(Resources) 这个元素主要是用于通过web应用程序引导Catalina的静态资源,常见的静态资源有:类、HTML和JSP文件等。
Web.xml文件 Web.xml文件遵从Servlet规范,其主要包含的信息用于部署和配置web应用程序,如果是第一次配置Tomcat,那么主要是定义Servlet映射到主要的部件(如JSP)。在Tomcat中,这个文件以同样的方式在Servlet规范中描述这些功能。 环境变量 在第一次配置Tomcat时,有几个环境需要进行适当的修改主要包括:JAVA_OPTSCATALINA_HOMECATALINA_OPTS JAVA_OPTS 使用该变量可以定义JVM中堆的大小,堆大小是一个很重要的指标,当在部署一个新的应用程序时,需要设置一个适当的堆大小的值,否则会影响系统性能,同时可以消除或减小OOME消息。
CATALINA_HOME 该变量用于指定Tomcat的安装位置,当Tomcat脚本启动时会自动去检查这个变量的值,以确定设置是否正确,避免运行过程中出现问题。
CATALINA_OPTS 该变量用于设置Tomcat指定的不同的选项。 除了以上一些配置外,还有两个相关的配置会影响系统性能:DNS查找和JSP编译。
DNS查找 如果web应用服务器需要获得客户端的日志信息,那么通常有两种方式:
-
是记录客户端机器的IP地址;
-
是在DNS中查找客户端主机名信息;
而DNS查询需要网络流量,在查询过程中可能会经历多个服务器的往返查找,但也可能不需要,这样就会导致出现延迟响应的情况,如果需要消除这些延迟响应,就必须关闭DNS查询,在HTTP对象中有一个getRemoteHost的方法,通过这个方法可以找到一个唯一的IP地址,关于DNS的选项设置在server.xml文件中的connector(连接器)中设置,源代码如下: <!-- Defineanon-SSLCoyoteHTTP/1.1Connectoronport8080 --> <Connector className="org.apache.coyote.tomcat4.CoyoteConnector" port="8080"minProcessors="5"maxProcessors="75" enableLookups="true"redirectPort="8443" acceptCount="10"debug="0"connectionTimeout="20000" useURIValidationHack="false" /> 如果需要关闭DNS查找,那么将该选项设置为“false”。除非需要指定一个完整的主机名去访问网站,否则都需要将该选项设置为“false”,这样不但可以节约带宽、查找时间和内存。当然对于低流量的网站,这个设置项可能不会有明显的效果,但是不能排除它某天变成了一个高流量的网站。
JSP编译 在一个JSP页面第一次被访问时,它需要转换为Javaservlet源码,并且编译在JAVA字节码,而当许多不同用户同时访问JSP页面时,服务器可能会被处于一种高负载状态,所以应该改善网站对JSP页面的处理方法,进而优化JSP的性能。 Tomcat如何处理JSP页面 JSP是Javaservlet代码与HTML标记的组合,Tomcat处理JSP是使用一个称为Jasper2的引擎,该引擎包括各种处理和解析JSP的组件,以及JSP的编译器。在一个JSP页面第一次被访问时,Jasper引擎会将源码转换为Javaservlet源码,并且使用JAVA编译器将其编译成JAVA字节码。 审核动态内容 JSP性能改进的第一步是采取分析网站的结构、预期负载和JSP页面需要实现的功能,如果创建的网站中混杂着动态和静态,当网站可以完成定期更新静态内容时,那么应该是动态处理结束后才多的去处理静态内容,例如网站的标题,这是一个动态的内容,但是一天可能才处理一两次。
现在解决动态审核问题不完全是使用,现在有一些开源于JAVA模板来解决这个问题(如Velocity或Freemarker),在未来可能会成为一个新的功能。
JSP预编译技术 当服务器运行JSP页面时服务器会使用最大的性能来编译JSP页面,如果缓解这一问题,一般会对JSP进行预编译操作,而不是等运行时才进行实时的编译。通常有以下三种预编译的方法来提高系统的性能。
第一:使用请求进行预编译 预编译的一次最简单的方法是,在发送请求的过程中进行预编译,因为在第一次发送请求时,JSP会自动进行编译,这样在第一个真实的用户访问该JSP页面时就不需要再编译了,如果只少数JSP页面,并且不需要频繁的启动服务器,这样可以在服务器启动时,使用一个小脚本自动爬行所有的JSP页面,这样可以大大的提高性能。这个方法在开发过程中很有用,因为这种方法可以查找是那些用户第一时间访问JSP页面,并且可以纠正一些错误。 第二:启动时进行预编译 JAVA中有一个Javaservlet的模块,它包括JSP指定的一些功能和语法元素,这些语法在Web应用程序启动时会指定JSP进行编译,在“WEB-INF/web.xml”文件中可以对JSP进行预编译设置,如以下实例: <web-app...> <servlet> <servlet-name>YourJSP.jsp</servlet-name> <jsp-file>/path/to/yourjsp.jsp</servlet-name> <load-on-startup>1</load-on-startup> </servlet> </web-app> 整数“1”是用来指定编译序顺的,所以可以为预编译创建一个层次结构,这样可以消除第一个用户访问预编译页面的时间延迟,降低web程序重启的所需要的资源。 第三:在编译过程中进行预编译 在编译过程中进行预编译是指在构建Web应用程序时,使用JspC进行预编译JSP代码,而不是在Tomcat服务器上进行动态编译,在一些情况中下这种技术可以提高4%的系统性能。
JSP最佳实践 前面介绍了通过修改Tomcat配置文件来提高JSP性能,而遵守一些编码规则也可以提高JSP的性能,通常有两种方法:高效缓存和对象控制。 第一:在代码中如何有效提高JSP原始的缓存数据可以有效的提高性能,即如何有效的利用缓存中的数据或如何高效使用缓存方法来处理数据。 第二:目标控制,主要包括会话长度/范围、线程池配置和缓存区大小。
JSP数据缓存 如果JSP页面已经产生了一些静态或动态内容,那么这种情况不要它再出现,因为它可以通过会话或应用程序调用缓存数据,为了得到安全的动态内容,这样会重复使用所有活动会话。
生成静态文件使用了一次_jsplnit()方法,同时使用_jspService方法对数据进行备份,但不在每次请求页面时使用out.print()。缓存中的动态数据有4个持久机制,Tomcat原始的持久机制、cookies、URL重写和隐藏区域。
通常的一个解决方案是,平衡客户端和服务器间的负载、安全缓存(Tomcat持续支持安全的存储数据)和处理隐藏区域。
对象控制 在关闭会话、重新使用标签和配置缓存区时,很容易浪费服务器CPU时间周期,特别是在清理JSP代码时需要考虑这个问题,所以可以考虑移除大数据和关闭会话、对象。在整个页面生成过程中一次性移除大数据(如图片),通常使用flush()方法移除,并且应该考虑设置缓存大小。在控制对象时,JSP包括处理会话、孤立对象和饥饿内存的处理机制,如超时和序列化。