操作系统是Tomcat运行的基础,需先调整内核参数与文件描述符限制,确保系统能支撑高并发。
调整内核参数
编辑/etc/sysctl.conf文件,添加以下参数以优化网络性能:
net.core.somaxconn = 65535 # 监听队列最大长度,需大于Tomcat的acceptCount
net.ipv4.tcp_tw_reuse = 1 # 允许复用TIME_WAIT状态的连接
net.ipv4.tcp_tw_recycle = 1 # 快速回收TIME_WAIT连接(注意:Linux 4.12+版本需关闭)
net.ipv4.ip_local_port_range = 1024 65535 # 允许本地端口范围,避免端口耗尽
net.ipv4.tcp_max_syn_backlog = 65535 # SYN队列最大长度,应对高并发连接请求
net.ipv4.tcp_syncookies = 1 # 开启SYN Cookie,防止SYN Flood攻击
执行sysctl -p使配置生效。
增加文件描述符限制
编辑/etc/security/limits.conf文件,添加以下内容以提升单个用户的最大文件描述符数(Tomcat处理请求需大量文件描述符):
* soft nofile 65536 # 软限制(当前用户可临时调整至的最高值)
* hard nofile 65536 # 硬限制(系统允许的最高值)
编辑/etc/pam.d/login文件,确保包含以下行(使限制生效):
session required pam_limits.so
Tomcat自身的参数调整直接影响并发处理能力与资源利用率,重点优化连接器、线程池与连接器协议。
配置线程池
在server.xml中定义Executor(线程池),然后在Connector中引用,实现线程资源的统一管理:
<!-- 定义线程池 -->
<Executor name="tomcatThreadPool"
namePrefix="catalina-exec-"
maxThreads="500" <!-- 最大线程数(并发处理的最大请求数,根据服务器CPU核心数调整,如8核可设为200-500) -->
minSpareThreads="50" <!-- 最小空闲线程数(保持的最小线程数,快速响应突发请求) -->
maxQueueSize="100" <!-- 线程池队列最大长度(超过则拒绝请求)" -->
/>
<!-- 引用线程池的Connector -->
<Connector executor="tomcatThreadPool"
port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol" <!-- 使用NIO协议(高并发场景推荐) -->
connectionTimeout="20000" <!-- 连接超时时间(毫秒,默认20秒,可根据业务调整) -->
redirectPort="8443"
acceptCount="100" <!-- 当所有线程都在忙时,允许的最大排队请求数(需大于maxThreads) -->
/>
注:maxThreads需结合服务器硬件配置(如CPU核心数、内存大小)调整,避免设置过大导致线程切换开销增加。
优化连接器协议
默认的BIO(阻塞式)协议性能较差,需更换为NIO(非阻塞式)或NIO2(异步非阻塞式):
<Connector port="8080"
protocol="org.apache.coyote.http11.Http11Nio2Protocol" <!-- NIO2协议(比NIO更适合高延迟网络) -->
... />
若需支持HTTP/2协议(提升多路复用效率),可使用:
<Connector port="8443"
protocol="org.apache.coyote.http2.Http2Protocol"
SSLEnabled="true"
keystoreFile="conf/keystore.jks"
keystorePass="changeit"
maxThreads="200" />
启用压缩功能
减少网络传输的数据量,提升页面加载速度:
<Connector ...
compression="on" <!-- 开启压缩 -->
compressionMinSize="2048" <!-- 最小压缩大小(字节,默认2048) -->
compressableMimeType="text/html,text/xml,text/plain,application/json" <!-- 需要压缩的MIME类型 -->
/>
禁用不必要的功能
关闭Tomcat管理界面(若无需使用)、自动部署和war包解压,减少资源消耗:
<Host name="localhost"
appBase="webapps"
unpackWARs="false" <!-- 不自动解压war包 -->
autoDeploy="false" <!-- 关闭自动部署 -->
deployOnStartup="false" <!-- 启动时不自动部署 -->
>
<!-- 注释或删除Manager应用(默认路径:/manager) -->
<!-- <Context path="/manager" docBase="${catalina.home}/webapps/manager" /> -->
</Host>
隐藏版本信息
避免暴露Tomcat版本,减少安全风险:
编辑server.xml中的Connector,添加server属性:
<Connector ...
server="Unknown" <!-- 隐藏版本信息 -->
/>
或修改conf/server.xml中的<Server>标签:
<Server port="8005" shutdown="SHUTDOWN" server="Custom Server">
JVM内存配置直接影响Tomcat的垃圾回收频率与应用稳定性,需根据应用内存需求调整。
设置堆内存大小
编辑bin/catalina.sh文件(Linux下),在文件开头添加以下参数:
JAVA_OPTS="$JAVA_OPTS -Xms2048m -Xmx2048m -Xmn1024m"
参数说明:
-Xms:初始堆内存大小(建议与-Xmx一致,避免堆内存动态调整的开销);-Xmx:最大堆内存大小(根据服务器内存调整,如8GB内存可设为4-6GB);-Xmn:年轻代大小(建议为堆内存的1/3-1/2,提升Minor GC效率)。选择垃圾回收器
针对不同Java版本选择合适的垃圾回收器:
JAVA_OPTS="$JAVA_OPTS -XX:+UseParallelGC -XX:+UseParallelOldGC"
JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -XX:MaxGCPauseMillis=200" <!-- 设置最大GC停顿时间(毫秒) -->
JAVA_OPTS="$JAVA_OPTS -XX:+UseZGC"
调整永久代/元空间大小
JAVA_OPTS="$JAVA_OPTS -XX:PermSize=256m -XX:MaxPermSize=512m"
JAVA_OPTS="$JAVA_OPTS -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"
注:若应用加载大量类(如动态代理、第三方库),需适当增大元空间大小,避免OutOfMemoryError: Metaspace错误。
若应用使用数据库,需调整连接池参数,避免数据库成为性能瓶颈(以DBCP为例):
编辑context.xml文件(位于conf/目录下),配置数据源:
<Resource name="jdbc/mydb"
auth="Container"
type="javax.sql.DataSource"
maxTotal="100" <!-- 最大连接数(需小于数据库的最大连接数) -->
maxIdle="30" <!-- 最大空闲连接数(保持的空闲连接,快速响应请求) -->
minIdle="10" <!-- 最小空闲连接数(避免频繁创建连接) -->
maxWaitMillis="10000" <!-- 获取连接的最大等待时间(毫秒,超时报错) -->
removeAbandoned="true" <!-- 是否移除泄露的连接 -->
removeAbandonedTimeout="300" <!-- 泄露连接的超时时间(秒,300秒未归还则移除) -->
logAbandoned="true" <!-- 记录泄露连接的日志 -->
/>
注:maxTotal需根据数据库的max_connections参数调整(如MySQL默认max_connections=151,需预留部分连接给其他应用)。
优化后需通过监控工具验证效果,持续调整参数:
catalina.out或localhost_access_log中的错误日志(如OutOfMemoryError、Connection refused),定位性能瓶颈。以上配置需根据服务器硬件(CPU、内存、硬盘)、应用场景(高并发、大数据量)逐步调整,每次调整后需重启Tomcat并观察性能变化,避免过度优化导致系统不稳定。