11.7 性能调优
概述
性能调优按层次展开:数据库(连接池/索引/大表)、Redis(连接池/内存)、应用(缓存策略/日志异步)、前端(构建/缓存)。本节给出调优点与观测方法。
数据库层
text
连接池(config.yaml database.default):
maxIdle/maxActive/寿命等 gdb 池参数按并发核算
多实例部署:实例数 × 池上限 ≤ 数据库 max_connections
索引:
筛选列(LikeFields/EqFields 命中列)建 idx_
唯一列 uk_*(同时是并发唯一性保证)
city 大表:查询必须走 parent_code/pid/area_code 索引路径
大表:
city(78万+):禁全表 List;级联懒加载
日志三表:LogClean 按 job.logRetentionDays(默认90天)分批清理
长表分页深翻页:管理后台低频可接受;高频报表走导出/离线
debug 开关:database.default.debug 生产必须 false(SQL 日志开销大)Redis 层
text
连接池:redis.default idle/maxActive 按并发调
内存:maxmemory + 淘汰策略(evictedKeys 持续增长 = 容量不足)
观测:GET /api/cache/info(usedMemory/hitRate/connectedClients/fragRatio)
缓存命中率治理(hitRate 偏低时):
对照 4.8 TTL 设计原则检查各键 TTL
字典类可适当加长(有 RefreshCache 兜底)
状态判定类宁短勿长应用层
text
异步化(已内置):
操作日志异步批量落库(通道2048+worker,不阻塞业务)
定时任务 is_sync=0 异步执行
缓存(内置三层):
进程内(dictTextCache/反射计划)→ Redis(身份/租户/字典/黑名单)→ DB
新增缓存遵循 TTL 原则(4.8)
分批(内置):
导出 ChunkQuery 500/页防 OOM
LogClean 单批 5000 行、单表单次 20 万行上限
限流:rateLimit 按压测调参(防误伤;authLimit 不建议调大)
panic 兜底 + errorStack=false(生产减少堆栈序列化开销)前端层
text
构建:
Vite 代码分割(路由级懒加载——动态路由天然按页面拆分)
gzip/brotli(Nginx gzip on + 静态预压缩可选)
assets 长缓存(带 content hash)
运行:
列表虚拟滚动(超大列表场景,Element Plus virtualized)
图片懒加载/压缩(上传侧控制尺寸)
keep-alive 控制缓存页面数量(内存 vs 体验平衡)压测与观测
text
压测前准备:
临时调大 rateLimit.limit 或按压测 IP 绕过(防误判 429)
app.errorMsg=false(减少错误序列化差异)
独立压测环境(勿压生产)
观测指标:
后端:/api/server/info(goroutines/内存/gc)
DB:慢查询日志(开启 query_time 阈值)
Redis:hitRate/connectedClients/evictedKeys
系统:CPU/内存/磁盘 IO/网络常见瓶颈定位
| 症状 | 方向 |
|---|---|
| 接口慢且稳定慢 | 索引缺失/慢查询(开 debug 看 SQL);N+1 查询 |
| 越用越慢 | 内存泄漏(goroutines/heapObjects 增长);连接泄漏 |
| 并发上不去 | 数据库连接池打满;Redis 单点 |
| 偶发卡顿 | GC(调内存);磁盘 IO(日志/上传) |
| 大列表超时 | city 类大表全量查询;改级联/分页 |
| 峰值 429 多 | 限流阈值偏低或前端轮询过频 |