优化前需先掌握连接池的使用情况,通过连接池自带监控工具(如HikariCP的/actuator/health、Tomcat JDBC Pool的JMX接口)跟踪活跃连接数、等待连接数、空闲连接数等指标,识别瓶颈(如频繁等待连接可能需增加最大连接数,长期空闲过多可能需调整回收策略)。
在server.xml中配置线程池(Executor)和连接器(Connector),优化并发处理能力:
<Executor>标签定义线程池,设置maxThreads(最大并发线程数,根据CPU核数调整,建议500-1000)、minSpareThreads(最小空闲线程数,保持50-100以快速响应新请求)、maxQueueSize(最大等待队列数,超过则拒绝请求,默认无限制易导致OOM)、prestartminSpareThreads(初始化时创建最小空闲线程,设为true避免启动延迟)。executor="tomcatThreadPool"),设置protocol(使用NIO2协议org.apache.coyote.http11.Http11Nio2Protocol提升I/O性能)、maxConnections(最大连接数,Tomcat 8+建议10000)、acceptCount(所有线程繁忙时的排队请求数,设为100-200)、connectionTimeout(连接超时时间,设为20000毫秒(20秒)快速释放无效连接)、enableLookups(禁用DNS查询,设为false减少网络开销)。调整Tomcat启动脚本(catalina.sh/catalina.bat)中的JVM参数,提升内存管理和垃圾回收效率:
-Xms(初始堆内存)和-Xmx(最大堆内存)设为相同值(如-Xms2048m -Xmx2048m),避免堆内存动态扩展的开销;-XX:MetaspaceSize(初始元空间)和-XX:MaxMetaspaceSize(最大元空间)设为256m-512m(避免元空间溢出);-XX:+UseG1GC),适合大内存环境,通过-XX:MaxGCPauseMillis(最大GC暂停时间,如200毫秒)控制GC停顿时间。若应用使用数据库,需调整数据库连接池(如HikariCP、C3P0、DBCP)参数,减少连接创建和销毁的开销:
maximum-pool-size(最大连接数,建议不超过50,根据CPU核数调整)、minimum-idle(最小空闲连接数,保持10-20以应对突发请求)、idle-timeout(空闲连接超时时间,设为30000毫秒(30秒)回收闲置连接)、max-lifetime(连接最大生命周期,设为1800000毫秒(30分钟)避免连接老化)、validation-query(验证连接有效性的SQL,如MySQL的SELECT 1)。调整Debian Linux内核参数,提升网络和文件描述符处理能力:
sudo sysctl -w net.ipv4.tcp_tw_reuse=1(允许TIME_WAIT状态的连接复用,减少端口占用);sudo sysctl -w net.core.somaxconn=4096(增加系统允许的最大并发连接数,默认128可能不足);ulimit -n 65536(提高单个进程能打开的文件描述符数量,避免连接过多导致“Too many open files”错误)。server.xml的Connector中设置compression="on"、compressableMimeType="text/html,text/xml,text/plain,text/css,application/javascript"(对文本类响应压缩,减少带宽占用);enableLookups="false")、关闭AJP连接器(若不用Tomcat与其他服务器通信);logging.properties中的日志级别调整为WARNING或OFF(减少日志输出),使用logrotate工具自动切割和压缩日志文件(避免日志过大占用磁盘空间)。