Tomcat在CentOS上的性能优化需从操作系统层、JVM层、Tomcat自身配置层三个维度综合调整,以下是具体优化措施:
操作系统是Tomcat运行的基础,需调整内核参数与文件描述符限制以提升并发处理能力。
调整文件描述符限制
Tomcat的高并发依赖足够的文件描述符(FD),默认值(1024)过低。编辑/etc/security/limits.conf,添加以下内容:
* soft nofile 65536
* hard nofile 65536
这将允许单个用户最多打开65536个文件描述符,解决高并发下的“Too many open files”问题。
优化内核网络参数
编辑/etc/sysctl.conf,添加以下参数以提升TCP连接效率:
net.core.somaxconn = 65535 # 监听队列最大长度(默认128,需与Tomcat的acceptCount匹配)
net.ipv4.tcp_tw_reuse = 1 # 允许复用TIME_WAIT状态的连接(减少连接建立开销)
net.ipv4.tcp_tw_recycle = 1 # 快速回收TIME_WAIT连接(注意:若存在NAT环境可能引发问题,需谨慎使用)
fs.file-max = 65536 # 系统全局最大文件描述符数
执行sysctl -p使配置生效。
禁用透明大页(Transparent Huge Pages, THP)
THP会导致内存碎片化,影响Java应用的GC性能。编辑/etc/rc.local(需赋予执行权限),添加:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
重启服务器使设置生效。
JVM内存配置直接影响Tomcat的稳定性和GC频率,需根据服务器内存大小合理分配。
设置堆内存大小
通过JAVA_OPTS调整初始堆(-Xms)和最大堆(-Xmx),建议两者相等以避免堆扩容带来的性能波动。例如,8GB内存服务器可配置:
export JAVA_OPTS="$JAVA_OPTS -Xms4G -Xmx4G"
(注:需预留1/4内存给系统和其他进程,避免OOM)。
选择合适的垃圾回收器
export JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC"
export JAVA_OPTS="$JAVA_OPTS -XX:+UseParallelGC"
-XX:MetaspaceSize)和最大大小(-XX:MaxMetaspaceSize):export JAVA_OPTS="$JAVA_OPTS -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"
```。
调整GC线程数
对于多核CPU,增加并行GC线程数可提升GC效率。例如,4核CPU配置:
export JAVA_OPTS="$JAVA_OPTS -XX:ParallelGCThreads=4"
```。
Tomcat的Connector与线程池配置是性能优化的核心,直接影响请求处理能力。
使用高性能Connector
替换默认的BIO(阻塞式)Connector为NIO(非阻塞式)或NIO2,编辑conf/server.xml:
<Connector
port="8080"
protocol="org.apache.coyote.http11.Http11Nio2Protocol" <!-- NIO2性能更优 -->
connectionTimeout="20000"
redirectPort="8443"
maxThreads="200"
minSpareThreads="50"
acceptCount="1000"
compression="on"
compressionMinSize="8192"
URIEncoding="UTF-8"
/>
protocol:选择Http11NioProtocol(NIO)或Http11Nio2Protocol(NIO2);maxThreads:最大线程数(根据并发量调整,建议200-500);minSpareThreads:最小空闲线程数(保持50-100,避免频繁创建线程);acceptCount:监听队列长度(需≥somaxconn,避免连接被拒绝);compression:启用GZIP压缩(减少传输数据量,提升页面加载速度);URIEncoding:设置URL编码为UTF-8(避免中文乱码)。配置线程池(可选,但推荐)
通过Executor元素定义全局线程池,供多个Connector共享,提升线程利用率。编辑conf/server.xml:
<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:线程池最大线程数(需大于单个Connector的maxThreads);maxQueueSize:等待队列长度(避免无限制排队,建议100以内)。禁用不必要的功能
conf/server.xml,将Host标签的autoDeploy设为false,避免Tomcat频繁扫描webapps目录:<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="false" deployOnStartup="false">
conf/server.xml,在Connector标签中添加server="Apache",避免暴露Tomcat版本(减少安全风险):<Connector ... server="Apache" />
conf/server.xml,将Connector标签的enableLookups设为false(避免每次请求都进行DNS解析,提升性能):<Connector ... enableLookups="false" />
```。
调整JDK随机数生成器
Tomcat启动时使用/dev/random生成随机数,可能导致启动缓慢。编辑JAVA_HOME/jre/lib/security/java.security,将securerandom.source改为/dev/urandom:
securerandom.source=file:/dev/urandom
或在catalina.sh中添加:
export JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/urandom"
这将提升启动速度(尤其在高并发场景下)。
安装rng-tools增加熵池
若服务器熵池不足(cat /proc/sys/kernel/random/entropy_avail值低),会导致随机数生成缓慢。安装rng-tools并启动服务:
yum install rng-tools -y
systemctl start rngd
systemctl enable rngd
这将提升熵池大小,加快随机数生成。
监控与调优
使用监控工具(如Prometheus+Grafana、VisualVM、JConsole)实时监控Tomcat的CPU、内存、线程、GC等指标,根据监控结果调整配置(如增加maxThreads、扩大堆内存)。
通过以上优化措施,可显著提升Tomcat在CentOS上的性能、并发处理能力和稳定性。需根据实际业务场景(如并发量、应用类型)调整参数,避免盲目增大配置导致的资源浪费。