# 11.7 性能调优 :::tip 概述 性能调优按层次展开:数据库(连接池/索引/大表)、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 多 | 限流阈值偏低或前端轮询过频 |