性能度量与目标:延迟、吞吐量、一致性模型、SLA/SLO

做高并发系统,第一件事不是写代码。

是先把「度量」搞清楚。

我见过太多团队,一上来就堆机器、上缓存、搞分库分表。结果呢?延迟还是高,吞吐上不去,线上事故不断。为什么?因为他们根本不知道自己要优化什么。

说白了,没有度量,就没有优化。

延迟:P50、P99、P999 到底在说啥?

延迟,就是一次请求从发起到返回的时间。但问题来了——一次请求快不代表所有请求都快。

你想想看,一个接口平均耗时 10ms,但偶尔有 1% 的请求卡了 5 秒。用户感知到的,就是那个 5 秒的慢请求。平均延迟会骗人,百分位延迟不会。

核心概念:

  • P50(中位数延迟):一半请求比它快,一半比它慢。反映系统「通常」的表现。
  • P99(99分位延迟):99% 的请求比它快,1% 的请求比它慢。这是用户体验的「红线」。
  • P999(99.9分位延迟):千分之一的慢请求。往往是系统瓶颈的「放大镜」。

我在项目中遇到过一件事。有个支付接口,P50 只有 20ms,看起来挺漂亮。但 P99 飙到了 800ms,P999 直接 3 秒。用户投诉说「偶尔卡死」。后来一查,是某个数据库连接池在高峰期打满了,慢查询排队导致的。

嗯,这就是只看平均延迟的坑。

我的习惯:线上监控至少看 P50、P99、P999 三个指标。P50 管日常,P99 管体验,P999 管稳定性。任何一个出问题,都得追。

吞吐量:TPS 和 QPS 别搞混了

吞吐量,就是系统单位时间能处理多少请求。

但这里有个常见的混淆点——TPS 和 QPS 不是一回事。

指标 全称 含义 典型场景
QPS Queries Per Second 每秒查询数 读多写少的场景,比如商品详情页
TPS Transactions Per Second 每秒事务数 写多读少的场景,比如下单、转账

一个事务可能包含多次查询。比如下单:先查库存(1次Q),再扣库存(1次T),再生成订单(1次T),再发消息(1次T)。所以 TPS 通常比 QPS 更「重」。

我曾经帮一个电商团队做压测,他们报的 QPS 是 5000,但 TPS 只有 800。我说你们这系统扛不住双十一。他们不信。结果大促那天,订单接口直接被打挂了。为什么?因为 QPS 高不代表事务处理能力强。

避坑指南:我曾经犯过一个错——用 QPS 去衡量写接口的性能。后来发现,写接口的瓶颈往往在事务、锁、磁盘 IO 上,QPS 根本反映不出来。所以,读接口看 QPS,写接口看 TPS,别混着用。

一致性模型:强一致性 vs 最终一致性

这是高并发系统里最让人头疼的选择题。

强一致性:写完之后,任何读都能立刻看到最新数据。听起来很完美,但代价是性能。因为你要加锁、要同步、要等待所有副本确认。

最终一致性:写完之后,不保证立刻读到最新数据,但保证「过一会儿」一定能读到。性能好,但业务上要能容忍短暂的不一致。

你想想看,银行转账能用最终一致性吗?不行。用户转完钱,余额没变,那不得炸锅?但一个论坛的点赞数,晚几秒更新,谁在乎?

我的经验:

  • 强一致性:适用于金融、支付、库存扣减等场景。我做过一个支付系统,用的就是 Paxos 协议保证强一致。性能确实有损耗,但业务安全第一。
  • 最终一致性:适用于社交、日志、统计等场景。比如用户发了一条动态,好友晚几秒看到,完全没问题。

但要注意,最终一致性不是「不管一致性」。你得设计好补偿机制。比如订单超时未支付自动取消,这就是一种补偿。

SLA 和 SLO:别让老板拍脑袋定目标

SLA(Service Level Agreement)是服务等级协议,说白了就是「你跟用户承诺了什么」。

SLO(Service Level Objective)是服务等级目标,是「你自己给自己定的内部指标」。

举个例子:

  • SLO:P99 延迟 < 200ms,可用性 99.99%
  • SLA:如果 P99 延迟超过 500ms 持续 5 分钟,赔偿用户 10% 的月费

看到了吗?SLO 比 SLA 更严格。你内部的目标要比对外承诺的高,这样才有缓冲空间。

我见过一个团队,SLA 写的是「可用性 99.9%」,但 SLO 定的是 99.99%。为什么?因为一旦触发 SLA 赔偿,成本很高。留出 0.09% 的余量,就是给自己留条活路。

我的建议:SLO 要基于真实数据来定。别拍脑袋。先跑一个月监控,看看 P99 实际是多少,再定一个「跳一跳够得着」的目标。定得太松,没意义;定得太紧,天天报警,团队也受不了。

知识体系总览

下面这张图,把这一章的核心逻辑串起来了。你可以把它当作一个「度量地图」。

高并发系统性能度量体系 延迟(Latency) • P50:中位数延迟,反映通常表现 • P99:99分位延迟,用户体验红线 • P999:99.9分位延迟,瓶颈放大镜 • 平均延迟会骗人,百分位不会 吞吐量(Throughput) • QPS:每秒查询数,读场景 • TPS:每秒事务数,写场景 • 一个事务可能包含多次查询 • 读看QPS,写看TPS,别混用 一致性模型 • 强一致性:立刻可见,性能有损耗 • 最终一致性:短暂延迟,性能好 • 金融支付用强一致 • 社交统计用最终一致 SLA / SLO • SLA:对外承诺,触发要赔偿 • SLO:内部目标,比SLA更严格 • 留出缓冲空间,避免触发赔偿 • 基于真实数据定SLO 没有度量,就没有优化

这张图里,四个模块是互相影响的。延迟高了,吞吐量自然上不去。一致性要求越强,延迟和吞吐的代价就越大。SLO 定得太严,可能逼着你在延迟和一致性之间做取舍。

所以,做性能优化之前,先把这四个维度想清楚。你优化的是哪个指标?牺牲的是哪个指标?心里要有数。

一句话总结:延迟看百分位,吞吐量分 TPS/QPS,一致性按场景选,SLO 要基于数据定。这四个东西搞明白了,性能优化才有方向。


公众号:蓝海资料掘金营,微信deep3321