Files
easygoadmin-wiki/EasyGoAdmin_GoFrame_EleVue/zh/deploy/performance.md
T
2026-10-20 21:19:44 +08:00

99 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 多 | 限流阈值偏低或前端轮询过频 |