CentOS环境下Tomcat资源占用优化指南
默认情况下,CentOS对单个用户的文件描述符限制较低(通常为1024),会限制Tomcat的并发连接数。需修改/etc/security/limits.conf文件,添加以下内容:
* soft nofile 65536(软限制)
* hard nofile 65536(硬限制)
修改后需重新登录用户或重启系统生效。
编辑/etc/sysctl.conf文件,添加以下参数以提升网络性能:
net.core.somaxconn 65535:增加TCP监听队列的最大长度,避免连接被拒绝;net.ipv4.tcp_tw_reuse 1:允许复用TIME_WAIT状态的连接,减少连接建立开销;net.ipv4.tcp_tw_recycle 1:快速回收TIME_WAIT连接(注意:在NAT环境下可能引发问题,需谨慎使用)。sysctl -p使配置生效。THP会导致内存碎片化,影响Tomcat的内存访问效率。编辑/etc/rc.local文件(需赋予执行权限),添加以下命令:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
重启服务器使设置生效。
线程池是Tomcat处理并发请求的核心,需合理配置server.xml中的<Executor>和<Connector>元素:
<Service>标签内添加<Executor>,设置以下参数:<Executor name="tomcatThreadPool"
namePrefix="catalina-exec-"
maxThreads="200" <!-- 最大线程数(建议为CPU核心数的2-4倍,如4核CPU设为80-160) -->
minSpareThreads="20" <!-- 最小空闲线程数(保持活跃线程,避免频繁创建) -->
acceptCount="300" <!-- 最大排队请求数(当所有线程繁忙时,允许排队的请求数,建议为maxThreads的1.5-2倍) -->
maxQueueSize="100" <!-- 队列最大长度(超过则拒绝请求) -->
/>
<Connector>标签,引用上述线程池:<Connector executor="tomcatThreadPool"
port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol" <!-- 使用NIO协议提升I/O性能 -->
connectionTimeout="20000"
keepAliveTimeout="5000"
maxKeepAliveRequests="100" <!-- 限制单个连接的请求数,避免长期占用线程 -->
/>
注:maxThreads并非越大越好,过大会导致CPU上下文切换频繁,需结合服务器硬件配置调整。protocol属性设置为org.apache.coyote.http11.Http11NioProtocol(NIO)或org.apache.coyote.http11.Http11Nio2Protocol(NIO2),显著提升高并发下的I/O处理能力。<Connector port="8443"
protocol="org.apache.coyote.http2.Http2Protocol"
SSLEnabled="true"
maxThreads="150"
keystoreFile="conf/keystore.jks"
keystorePass="changeit" />
connectionTimeout(连接超时)设置为20000毫秒(20秒),keepAliveTimeout(保持连接超时)设置为5000毫秒(5秒),避免闲置连接占用资源。通过压缩响应数据减少网络传输量,提升页面加载速度。在<Connector>标签中添加:
compression="on"
compressionMinSize="2048"(最小压缩大小,超过2KB才压缩)
compressableMimeType="text/html,text/xml,text/plain,application/json"(需要压缩的MIME类型)。
根据服务器内存大小设置初始堆(-Xms)和最大堆(-Xmx),建议两者相等以避免频繁扩容(如4GB内存服务器可设置为-Xms2g -Xmx2g)。编辑catalina.sh(位于/usr/share/tomcat/bin/或/opt/tomcat/bin/)文件,在JAVA_OPTS中添加:
JAVA_OPTS="$JAVA_OPTS -Xms2g -Xmx2g"。
JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC"JAVA_OPTS="$JAVA_OPTS -XX:+UseParallelGC"。新生代(Young Generation)用于存放新创建的对象,老年代(Old Generation)用于存放长期存活的对象。通过-XX:NewRatio设置比例(如-XX:NewRatio=2表示新生代占堆的1/3,老年代占2/3)。若应用对象生命周期短(如Web应用),可适当增大新生代比例(如-XX:NewRatio=1)。
jstat监控GC情况:执行jstat -gcutil <pid> 1000(<pid>为Tomcat进程ID),查看各内存区域的使用率(如O表示老年代,M表示元空间),若老年代持续增长且触发Full GC,可能存在内存泄漏。jmap生成堆转储文件:jmap -dump:live,format=b,file=heapdump.hprof <pid>,再用jhat或VisualVM分析泄漏对象。conf/tomcat-users.xml删除管理员角色,或注释<Context>标签中的/manager和/host-manager应用。conf/server.xml,将autoDeploy="true"改为autoDeploy="false",避免频繁扫描webapps目录消耗资源。修改conf/server.xml中的<Connector>标签,添加server属性:
server="Unknown"
避免暴露Tomcat版本,减少安全风险。
长期运行后,Tomcat可能出现内存碎片或类加载器泄漏,建议每周重启一次(可通过cron定时任务实现)。
使用监控工具(如Prometheus+Grafana、VisualVM、JConsole)实时监控Tomcat的CPU使用率、内存占用、线程池状态、GC频率等指标,根据监控数据调整上述参数(如maxThreads、-Xmx),确保资源占用处于合理范围。