CentOS系统Tomcat性能调优技巧
默认情况下,CentOS对单个用户的文件描述符限制(nofile)较低,会限制Tomcat的并发连接数。需修改/etc/security/limits.conf文件,添加以下内容:
* soft nofile 65536
* hard nofile 65536
这会将普通用户的文件描述符软限制设为65536、硬限制设为65536,允许Tomcat处理更多并发连接。
编辑/etc/sysctl.conf文件,添加以下参数以提升网络性能:
net.core.somaxconn 65535:增加TCP监听队列的最大长度,避免连接被拒绝;net.ipv4.tcp_tw_reuse 1:允许复用处于TIME_WAIT状态的TCP连接,减少连接建立开销;net.ipv4.tcp_tw_recycle 1:快速回收TIME_WAIT连接(注意:在NAT环境下可能引发问题,需谨慎使用)。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" minSpareThreads="50" maxQueueSize="100"/>
<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" redirectPort="8443"/>
maxThreads:最大线程数(根据服务器CPU核心数和业务负载调整,建议200-1000);minSpareThreads:最小空闲线程数(保持一定数量的线程,快速响应新请求,建议20-100);maxQueueSize:请求队列长度(超过maxThreads的请求会进入队列,避免无限制排队,建议100以内)。默认的HTTP/1.1协议性能有限,建议使用NIO(非阻塞I/O)或NIO2(异步I/O)协议。修改Connector的protocol属性:
<Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="20000" redirectPort="8443"/>
NIO2比NIO更适合高并发场景,能显著提升Tomcat的吞吐量。
对响应内容启用Gzip压缩,减少网络传输数据量,提升页面加载速度。在Connector中添加以下配置:
<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" redirectPort="8443" compression="on"
compressableMimeType="text/html,text/xml,text/css,application/javascript"/>
compressableMimeType指定需要压缩的MIME类型(如HTML、CSS、JS等)。
Tomcat默认开启的管理界面(如/manager、/host-manager)和AJP协议(若未使用)会消耗资源,建议禁用:
webapps目录下的manager、host-manager文件夹;server.xml中的AJP连接器配置(<Connector port="8009" protocol="AJP/1.3" .../>)。隐藏Tomcat版本号可减少安全风险,同时避免攻击者针对特定版本发起攻击。在server.xml的Connector中添加:
<Connector ... server="Custom Server"/>
或在web.xml中添加:
<security-constraint>
<web-resource-collection>
<web-resource-name>Hide Version</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
这会隐藏Tomcat的版本信息。
根据服务器内存大小和应用需求,设置合理的初始堆(-Xms)和最大堆(-Xmx),避免频繁的垃圾回收(GC)。示例(假设服务器有8GB内存):
export JAVA_OPTS="-Xms4G -Xmx4G"
建议-Xms和-Xmx设置为相同值,避免堆内存动态调整的开销。
export JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC"export JAVA_OPTS="$JAVA_OPTS -XX:+UseParallelGC"。新生代(Young Generation)用于存放新创建的对象,老年代(Old Generation)用于存放长期存活的对象。通过-XX:NewRatio参数调整两者比例(默认值为2,即新生代占1/3,老年代占2/3)。示例(调整为1:3):
export JAVA_OPTS="$JAVA_OPTS -XX:NewRatio=3"
若应用对象生命周期短(如Web应用),可适当增大新生代比例,减少Minor GC次数。
对静态资源(如图片、CSS、JS)启用浏览器缓存,减少重复请求。在应用的web.xml中添加以下配置:
<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>
这会告诉浏览器缓存静态资源1个月(图片)或1周(CSS),减少服务器负载。
使用监控工具(如Prometheus+Grafana、JConsole、VisualVM)实时监控Tomcat的CPU、内存、线程池、GC等指标,根据监控数据调整参数。例如:
maxThreads或优化应用代码。