Performance

📘 性能与负载 入门名词描述 “没有解决方案,只有利弊权衡。尽你所能获取最好的利弊权衡,这是你唯一能指望的事。” ——《DDIA》 🧩 一、什么是负载(Load) 📌 定义 负载 = 系统正在承受的压力,可以通过多个维度…


📘 性能与负载 入门名词描述

“没有解决方案,只有利弊权衡。尽你所能获取最好的利弊权衡,这是你唯一能指望的事。” ——《DDIA》

🧩 一、什么是负载(Load)

📌 定义

负载 = 系统正在承受的压力,可以通过多个维度的指标来描述。

  • 用途:监控系统瓶颈 / 评估是否需要扩容 / 优化调度资源

🧮 常见负载指标

类型 指标 描述

Web 服务 QPS(每秒请求数) 测量并发请求处理能力

数据库 TPS(每秒事务数) 事务处理能力,包括多步 SQL 操作

内存 已用内存 / 可用内存 / 使用率 判断内存是否吃紧

Linux 系统 Load Average(1/5/15分钟) 平均运行队列长度,不是 CPU 使用率

📌 系统负载 != CPU 使用率!

LoadAvg 是“等待 CPU 调度的进程数(Runnable + Running)”

🔢 一、QPS 和 TPS 的区别与联系

🧠 基本定义

指标 全称 含义 应用场景

QPS Queries Per Second 每秒处理的查询请求数 Web 服务、接口调用

TPS Transactions Per Second 每秒处理的完整事务数 数据库、支付、下单等事务性服务

📌 举例区分

场景1:Web 服务

一个电商网站:

  • 每秒收到 10000 个用户请求
  • 都是类似 GET /product/123

✅ 这里就是 QPS = 10000(高并发读请求)

场景2:数据库服务

一个用户下单流程:

  • 下单接口执行 1 次
  • 这个接口背后执行了 5 条 SQL(查库存、扣库存、写订单、写流水、写用户操作)

✅ 一个“下单事务” = 多个 SQL 查询

所以:

  • QPS(N * TPS) = 5000

  • TPS(下单事务数) = 1000

✅ 总结区别

项目 QPS TPS

粒度 单个查询(如 SQL 或接口) 一个完整事务(可包含多个操作)

描述 并发处理能力 原子操作能力

场景 Web 接口、Redis、MySQL 查询 支付系统、订单、银行交易

📌 TPS 更适合描述事务系统的处理能力(如支付、订单),QPS 更常用于接口服务和缓存系统。

📊 二、P99 / P999 / P95 的含义

📌 定义:百分位响应时间指标(Percentiles)

用来描述 延迟 / 响应时间的分布情况,比平均值更能反映“极端情况”。

例如:P99 就是第 99% 个请求所用的耗时。假如 P99 现在是 10ms, 那么我们可以说 “99% 的请求都在 10ms 内完成”。虽然在一些请求量较小的情况下,P99 可能受长尾请求的影响。但是由于 SRE 一般不会给在量小的业务上花费太多精力,所以这个问题并不是很大。

指标 含义

P50 中位数:一半请求耗时比它低,一半比它高

P95 95% 的请求响应时间 ≤ 该值

P99 99% 的请求响应时间 ≤ 该值

P999 99.9% 的请求响应时间 ≤ 该值(极端尾部响应)

🔍 举例说明

假设你统计了 10000 个请求响应时间:

  • P50 = 100ms → 有 5000 个请求耗时 ≤ 100ms
  • P95 = 200ms → 有 9500 个请求耗时 ≤ 200ms
  • P99 = 500ms → 有 9900 个请求耗时 ≤ 500ms
  • P999 = 1000ms → 有 9990 个请求耗时 ≤ 1000ms,只有 10 个 > 1000ms

🚨 为什么不用平均值(Average)?

平均值会被“极端慢请求”影响,看不出长尾风险。

  • 示例数据:[50ms, 60ms, 55ms, 12000ms]
  • 平均值 = 3025ms ❌ → 完全不符合大多数请求的真实情况
  • P95 = 60ms ✅ → 95% 都非常快
  • 只有极个别请求“拖后腿”,这才是你要关注的 P99 / P999

🧯 实战意义

百分位 用途 关注点

P50 系统常态表现 用户平均体验

P95 看临近瓶颈前状态 高峰期参考

P99 / P999 尾部请求监控 长尾、慢查询、GC、队头阻塞

✅ 总结一图流

|------P50---------P95-------P99-----------P999----------->
|     常规请求      稍慢       慢请求         极慢请求
|     快速路径      网络抖动    GC/锁/IO      超长队列阻塞

📎 最佳实践建议

类别 建议

接口监控 一定要记录:P50 / P95 / P99 / 最大响应时间

Web 服务 用 QPS + P99 评估稳定性

数据库 用 TPS + P99 评估峰值事务处理能力

SLA 一般要求 “P99 ≤ 100ms,99.9% 可用”

压测 用 P95/P99 判断系统“压力临界点”

