CentOS下Tomcat性能调优策略
CentOS默认文件描述符限制(nofile)过低,会限制Tomcat并发连接数。编辑/etc/security/limits.conf,添加以下内容:
* soft nofile 65536(软限制)、* hard nofile 65536(硬限制),保存后重新登录生效。
修改/etc/sysctl.conf,提升网络并发处理能力:
net.core.somaxconn = 65535 # 监听队列最大长度(需>=Tomcat的acceptCount)
net.ipv4.tcp_tw_reuse = 1 # 允许复用TIME_WAIT状态的连接
net.ipv4.tcp_max_syn_backlog = 65535 # SYN队列最大长度
net.ipv4.ip_local_port_range = 1024 65535 # 本地端口范围(扩大可用端口数)
执行sysctl -p使配置生效。
透明大页会导致内存碎片,降低Tomcat性能。编辑/etc/rc.local,添加以下命令(开机自动执行):
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
通过server.xml中的<Executor>和<Connector>配置线程池,合理分配线程资源:
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="500" <!-- 最大线程数(根据CPU核心数调整,如4核可设200-500) -->
minSpareThreads="50" <!-- 最小空闲线程数(保持备用线程,应对突发请求) -->
maxQueueSize="100" <!-- 请求队列最大长度(避免无限制排队)" />
<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" redirectPort="8443" />
说明:maxThreads需结合CPU核心数(如物理核心数×2+1)和业务负载调整,避免过大导致线程切换开销。
优先使用NIO(非阻塞I/O)或NIO2(异步I/O)协议,替代默认的BIO(阻塞I/O),提升高并发下的吞吐量:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
maxThreads="500" connectionTimeout="20000" />
调整<Connector>的关键连接数参数,避免连接被拒绝:
maxConnections:Tomcat能接受的最大连接数(默认10000,可根据服务器资源调整至20000+);acceptCount:当所有线程忙碌时,允许的最大排队请求数(需>=maxConnections,如设为1000);connectionTimeout:连接超时时间(默认20000ms,可根据业务调整至30000ms)。<Connector port="8080" protocol="HTTP/1.1"
maxThreads="500" minSpareThreads="50" maxConnections="20000"
acceptCount="1000" connectionTimeout="30000" />
enableLookups="false"(避免Tomcat解析客户端IP对应的域名,减少网络开销);<Connector port="8009" protocol="AJP/1.3"/>;server.xml的<Connector>中添加server="Apache"(避免暴露Tomcat版本,提升安全性)。通过catalina.sh(或setenv.sh)设置JVM堆内存,避免频繁Full GC:
export JAVA_OPTS="$JAVA_OPTS -Xms2g -Xmx4g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1g"
说明:
-Xms(初始堆内存)和-Xmx(最大堆内存)需设置为相同值(避免堆内存动态调整的开销);Metaspace替代PermGen(永久代),设置MetaspaceSize和MaxMetaspaceSize。优先使用G1GC(Garbage-First Garbage Collector),适用于大内存应用,能有效减少GC停顿时间:
export JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC"
可选参数:
-XX:MaxGCPauseMillis=200(设置最大GC停顿时间目标,默认200ms);-XX:InitiatingHeapOccupancyPercent=45(触发并发GC的堆占用率阈值,默认45%)。通过server.xml配置Gzip压缩,减少网络传输数据量(适用于文本类响应,如HTML、CSS、JS):
<Connector port="8080" protocol="HTTP/1.1"
compression="on" compressionMinSize="2048"
compressableMimeType="text/html,text/css,application/javascript" />
说明:compressionMinSize设置触发压缩的最小响应大小(默认2048字节);compressableMimeType指定需要压缩的MIME类型。
通过web.xml配置静态资源(图片、CSS、JS)的缓存策略,减少重复请求:
<filter>
<filter-name>ExpiresFilter</filter-name>
<filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class>
<init-param>
<param-name>ExpiresByType image</param-name>
<param-value>access plus 1 month</param-value>
</init-param>
<init-param>
<param-name>ExpiresByType text/css</param-name>
<param-value>access plus 1 week</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>ExpiresFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
/actuator/prometheus指标(需Tomcat 9.0+),可视化展示性能趋势。server.xml中配置AccessLogValve),记录请求时间、响应状态码等信息,分析慢请求;jmap -dump:live,format=b,file=heap.hprof <pid>),使用MAT(Eclipse Memory Analyzer)分析内存泄漏。对于长期运行的Tomcat,定期重启(如每周一次)可释放内存碎片,避免内存泄漏累积导致的性能下降。