性能度量指标:延迟、吞吐量、资源利用率、并发数与响应时间分布

做嵌入式系统优化这么多年,我见过太多团队一上来就闷头调代码,结果调了半个月发现瓶颈根本不在那里。你想想看,连度量指标都没搞清楚,怎么知道该往哪个方向使劲?

今天我们就来聊聊性能分析的五个核心指标。说白了,这五个指标就是你的诊断工具。就像医生看病要先量体温、测血压一样,我们做性能优化也得先看这些数据。

延迟(Latency)

延迟,就是系统从收到请求到返回结果所花的时间。单位通常是毫秒或微秒。

我个人习惯把延迟分成两类:

  • 端到端延迟:用户按下按钮到看到反馈的时间
  • 内部延迟:模块内部处理一个请求的时间

我在项目中遇到过一个问题:某工业控制器的响应时间总是忽高忽低。查了半天,发现是中断处理函数里做了太多计算,把高优先级的中断给堵住了。嗯,这里要注意——延迟的测量要区分平均延迟和最大延迟,很多时候最大延迟才是真正的杀手。

核心观点:延迟是用户体验的直接体现。对于实时系统,延迟的确定性比平均值更重要。

吞吐量(Throughput)

吞吐量,单位时间内系统能处理的任务数量。常见单位有:请求/秒、帧/秒、事务/秒。

吞吐量和延迟是什么关系?很多人以为它们是一回事,其实不然。我打个比方:

  • 延迟 = 每个包裹从寄出到送达的时间
  • 吞吐量 = 快递站每天能处理多少包裹

你可能会问:延迟低了,吞吐量自然就高了吧?不一定。我记得有一次优化一个数据采集系统,把单次处理延迟从50ms降到了10ms,但吞吐量只提升了20%。为什么?因为系统被I/O瓶颈卡住了,CPU再快也没用。

避坑指南:我曾经以为降低延迟就能提升吞吐量,结果发现系统在等待资源时CPU是空闲的。后来我学会了用流水线设计,把等待时间利用起来,吞吐量才真正上去。

资源利用率(CPU/内存/IO)

资源利用率,说白了就是系统资源被占用的比例。我们主要关注三个维度:

资源类型 理想范围 危险信号
CPU 60% - 80% 持续 > 90% 或频繁 100%
内存 70% - 85% 接近 100% 或频繁交换
I/O 50% - 70% 持续 > 80% 或队列堆积

这里有个常见的误区:CPU利用率低就说明系统很闲?不一定。我在项目中遇到过CPU利用率只有30%,但系统响应却很慢的情况。查到最后发现是锁竞争导致的——CPU都在忙着自旋等待,根本没干正事。

警告:不要只看平均利用率。峰值利用率和利用率分布同样重要。我曾经因为只看平均值,漏掉了一个每10秒出现一次的CPU尖峰,导致系统在关键时刻丢包。

并发数

并发数,就是系统同时处理的请求数量。这个指标很容易被误解。

你想想看,并发数越高越好吗?不是的。每个并发请求都会消耗资源——内存、文件描述符、网络连接。当并发数超过系统的承载能力时,性能会急剧下降。

我习惯用这个公式来估算:

最大并发数 = 资源总量 / 每个请求消耗的资源量

举个例子,一个嵌入式设备有256MB内存,每个TCP连接需要4KB缓冲区,那理论上最多支持65536个并发连接。但实际中还要考虑CPU开销、锁竞争等因素,通常只能用到理论值的30%-50%。

经验之谈:我曾经把一个系统的并发数从1000调到5000,结果吞吐量反而下降了。后来发现是线程切换开销太大。记住:并发不是免费的。

响应时间分布(P99/P95)

这是我最看重的指标。为什么?因为平均值会骗人。

假设你有100个请求,99个在10ms内完成,1个花了5秒。平均延迟是多少?大约60ms。看起来还不错对吧?但实际体验是:99%的用户觉得很快,1%的用户觉得卡死了。

P99的意思是:99%的请求都在这个时间以内完成。P95同理。

我一般这样看:

  • P50(中位数):代表典型体验
  • P95:代表大多数用户的体验上限
  • P99:代表最差情况下的体验
  • P99.9:代表极端情况

在嵌入式系统中,我特别关注P99。因为很多实时控制场景,哪怕只有1%的请求超时,都可能导致整个系统崩溃。

避坑指南:我曾经只盯着平均延迟优化,把平均值从20ms降到了5ms,自我感觉良好。结果上线后发现用户投诉不断。一查P99,从50ms飙升到了500ms。原来我的优化牺牲了尾部延迟。从那以后,我每次优化都会同时看P50、P95、P99三个值。

五个指标的关系

这五个指标不是孤立的。我画了一张图来说明它们之间的关系:

性能瓶颈 定位与突破 延迟 Latency 吞吐量 Throughput 资源利用率 CPU/内存/IO 并发数 Concurrency 响应时间分布 P99/P95 相互影响 相互影响 资源约束 资源约束 五个指标共同构成性能分析的完整视图

从这张图可以看出,五个指标是相互关联的。比如:

  • 并发数增加 → 资源利用率上升 → 延迟可能变大
  • 延迟降低 → 吞吐量可能提升
  • 资源利用率过高 → P99延迟会急剧恶化

所以,做性能优化时不能只看一个指标。我个人的习惯是:先看P99和资源利用率,找到异常点,再看延迟和吞吐量确认问题范围,最后用并发数做压力测试验证。

总结一下:这五个指标就像你的五感。少了一个,你就看不清系统的真实状态。下次遇到性能问题,先别急着改代码,把这五个指标拉出来看看,问题往往就一目了然了。


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