⚙️ 二、如何描述性能(Performance)

📌 定义

性能 = 在当前负载下,系统的响应能力 + 资源利用率

性能指标帮助我们量化“服务好不好用”。

🚀 1. 吞吐量(Throughput)

  • 定义:单位时间系统处理请求数(QPS / TPS)
  • 关注点:系统最大处理能力

📌 适用场景:

场景 吞吐量指标

Web 服务 QPS

数据库事务 TPS

消息队列 / 日志系统 每秒写入记录数

⏱️ 2. 延迟与响应时间(Latency / Response Time)

📌 基本概念

项目 含义

延迟(Latency) 请求在服务端被处理的时间

响应时间(Response Time) 客户端看到的总耗时 = 延迟 + 排队时间 + 网络时间

🚨 延迟来源

  • 服务处理时间慢(业务慢 / 下游慢)
  • 排队等待(连接池满、线程池打满)
  • 网络波动(RTT抖动、丢包)
  • GC 暂停(STW)
  • I/O 磁盘写慢

📊 延迟度量方式

  • 平均值:容易被极端值掩盖 ❌
  • P99、P95、P50(中位数):反映不同程度的请求耗时 ✅

🏷️ 举例:

  • P99 = 120ms → 说明 99% 的请求小于 120ms,1% 的请求 ≥ 120ms

⚠️ 注意“长尾延迟”:

  • 慢请求集中影响系统
  • 队头阻塞:有限线程并行,长请求拖慢短请求

🤝 SLA 与 SLO

项目 含义

SLA 服务级别协议(企业间签订)Service Level Agreement 服务水平协议

SLO 服务级别目标(内部制定) Service Level Object 服务水平目标

SLI 服务级别指标(如 P99 ≤ 100ms)Service Level Indicator 服务水平指示器

常见 SLA 示例:

  • 可用性 ≥ 99.9%(月宕机时间 ≤ 43.2分钟)
  • P99 响应时间 ≤ 100ms
  • 恢复时间 ≤ 5 分钟

🔗 三、指标关系与公式

🔁 三者关系公式

平均并发数 ≈ 吞吐量 × 平均响应时间

📌 举例:

  • 每秒处理 1000 请求(QPS)
  • 平均响应时间 200ms = 0.2 秒
  • 平均并发 ≈ 1000 × 0.2 = 200

🔧 四、排查与调优实战

🧐 问题排查流程

❓ 高并发场景下系统响应慢,但 CPU/内存正常,该怎么查?

1. 判断症状:

  • 是所有接口慢?还是某类请求?
  • 是平均响应时间升高,还是 P99/P95 升高?

2. 排查方向:

排查项 举例说明

下游慢 SQL 慢查询、Redis 超时、外部 HTTP 慢

排队阻塞 DB连接池耗尽、线程池阻塞、异步队列积压

热点锁竞争 同步锁 / Redis分布式锁导致串行化

网络问题 跨区调用 / 网络抖动 / DNS 延迟

GC 抖动 Full GC 频繁,或 STW 超长

3. 辅助工具:

工具 功能

链路追踪 (Jaeger / Skywalking) 查看请求耗时分布

pprof(go) / arthas 查看线程 / 堆栈 / 锁竞争状态

Prometheus / Grafana 可视化吞吐、延迟、内存等指标

🏗️ 五、系统设计视角下的性能保障

🎯 设计高并发、高吞吐接口的原则

📦 拆分架构

  • 读写分离 / 拆服务 / 拆库分表 / 分区分片

⚡ 缓存加速

  • Caffeine / Redis / 本地缓存
  • 防穿透 / 击穿 / 雪崩处理

💥 限流降级

  • 漏桶 / 令牌桶 / Sentinel
  • 接口降级默认返回 / 超时熔断

🔁 异步削峰

  • 消息队列缓冲(Kafka / RocketMQ)
  • 支付下单先入队,后续异步处理

🧰 并发控制

  • 增大连接池 / goroutine 控制
  • 避免请求堆积 / 调整队列大小

📚 六、术语速查表

名词 含义

QPS 每秒请求数(Query Per Second)

TPS 每秒事务数(Transaction Per Second)

P99 99% 请求响应时间

SLA 服务等级协议

SLO 服务等级目标

SLI 服务等级指标

并发数 系统同时处理的请求数

吞吐量 每秒可处理多少请求

响应时间 请求从发起到返回的总耗时

延迟 服务端处理请求所耗时间

📖 推荐读物

  • 《Designing Data-Intensive Applications》📘 DDIA
  • 《系统性能:企业与云计算视角》Brendan Gregg
  • 《Site Reliability Engineering》SRE 团队指南

✅ 总结与建议

  • 性能问题没有绝对值,关键在于定位瓶颈、合理权衡资源与用户体验
  • 学会用指标说话,从数据中发现性能问题根因
  • 把握三个核心维度:吞吐、延迟、并发
  • 面试/实战场景中注重:性能压测 + 调优措施 + 架构设计能力

评论