RT,QPS指标相关的性能优化

性能优化的核心目标通常就是:在 RT(响应时间)不超标(达标)的前提下,尽可能提升 QPS(吞吐量)

我直接给你一套通用的性能优化"四步走"方法论,你可以像查清单一样对照着去排查:


第一步:定位瓶颈(先观测,再动手)

不要凭感觉优化,要用数据说话。

  • 看监控:CPU 飙高还是内存泄漏?磁盘 I/O 满了还是网络带宽打满了?

  • 看链路 :用 Arthas (Java)或 Py-Spy(Python)等工具抓取在线线程栈,看看时间到底耗在哪里。

  • 区分"慢"的类型

    • RT 高但 CPU 低 :大概率是外部 I/O 阻塞(查数据库、调第三方 API、读磁盘)。

    • RT 高且 CPU 高 :大概率是内部计算密集(复杂循环、序列化/反序列化、GC 频繁)。


第二步:分层优化(从外到内)

按性价比从高到低排序:

优化层级 核心手段 预期收益
1. 缓存层 Redis 本地缓存(Caffeine),把热数据放在离 CPU 最近的地方。一次磁盘/网络 I/O 约 1-10ms,一次内存读取约 0.1ms,差距百倍。 ⭐⭐⭐⭐⭐
2. 数据库层 检查 SQL 索引是否命中;避免 SELECT *;读写分离;分库分表。 ⭐⭐⭐⭐
3. 代码逻辑层 并行调用(CompletableFuture)代替串行;批量接口代替循环单查;避免大对象频繁创建引发 Full GC。 ⭐⭐⭐⭐
4. 网络传输层 数据包体压缩(Gzip);启用 HTTP/2 多路复用;减少不必要的水印/日志打印。 ⭐⭐⭐

第三步:压测验证(控制变量法)

优化完一定要压测,否则不知道是变好了还是变坏了。

  • 单机压测 :用 JMeterwrk 发压,观察 QPS 拐点(即 RT 突然飙升的那个临界点)。

  • 常用公式QPS 预估 = (单机 QPS) × (机器数量) × (0.7 ~ 0.8 冗余系数)

  • 注意 :压测时记得把日志级别调为 WARN,因为 DEBUG 日志会严重拖垮 QPS(吞吐量直接腰斩)。


第四步:异步削峰(终极手段)

如果业务逻辑无法再优化,且允许短暂延迟:

  • 同步 请求改为异步(MQ 消息队列)。

  • 前端快速返回"处理中",后端慢慢消费。

  • 效果:RT 几乎不变,但 QPS 可承受量能翻好几倍(因为排队了)。


特别提醒(避坑指南)

  1. 过早优化是万恶之源:如果你的 QPS 只有 100,优化到 1000 不如加一台机器来得快。

  2. 连接池/线程池别设太大 :线程数超过 CPU 核心数过多,上下文切换的开销反而会让 QPS 下降 。一般公式:线程数 = CPU 核心数 / (1 - 阻塞系数)

  3. 监控 RT 的"百分位数" :别只看平均 RT(平均值会被极端值拉平),重点看 TP99(99% 的请求在多少毫秒内完成)。