平均占用率 70% 就算安全吗?

按对数正态模型算:平均占用 70% 时,单拍执行时间超过周期的概率约 3%–9%(1/34–1/11);即使降到 50%,仍有 0.02%–0.7%。安全判据是尾部概率,不是平均占用。

"CPU 占用 70%,还有 30% 余量,应该稳了"——这句话把平均值当成了上界。按对数正态分布估算,平均占用 70% 时,单拍执行时间超过周期的概率约 3%(σL=0.2)到 9%(σL=0.3),也就是每 11–34 拍就有一次超时。要把它压到万分之一以下,平均占用得降到 40% 左右。

现象

这类系统通常表现得很"稳定":跑十分钟没事,跑一小时复位一次;加个日志又正常了。于是排查方向往往跑偏——电源、温度、通信干扰。

真正的问题在于判据选错了:

常见判据 回答的问题 漏掉什么
平均占用率 < 70% 平均每拍用掉多少时间 单拍会不会超过周期
最坏执行时间 < 周期 实测到的最坏值是否越界 没测到的那部分有多长
P(执行时间 > 周期) 足够小 越界发生的频率 ——

前两个都只看"中心",第三个才看"尾部"。

原因

超时的条件是 exec > T,它只跟分布的右尾有关,跟均值没有直接关系。两个系统可以有同样的均值,尾部差一个数量级。

用对数正态描述执行时间是个常用选择(右偏、非负),于是超时概率有闭式解:

P(exec > T) = 1 − Φ( (ln T − μ) / σ ) ,   μ = ln(平均) − σ²/2

注意 μ 里要减去 σ²/2,这是对数正态的均值与中位数关系;漏掉它,算出的概率会偏小。σ 越大(抖动越大),同样的平均占用下尾部越厚。

怎么做

第一步:先记录分布,不要只记录平均值。 至少要有直方图或分位数;只有均值与最大值两个数,估不出尾部。

第二步:按上面的公式算不同占用率下的超时概率,再反推"能接受多少"。

import math

def p_over(T, util, sigma):
    mu_mean = util * T                      # 平均执行时间
    mu = math.log(mu_mean) - sigma**2 / 2   # 均值 → 对数均值
    z = (math.log(T) - mu) / (sigma * math.sqrt(2))
    return 1 - 0.5 * (1 + math.erf(z))

for util in (0.3, 0.5, 0.7, 0.85):
    for s in (0.2, 0.3):
        p = p_over(100e-6, util, s)
        print("占用 %.0f%%  σ=%.1f  → %.3g (约 1/%.0f)" % (util * 100, s, p, 1 / p))

第三步:给"没测到"的部分一个上限。 跑了 N 次没超时,只能说明概率低于某个上界(95% 置信,Clopper-Pearson 单侧):

上界 = 1 − 0.05^(1/N) ≈ 3 / N

这条比"我跑了十万次都没事"有用得多——它把"没看到"翻译成一个可比较的数字。

验证

T=100 µs,两种对数标准差(尾部厚度)下的超时概率:

平均占用 σL = 0.2 σL = 0.3
30% 4.7e-10(1/21 亿) 1.6e-5(1/6.4 万)
50% 1.8e-4(1/5512) 6.9e-3(1/144)
70% 3.0e-2(1/34) 9.0e-2(1/11)
85% 1.8e-1(1/6) 2.5e-1(1/4)

"没测到"能保证多少:

无超时次数 N 95% 上界 约合
100 2.95e-2 1/34
1 000 2.99e-3 1/334
10 000 3.0e-4 1/3339
100 000 3.0e-5 1/33382

注意一个巧合式的对照:跑 100 次没出错,只能保证超时概率不高于 3%(1/34)——这恰好就是"平均占用 70%、σ=0.2"时的估算值。"我测了 100 次都好的"这句话,几乎没有说服力。

超时概率随平均占用率的变化

改前按平均占用 70% 判安全 → 改后按尾部概率 1/11–1/34 判风险:同一套系统,判据从"看起来有余量"变成"每十几拍会越界一次"。

边界

  • 对数正态只是模型选择。真实执行时间可能是多峰(不同分支)或有硬上界,这时公式会给出偏悲观或偏乐观的估计,必须用实测直方图校验。
  • 本文是解析计算,不是硬件实测;T 与占用率都是示例值,替换成你自己的数即可。
  • 温度、供电电压、Flash 等待周期、总线争用都会改变分布形状;跨工况外推不可靠,尤其不能把室温下的分布用到高温满载。
  • "3/N" 只对无失败的样本成立(0 次成功判据),且假设各次独立同分布;有失败样本时要改用二项分布的区间估计。
  • 超时的后果取决于系统设计:丢一拍、输出保持、看门狗复位,严重程度差很多。概率小不等于可以忽略——看门狗会把一次超时放大成一次重启。

最后验证于 2026-10-29 · 解析计算(Python 3.13,math.erf)· 对数正态模型 · T=100 µs · 模型 v1.0

平均占用率 70% 就算安全吗?

作者 JimmyZ,嵌入式 / 确定性控制方向。GitHub · 掘金