优化一: Connector、Executor
执行器 Executor
Tomcat 默认没有启动线程池。
在 server.xml 中打开注释,启用线程池。根据主机性能和需求改变 maxThreads 和 minSpareThreads 的大小,并且要将 Executor 的 name 名称添加到端口号处。
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="800" minSpareThreads="100" maxQueueSize="100" prestartminSpareThreads="true" />
Connector协议
Tomcat 有三种协议:bio、nio、apr。
1)bio:Tomcat7 以前版本默认模式,一个线程处理一个请求,没有经过任何优化处理。并发量高时,线程数最多,浪费资源,并且是阻塞式线程。
protocol="org.apache.coyote.http11.Http11Protocol"
2)nio:利用 Java 的非阻塞 IO。Tomcat8 默认使用这种方式,Tomcat7 需要修改 server.xml 的 Connector 节点的protocol。
protocol="org.apache.coyote.http11.Http11NioProtocol"
3)apr:Apache Portable Runtime,是Apache可移植运行库,利用本地库可以实现高可扩展性、高性能;Apr是在Tomcat上运行高并发应用的首选模式,但是需要安装apr、apr-utils、tomcat-native等包。
protocol="org.apache.coyote.http11.Http11AprProtocol"
Connector
连接器 Connector 是 Tomcat 接收请求的入口。当客户端请求服务器时,客户端协议与服务器OS完成三次握手建立连接,OS将请求放入accept队列,处理队列中的请求时,生成request,调用servlet容器处理请求,最后返回response。这里蕴含两层含义:连接和请求。连接是指客户端与服务器依赖的TCP协议的链接,请求是指HTTP层面,一个TCP连接中可以传输多个HTTP请求。
Tomcat存放请求的accept队列类似于Java中的Executor的队列,请求的处理实际上是由线程池中的Worker线程完成的。
与执行器配合使用:
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="600" minSpareThreads="100" maxSpareThreads="500" maxQueueSize="100" prestartminSpareThreads="true"/>
<Connector executor="tomcatThreadPool" port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
acceptCount="700"
maxConnections="700"
connectionTimeout="20000"
maxHttpHeaderSize="8192"
tcpNoDelay="true"
compression="on"
compressionMinSize="2048"
disableUploadTimeout="true"
redirectPort="8443"
enableLookups="false"
URIEncoding="UTF-8"/>
连接器单独使用(不需要同执行器一块使用):
<Connector port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="600"
minSpareThreads="100"
maxSpareThreads="500"
acceptCount="700"
maxConnections="700"
connectionTimeout="20000"
maxHttpHeaderSize="8192"
tcpNoDelay="true"
compression="on"
compressionMinSize="2048"
disableUploadTimeout="true"
redirectPort="8443"
enableLookups="false"
URIEncoding="UTF-8"/>
优化二:禁用AJP Connector连接器
AJP:Apache JServer Protocol服务器内部的协议。
Web 服务器是通过 Tcp 来交互的,为了节省 socket 的创建,Web 服务器会尝试维护一个永久的 Tcp 连接到 Servlet 容器。禁用 AJP 时,Tomcat 可以直接跳过静态资源的处理,实现动静分离。
在 server.xml 中注释掉:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
优化三:JVM 参数优化
1)Java 栈内存
2)堆内存
- Windows 版本,修改 bin/catalina.bat 文件:*
set JAVA_OPTS=-Dfile.encoding=UTF-8 -server -Xms1024M -Xmx2048M -XX:NewSize=512M -XX:MaxNewSize=1024M -XX:PermSize=256M -XX:MaxPermSize=256M -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:+DisableExplicitGC
- linux 版本,修改 bin/catalina.sh 文件:*
set JAVA_OPTS="-Dfile.encoding=UTF-8 -server -Xms1024M -Xmx2048M -XX:NewSize=512M -XX:MaxNewSize=1024M -XX:PermSize=256M -XX:MaxPermSize=256M -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:+DisableExplicitGC"
配置 Tomcat 的用户名和密码
如果想在 Tomcat 的主页查看服务器的状态和内存配置,需要配置管理员的用户名和密码。
在 config/tomcat-user.xml 中配置用户名和密码,配置的用户名为 tomcat,密码为 tomcat,登录之后可以看到服务器的状态。
<role rolename="manager"/>
<role rolename="manager-gui"/>
<role rolename="admin"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="admin,manager,admin-gui,manager-gui"/>