如何通过CentOS Tomcat性能测试优化配置,显著提升网站响应速度?
- 内容介绍
- 文章标签
- 相关推荐
至于主要痛点,为什么你的Tomcat跑不快?
很多运维和开发同学都遇到过这样的场景:明明服务器设置不低,但一旦并发上来网站响应时间飙升、CPU打满、甚至频繁OOM重启。
-
盲目调参:网上抄一堆
-Xms -XmxmaxThreads参数。重启后问题依旧,甚至引发新故障。 - 无基线对比:调整前后没数据支撑,不知是变快了还是变慢了不敢上生产。
- 瓶颈定位难:是JVM GC频繁?数据库慢查询,还是OS层面文件描述符不够?缺乏程序化压测与监控链路。
第一阶段这方面。测试准备与基线建立
1.1 环境标准化部署
痛点提示:生产环境与测试环境配置不一致,导致压测结果失真。
-
JDK版本锁定:生产用什么版本,测试就用什么版本。
-
Tomcat纯净安装:/opt/tomcat,避免包管理器安装的散落配置干扰。
-
应用打包:部署真实业务WAR/JAR,或编写模拟真实业务逻辑的压测专用应用。老实说,拒绝Hello World!
1.2 操作程序层面“兜底”配置
痛点提示:"明明Tomcat配了500线程,为啥连接数上不去?报错 Too many open files / Connection refused"
必须在压测前完成,否则所有上层调优都是空中楼阁。
文件描述符限制
# /etc/security/limits.conf
tomcat soft nofile 65536
tomcat hard nofile 65536
tomcat soft nproc 65536
tomcat hard nproc 65536
# /etc/systemd/system/tomcat.service.d/limits.conf
LimitNOFILE=65536
LimitNPROC=65536
TasksMax=infinity
内核网络参数调优 - 高并发短连接场景关键)
# 队列长度
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
# TCP连接复用与快速回收
net.ipv4.tcp_tw_reuse = 1
# net.ipv4.tcp_tw_recycle = 1 # 内核4.12+已移除,勿开启
# 增大端口范围 & 减少FIN_WAIT_2超时
net.ipv4.ip_local_port_range = 10240 65000
net.ipv4.tcp_fin_timeout = 10
# Syn Flood防护 & 队列保护
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_abort_on_overflow = 0
# 应用生效
sysctl -p
1.3 JVM 基础内存模型设定 - 新建文件而非改catalina.sh)
#!/bin/bash
# ========== 基础堆内存 ==========
# 建议: Xms=Xmx=物理内存 *,预留给Direct Memory、Metaspace、CodeCache、OS Cache
export CATALINA_OPTS="-server -Xms8g -Xmx8g"
# ========== 元空间 ==========
export CATALINA_OPTS="$CATALINA_OPTS -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=1g"
# ========== GC策略:首选 G1 或 ZGC ==========
# 生产通用推荐 G1:
export CATALINA_OPTS="$CATALINA_OPTS -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
# 大内存追求更好低延迟可尝试 ZGC:
# export CATALINA_OPTS="$CATALINA_OPTS -XX:+UseZGC"
# ========== GC日志 ==========
export CATALINA_OPTS="$CATALINA_OPTS -Xlog:gc*:file=$CATALINA_BASE/logs/gc-%t.log:time,tags:filecount=5。filesize=100m"
# ========== OOM自动Dump & 脚本处理 ==========
export CATALINA_OPTS="$CATALINA_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$CATALINA_BASE/logs/"
export CATALINA_OPTS="$CATALINA_OPTS -XX:OnOutOfMemoryError='$CATALINA_BASE/bin/oom_action.sh %p'"
# ========== JMX远程监控 ==========
export CATALINA_OPTS="$CATALINA_OPTS \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=9090 \
-Dcom.sun.management.jmxremote.rmi.port=9090 \
-Dcom.sun.management.jmxremote.aunticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname=$"
1.4 建立性能基线—— 最关键的一步!
- 使用。
-
编写覆盖主要业务链路的脚本,包含思考时间。
threads\">200 time\">6 3 true -
必须同时采集三维数据才叫“基线”:
-
\u7cfb\u7edf\u7efc\uFF
stat \uFF<\/i>: \uFF vmstatpidstatiostatsar<\/i>\uFF- \uFF
jvm\uFF<\/i>\uFF``): \uFFheap\uFF<\/i>\uFFused<\/u>\uFF/old gen\uFF/ygc/full gc\uFF/pause time<\/i>'internal- tomcat\u FF
): \uFFcurrent threads<\/i>'\uFF/busy threads\uFF/queue size\uFF/request count / processing time`<\/i>' <\"/ul\"> echo $?echo $,echo $?echo $,echo $?echo $,echo $?echo $,p<\"/section\"> p<\"/section\"> p<\"/section\">" } } - \uFF
-
\u7cfb\u7edf\u7efc\uFF
至于主要痛点,为什么你的Tomcat跑不快?
很多运维和开发同学都遇到过这样的场景:明明服务器设置不低,但一旦并发上来网站响应时间飙升、CPU打满、甚至频繁OOM重启。
-
盲目调参:网上抄一堆
-Xms -XmxmaxThreads参数。重启后问题依旧,甚至引发新故障。 - 无基线对比:调整前后没数据支撑,不知是变快了还是变慢了不敢上生产。
- 瓶颈定位难:是JVM GC频繁?数据库慢查询,还是OS层面文件描述符不够?缺乏程序化压测与监控链路。
第一阶段这方面。测试准备与基线建立
1.1 环境标准化部署
痛点提示:生产环境与测试环境配置不一致,导致压测结果失真。
-
JDK版本锁定:生产用什么版本,测试就用什么版本。
-
Tomcat纯净安装:/opt/tomcat,避免包管理器安装的散落配置干扰。
-
应用打包:部署真实业务WAR/JAR,或编写模拟真实业务逻辑的压测专用应用。老实说,拒绝Hello World!
1.2 操作程序层面“兜底”配置
痛点提示:"明明Tomcat配了500线程,为啥连接数上不去?报错 Too many open files / Connection refused"
必须在压测前完成,否则所有上层调优都是空中楼阁。
文件描述符限制
# /etc/security/limits.conf
tomcat soft nofile 65536
tomcat hard nofile 65536
tomcat soft nproc 65536
tomcat hard nproc 65536
# /etc/systemd/system/tomcat.service.d/limits.conf
LimitNOFILE=65536
LimitNPROC=65536
TasksMax=infinity
内核网络参数调优 - 高并发短连接场景关键)
# 队列长度
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
# TCP连接复用与快速回收
net.ipv4.tcp_tw_reuse = 1
# net.ipv4.tcp_tw_recycle = 1 # 内核4.12+已移除,勿开启
# 增大端口范围 & 减少FIN_WAIT_2超时
net.ipv4.ip_local_port_range = 10240 65000
net.ipv4.tcp_fin_timeout = 10
# Syn Flood防护 & 队列保护
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_abort_on_overflow = 0
# 应用生效
sysctl -p
1.3 JVM 基础内存模型设定 - 新建文件而非改catalina.sh)
#!/bin/bash
# ========== 基础堆内存 ==========
# 建议: Xms=Xmx=物理内存 *,预留给Direct Memory、Metaspace、CodeCache、OS Cache
export CATALINA_OPTS="-server -Xms8g -Xmx8g"
# ========== 元空间 ==========
export CATALINA_OPTS="$CATALINA_OPTS -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=1g"
# ========== GC策略:首选 G1 或 ZGC ==========
# 生产通用推荐 G1:
export CATALINA_OPTS="$CATALINA_OPTS -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
# 大内存追求更好低延迟可尝试 ZGC:
# export CATALINA_OPTS="$CATALINA_OPTS -XX:+UseZGC"
# ========== GC日志 ==========
export CATALINA_OPTS="$CATALINA_OPTS -Xlog:gc*:file=$CATALINA_BASE/logs/gc-%t.log:time,tags:filecount=5。filesize=100m"
# ========== OOM自动Dump & 脚本处理 ==========
export CATALINA_OPTS="$CATALINA_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$CATALINA_BASE/logs/"
export CATALINA_OPTS="$CATALINA_OPTS -XX:OnOutOfMemoryError='$CATALINA_BASE/bin/oom_action.sh %p'"
# ========== JMX远程监控 ==========
export CATALINA_OPTS="$CATALINA_OPTS \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=9090 \
-Dcom.sun.management.jmxremote.rmi.port=9090 \
-Dcom.sun.management.jmxremote.aunticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname=$"
1.4 建立性能基线—— 最关键的一步!
- 使用。
-
编写覆盖主要业务链路的脚本,包含思考时间。
threads\">200 time\">6 3 true -
必须同时采集三维数据才叫“基线”:
-
\u7cfb\u7edf\u7efc\uFF
stat \uFF<\/i>: \uFF vmstatpidstatiostatsar<\/i>\uFF- \uFF
jvm\uFF<\/i>\uFF``): \uFFheap\uFF<\/i>\uFFused<\/u>\uFF/old gen\uFF/ygc/full gc\uFF/pause time<\/i>'internal- tomcat\u FF
): \uFFcurrent threads<\/i>'\uFF/busy threads\uFF/queue size\uFF/request count / processing time`<\/i>' <\"/ul\"> echo $?echo $,echo $?echo $,echo $?echo $,echo $?echo $,p<\"/section\"> p<\"/section\"> p<\"/section\">" } } - \uFF
-
\u7cfb\u7edf\u7efc\uFF

