Ubuntu下Tomcat性能优化策略
选择高性能连接器(如NIO或NIO2)并启用HTTP/2,提升高并发下的吞吐量。在server.xml中配置:
<Connector
port="8080"
protocol="org.apache.coyote.http11.Http11Nio2Protocol" <!-- 使用NIO2连接器 -->
connectionTimeout="20000"
redirectPort="8443"
maxThreads="300" <!-- 最大线程数(根据CPU核心数调整,建议200-500) -->
minSpareThreads="50" <!-- 最小空闲线程数(保持线程预热) -->
acceptCount="1000" <!-- 最大排队请求数(避免拒绝服务) -->
enableLookups="false" <!-- 禁用DNS反查(减少网络请求) -->
compression="on" <!-- 启用GZIP压缩(减少传输数据量) -->
compressableMimeType="text/html,text/xml,text/javascript,application/json" />
若需启用HTTP/2(Tomcat 8.5+),需添加SSL配置并指定Http2Protocol。
通过Executor定义全局线程池,避免每个连接器重复创建线程。在server.xml中配置:
<Executor
name="tomcatThreadPool"
namePrefix="catalina-exec-"
maxThreads="500" <!-- 最大线程数 -->
minSpareThreads="100" <!-- 最小空闲线程数 -->
maxQueueSize="100" <!-- 队列最大长度(避免内存溢出)" />
<Connector executor="tomcatThreadPool" ... />
合理分配堆内存(避免频繁GC),并根据应用类型调整新生代与老年代比例。在catalina.sh中设置:
export JAVA_OPTS="-server -Xms2g -Xmx2g -XX:NewRatio=3 -XX:MaxMetaspaceSize=512m"
-Xms与-Xmx:初始堆与最大堆大小(建议设为相同,避免堆扩容开销);-XX:NewRatio=3:新生代与老年代比例为1:3(适合大多数Web应用);-XX:MaxMetaspaceSize:限制元空间大小(避免元空间溢出)。优先使用G1GC(适合大内存、低延迟场景),替代传统的CMS或Parallel GC:
export JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
-XX:+UseG1GC:启用G1GC;-XX:MaxGCPauseMillis=200:目标最大GC停顿时间(毫秒)。优化TCP缓冲区与连接队列,提升网络吞吐量。执行以下命令:
# 增加TCP缓冲区大小(单位:字节)
sudo sysctl -w net.core.rmem_max=1310720
sudo sysctl -w net.core.wmem_max=1310720
# 启用TCP快速回收(减少TIME_WAIT状态连接)
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
# 减少SYN队列超时时间(避免半连接攻击)
sudo sysctl -w net.ipv4.tcp_synack_retries=2
# 增加系统最大文件描述符数
sudo sysctl -w net.core.somaxconn=4096
将上述配置添加到/etc/sysctl.conf以实现永久生效。
调整用户进程与文件描述符的最大数量,避免高并发下出现“Too many open files”错误。编辑/etc/security/limits.conf:
* soft nofile 65535
* hard nofile 65535
修改后执行source /etc/security/limits.conf使配置生效。
将图片、CSS、JavaScript等静态资源部署到Nginx或CDN,减少Tomcat的处理负担。Nginx配置示例:
server {
listen 80;
server_name example.com;
location /static/ {
alias /var/www/static/; # 静态资源目录
expires 30d; # 设置缓存过期时间
}
location / {
proxy_pass http://tomcat:8080; # 反向代理到Tomcat
proxy_set_header Host $host;
}
}
使用高效的数据库连接池(如HikariCP),减少连接创建与销毁的开销。在Spring Boot中配置:
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: 123456
hikari:
maximum-pool-size: 20 # 连接池最大连接数
minimum-idle: 5 # 最小空闲连接数
idle-timeout: 30000 # 空闲连接超时时间(毫秒)
connection-timeout: 3000 # 连接超时时间(毫秒)
StringBuilder);@Async注解)。jmxremote启用JMX,结合Prometheus+Grafana实现实时监控;