性能度量指标:延迟、吞吐量、资源利用率、并发数与响应时间分布
做嵌入式系统优化这么多年,我见过太多团队一上来就闷头调代码,结果调了半个月发现瓶颈根本不在那里。你想想看,连度量指标都没搞清楚,怎么知道该往哪个方向使劲?
今天我们就来聊聊性能分析的五个核心指标。说白了,这五个指标就是你的诊断工具。就像医生看病要先量体温、测血压一样,我们做性能优化也得先看这些数据。
延迟(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三个值。
五个指标的关系
这五个指标不是孤立的。我画了一张图来说明它们之间的关系:
从这张图可以看出,五个指标是相互关联的。比如:
- 并发数增加 → 资源利用率上升 → 延迟可能变大
- 延迟降低 → 吞吐量可能提升
- 资源利用率过高 → P99延迟会急剧恶化
所以,做性能优化时不能只看一个指标。我个人的习惯是:先看P99和资源利用率,找到异常点,再看延迟和吞吐量确认问题范围,最后用并发数做压力测试验证。
总结一下:这五个指标就像你的五感。少了一个,你就看不清系统的真实状态。下次遇到性能问题,先别急着改代码,把这五个指标拉出来看看,问题往往就一目了然了。
公众号:蓝海资料掘金营,微信deep3321