CentOS下Tomcat性能瓶颈解决方法
JVM内存配置是Tomcat性能的基础,不合理的内存设置易导致内存溢出(OOM)或频繁GC,影响响应速度。
-Xms(初始堆)和-Xmx(最大堆)参数设置堆内存,建议两者值相等以避免堆扩展带来的性能损耗(如-Xms4G -Xmx4G)。-XX:MetaspaceSize(初始元空间)和-XX:MaxMetaspaceSize(最大元空间)替代永久代,避免元空间溢出(如-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m)。-XX:+UseG1GC),适用于大内存堆,能平衡吞吐量和延迟;若需低延迟,可选用ZGC(-XX:+UseZGC,需JDK 11+)。-XX:NewRatio设置(如-XX:NewRatio=2表示新生代占堆的1/3),根据应用对象生命周期调整(短生命周期对象多则增大新生代)。线程池是处理并发请求的核心,配置不当会导致线程阻塞或资源浪费。
server.xml中定义Executor,设置maxThreads(最大线程数,根据CPU核心数和业务调整,如2核4G内存可设为200)、minSpareThreads(最小空闲线程数,保持50~100以快速响应请求)、maxQueueSize(队列长度,避免无限制排队导致内存溢出,如100)。Executor与Connector绑定(executor="tomcatThreadPool"),并选择高性能协议(如NIO:protocol="org.apache.coyote.http11.Http11NioProtocol")。连接器负责处理HTTP请求,其配置直接影响吞吐量和响应时间。
protocol="org.apache.coyote.http11.Http11NioProtocol")。protocol="org.apache.coyote.http2.Http2Protocol"开启HTTP/2,支持多路复用、头部压缩,减少页面加载时间。maxConnections(最大连接数,如10000,支持更多并发)、connectionTimeout(连接超时时间,如20000ms,避免长时间占用连接)、keepAliveTimeout(Keep-Alive超时时间,如5000ms,复用连接减少握手开销)。操作系统参数限制会影响Tomcat的并发处理能力,需调整内核参数。
/etc/security/limits.conf,添加* soft nofile 65536和* hard nofile 65536,提升Tomcat能处理的并发连接数。/etc/sysctl.conf,设置net.core.somaxconn=65535(最大连接队列长度)、net.ipv4.tcp_tw_reuse=1(允许TCP连接复用)、net.ipv4.tcp_tw_recycle=1(快速回收TIME_WAIT连接),提升网络性能。/etc/rc.local添加echo never > /sys/kernel/mm/transparent_hugepage/enabled和echo never > /sys/kernel/mm/transparent_hugepage/defrag,禁用该功能。减少数据传输量和磁盘访问次数,提升响应速度。
Connector中设置compression="on",并指定压缩类型(如compressableMimeType="text/html,text/xml,text/plain,application/json"),减少网络传输的数据量。Expires或Cache-Control头缓存静态资源(如图片、CSS、JS),减少对磁盘的访问次数(可在应用代码或反向代理中配置)。减少Tomcat的资源消耗,提升性能。
server.xml中的AJP Connector(<Connector protocol="AJP/1.3" .../>)。server.xml中设置autoDeploy="false",避免Tomcat自动扫描和部署war包,减少CPU和内存开销。server.xml的Connector中添加server=" ",避免暴露Tomcat版本,减少安全风险。通过监控定位性能瓶颈,合理配置日志避免影响性能。
logging.properties中的日志级别调整为WARN或ERROR,避免过多的INFO日志占用磁盘IO和内存(如org.apache.catalina.level=WARN)。-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/to/gc.log),通过分析GC频率和耗时,优化JVM内存配置。Tomcat性能也受应用代码影响,需优化代码逻辑。
new String()),使用对象池(如数据库连接池)重用对象。