有没有一种简单的方法可以获取最后 x 分钟的成功读取百分比?

Is there an easy way to get the percentage of successful reads of last x minutes?

我有一个 Beaglebone Black 设置,它每秒通过 I²C 与他的奴隶通信并从他们那里读取数据。有时 I²C 读出会失败,我想获得有关这些失败的统计信息。

我想实现一种算法来显示过去 5 分钟(最多 24 小时)的成功通信百分比并不断更新该值。如果我用一个数组来实现 'normally' ,我在其中存储每秒 success/no 成功,那将意味着很多 RAM/CPU 负载被浪费用于次要功能(特别是如果我想查看最近 24 小时的统计数据)。

有人知道这样做的好方法吗,或者有人能指出正确的方向吗?

你为什么不直接实现一个低通滤波器?对于每一次成功的传输,你推入一个 1,对于每一个失败的传输,你推入一个 0;结果是一个介于 0 和 1 之间的数字。假设您的传输是周期性发生的,这很有效——您只需将该滤波器的截止频率调整到您想要的 "averaging duration".

但是,我无法理解您的 RAM 论点:假设您存储一个字节来表示每次传输的成功或失败,您说每秒发生一次,那么您最终每天有 86400B -- 85KB/天真的可以忽略不计.

编辑 截止频率来自信号理论,描述了通过低通或高通滤波器的最高或最低频率。

实现低通滤波器很简单;像(伪代码):

new_val = 1 //init with no failed transfers
alpha = 0.001
while(true):
    old_val=new_val
    success=do_transfer_and_return_1_on_success_or_0_on_failure()
    new_val = alpha * success + (1-alpha) * old_val

这是单抽头 IIR(无限脉冲响应)滤波器;单击一次,因为只有一个字母,因此只有一个数字存储为状态。

EDIT2alpha 的值定义了此过滤器的行为。

EDIT3:可以用一个滤波器设计工具给你正确的alpha;只需将低通滤波器的截止频率设置为 0.5/integrationLengthInSamples,select IIR 的 0 阶并使用椭圆设计方法(大多数工具默认为 butterworth,但 0 阶 butterworths 不做任何事情).

我将使用 scipy 并将生成的 (b,a) 元组(a 在这里为 1)转换为此反馈表的正确形式。

更新 根据 OP 'determine a trend of which devices are failing' 的评论,我会推荐 Marcus Müller ꕺꕺ 提出的几何平均值。

准确方法

下面的方法旨在获取 'well defined' 随时间变化的性能统计数据,这些数据对于 'after the fact' 分析也很有用。 请注意,几何平均值在最近的消息而不是固定时间段内具有 'look back'。

维护一个 24*60/5 = 288 'prior success rates'(SR[i] with i=-1, -2,...,-288)的滚动数组,每个代表 5 分钟的间隔前 24 小时。

如果元素是 64 位双精度,那将消耗大约 2.5K。

为了 'effect' 不断更新使用估计的 'Current' 成功率如下:

ECSR = (t*S/M+(300-t)*SR[-1])/300

其中 S 和 M 是当前(部分完成的时间段)中错误和消息的计数。SR[-1] 是前一个(现在完成的)存储桶。

t 是当前桶过期的秒数。

注意:启动时需要使用300*S/M/t。

本质上,近似假设错误率在之前的 5 - 10 分钟内保持稳定。

为了 'effect' 24 小时回顾,您可以 'shuffle' 在每 5 分钟间隔结束时向下(通过复制或 memcpy())数据,或者实施 'circular array by keeping track of the current bucket index'.

注意: 对于许多 management/diagnostic 目的,15 分钟的间隔通常是完全足够的。您可能希望使 'grain' 可配置。