[TOC]
Tomcat服务器是一个免费开源的Web应用服务器,是Apache软件基金会的Jakarta项目中的核心项目(被Apache看上的项目一般都是棒棒的)。他完全基于Java平台,是使用广泛的Servlet容器。现在已经发展到Tomcat8.0了。
下面将从五个方面对tomcat进行优化。
1. 启动模式
2. 执行器
3. 连接器参数
4. 禁用AJP连接器
5. tomcat的内存优化
启动模式
Tomcat 有三种启动模式,分别是bio、nio、apr。一般的tomcat7及以下版本在win7及以下版本上默认开启模式为bio,性能最低的启动模式。
启动模式查看方式:
启动startup.bat,这时候,
信息: Deployment of web application directory H:\tomcat\apache-tomcat-7.0.67\web
apps\ROOT has finished in 97 ms
十月 13, 2016 10:16:20 下午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["http-bio-8080"]
十月 13, 2016 10:16:20 下午 org.apache.catalina.startup.Catalina start
信息: Server startup in 1591 ms
在启动信息中,可以看到http-bio-8080,说明使用的是bio启动方式。
这时候,我们可以通过修改server.xml来修改成nio启动方式。至于apr启动方式,需要对环境进行配置,具体可以参考:https://my.oschina.net/lsw90/blog/181161
修改server.xml如下:
<Connector executor="tomcatThreadPool"
port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="100"
minSpareThreads="100"
acceptCount="1000"
compression="on"
disableUploadTimeout="true"
enableLookups="false"
URIEncoding="UTF-8"
/>
添加执行器(线程池)
tomcat线程优化
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="600" minSpareThreads="10"/>
<Connector executor="tomcatThreadPool"
port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="100"
minSpareThreads="100"
acceptCount="1000"
compression="on"
disableUploadTimeout="true"
enableLookups="false"
URIEncoding="UTF-8"
/>
maxThreads=”100” 最大线程数
minSpareThreads=”100” 初始化创建线程数
acceptCount=”1000” 指定等待请求队列数
连接器参数
<Connector executor="tomcatThreadPool"
port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="100"
minSpareThreads="100"
acceptCount="1000"
compression="on"
disableUploadTimeout="true"
enableLookups="false"
URIEncoding="UTF-8"
/>
禁用AJP连接器
用于将Apache与Tomcat集成在一起,当Apache接收到动态内容请求时,通过在配置中指定的端口号将请求发送给在此端口号上监听的AJP连接器组件。
AJP连接器,作用于静态资源的处理。当tomcat处理静态资源的时候,把静态资源转给apache处理,就会出现重复处理的现象,所以把
注释掉。
AJP是为 Tomcat 与 HTTP 服务器之间通信而定制的协议,能提供较高的通信速度和效率。如果tomcat前端放的是apache的时候,会使用到AJP这个连接器。由于我们公司前端是由nginx做的反向代理,因此不使用此连接器,因此需要注销掉该连接器。
tomcat的内存优化
结合jMeter和jConsole适当调节新生代、老年代的大小。
linux 修改 TOMCAT_HOME/bin/catalina.sh
windows 修改 TOMCAT_HOME/bin/catalina.bat
set JAVA_OPTS=-Xms128m -Xmx512m -XX:PermSize=128M -XX:MaxPermSize=1024m
set CATALINA_OPTS=-Xloggc:gc.log -XX:+PrintGCDetails
set CATALINA_OPTS=%CATALINA_OPTS% -Xmx32m -Xms32m -XX:NewRatio=2 -Xverify:none
禁用DNS查询
当web应用程序向要记录客户端的信息时,它也会记录客户端的IP地址或者通过域名服务器查找机器名 转换为IP地址。
DNS查询需要占用网络,并且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的IP的过程,这样会消耗一定的时间。
修改server.xml文件中的Connector元素,修改属性enableLookups参数值: enableLookups=”false”
如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址
session过期时间
conf\web.xml中通过参数指定:
<session-config>
<session-timeout>180</session-timeout>
</session-config>
Apr插件提高Tomcat性能
Tomcat可以使用APR来提供超强的可伸缩性和性能,更好地集成本地服务器技术.
APR(Apache Portable Runtime)是一个高可移植库,它是Apache HTTP Server 2.x的核心。APR有很多用途,包括访问高级IO功能(例如sendfile,epoll和OpenSSL),OS级别功能(随机数生成,系统状态等等),本地进程管理(共享内存,NT管道和UNIX sockets)。这些功能可以使Tomcat作为一个通常的前台WEB服务器,能更好地和其它本地web技术集成,总体上让Java更有效率作为一个高性能web服务器平台而不是简单作为后台容器。
在产品环境中,特别是直接使用Tomcat做WEB服务器的时候,应该使用Tomcat Native来提高其性能
要测APR给tomcat带来的好处最好的方法是在慢速网络上(模拟Internet),将Tomcat线程数开到300以上的水平,然后模拟一大堆并发请求。
如果不配APR,基本上300个线程狠快就会用满,以后的请求就只好等待。但是配上APR之后,并发的线程数量明显下降,从原来的300可能会马上下降到只有几十,新的请求会毫无阻塞的进来。
在局域网环境测,就算是400个并发,也是一瞬间就处理/传输完毕,但是在真实的Internet环境下,页面处理时间只占0.1%都不到,绝大部分时间都用来页面传输。如果不用APR,一个线程同一时间只能处理一个用户,势必会造成阻塞。所以生产环境下用apr是非常必要的。
参考:
http://www.cnblogs.com/ggjucheng/archive/2013/04/16/3024731.html
http://nolinux.blog.51cto.com/4824967/1608940