9.10.5 性能优化与参数调优
性能优化与参数调优#
导语:本节聚焦生产环境的性能瓶颈定位与参数调优,覆盖架构流转、JVM/线程池/数据库/网络/配置推送优化,并提供完整示例、排错思路与练习。
- 原理草图:配置与注册链路瓶颈位置
- 容量与并发基线(示例+命令)
目标:建立服务数、实例数、配置条目数与变更频率的基线并发模型,预留 30%~50% 裕量。
# 1) 基础环境信息
uname -a
java -version
free -h
nproc
# 2) 基线数据采集(示例:统计服务与实例数)
curl -s "http://127.0.0.1:8848/nacos/v1/ns/service/list?pageNo=1&pageSize=100" | jq .
# 预期:返回服务列表与总数,作为容量基线输入
# 3) 简单压测(注册/查询/配置发布)
# 安装压测工具(示例:wrk)
sudo yum install -y wrk || sudo apt-get install -y wrk
# 注册接口压测(示例)
wrk -t4 -c100 -d30s "http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=demo&ip=10.0.0.1&port=8080"
# 预期:TPS稳定、95%响应时间在目标范围内
- JVM 参数调优(配置示例+解释)
目标:降低 Full GC、稳定暂停时间。建议固定堆内存并使用 G1。
# 启动参数示例(/opt/nacos/bin/startup.sh 中的 JAVA_OPT)
JAVA_OPT="-server -Xms4g -Xmx4g -Xss1m \
-XX:+UseG1GC -XX:MaxGCPauseMillis=200 \
-XX:InitiatingHeapOccupancyPercent=45 \
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/nacos"
# 解释:
# -Xms/-Xmx 固定堆,避免扩容抖动
# MaxGCPauseMillis 设定目标暂停
# InitiatingHeapOccupancyPercent 提前触发并发回收
- 线程池与连接数(参数示例+验证命令)
目标:避免注册/配置线程池饥饿,控制 HTTP 连接与超时。
# /opt/nacos/conf/application.properties
# 服务注册处理线程池
nacos.naming.core.size=20
nacos.naming.distro.taskDispatchThreadCount=8
nacos.naming.distro.taskDispatchPeriod=200
# 配置推送线程池
nacos.config.async.batch.size=1000
nacos.config.async.batch.count=10
# 验证线程池阻塞与积压
jstack -l $(pgrep -f nacos) | head -n 80
# 预期:无大量 BLOCKED/WAITING 堆积
- 数据库优化(完整示例+排错)
目标:降低 config_info 等核心表慢查询,合理设置连接池。
-- MySQL 慢查询开启
SET GLOBAL slow_query_log=ON;
SET GLOBAL long_query_time=0.5;
-- 索引检查示例(关注 config_info)
EXPLAIN SELECT * FROM config_info WHERE data_id='app.yaml' AND group_id='DEFAULT_GROUP';
# /opt/nacos/conf/application.properties
# Hikari 连接池
spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.idle-timeout=600000
# 排错:查看慢查询
mysql -e "SHOW VARIABLES LIKE 'slow_query_log%';"
mysql -e "SHOW VARIABLES LIKE 'long_query_time';"
mysql -e "SELECT * FROM mysql.slow_log ORDER BY start_time DESC LIMIT 5\G"
- 配置推送优化(示例+命令)
# 批量发布示例(以 curl 模拟发布)
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs" \
-d "dataId=app.yaml&group=DEFAULT_GROUP&content=key1: v1"
# 预期:发布成功返回 true
# 优化原则:合并批量发布、减少高频变更、配置内容保持小而精
- 注册发现优化(示例+参数)
# /opt/nacos/conf/application.properties
# 心跳与过期策略
nacos.naming.instance.expired-time=15000
nacos.naming.instance.check-expired=true
# 模拟心跳检查(观察实例是否过期)
curl -s "http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=demo" | jq .
# 预期:实例状态稳定,无频繁上下线抖动
- 存储与磁盘(命令+实践)
# 检查磁盘IOPS与延迟
iostat -x 1 5
# 日志分卷建议
df -h
# 预期:数据目录与日志目录在不同磁盘/分区
- 网络优化(示例+命令)
# 连接数与端口检查
ss -s
ss -lntp | grep 8848
# 延迟与丢包检查(跨机房时)
ping -c 20 nacos.example.com
- Nacos 参数调优重点(示例+解释)
# /opt/nacos/conf/application.properties
# 清理与治理策略
nacos.naming.empty-service.clean=true
nacos.naming.empty-service.expired-time=60000
# 安全与命名空间
nacos.core.auth.enabled=true
nacos.core.namespace=public
- 监控与验证(命令+指标)
# JVM GC 监控
jstat -gcutil $(pgrep -f nacos) 1000 5
# 关键指标建议:
# 注册成功率、推送延迟、心跳超时率、GC暂停、数据库慢查询
-
排错清单(快速定位)
1. 推送延迟高:查看nacos.config.async.*、线程池是否堆积,检查客户端长轮询是否超时。
2. 注册抖动:检查心跳间隔、过期时间、网络丢包。
3. GC 频繁:确认堆大小、GC 策略、日志中 Full GC 次数。
4. DB 响应慢:查看慢查询日志、索引是否命中、连接池是否耗尽。 -
练习与实操
1. 修改-Xms/-Xmx从 4G 提升到 8G,观察jstat中 GC 次数变化。
2. 将spring.datasource.hikari.maximum-pool-size从 30 提升到 60,压测注册接口并对比 TPS。
3. 使用wrk对配置发布压测,记录 95% 响应时间并优化nacos.config.async.*参数。
4. 使用iostat观察磁盘延迟变化,评估日志与数据是否需要分卷。