0

最近发现rrdtool的一个奇怪行为:如果数据是随机插入到数据库中的,图上会出现“飞溅”,这可以在附图中看到。我还注意到传入的数据与数据库转储中的数据不匹配。请告诉我我做错了什么。

我试过 rrdtool 版本 1.6.0 和 1.7.2,平台是带有 Armbian Linux(内核版本:5.4.45-sunxi)的 Orange Pi One(armv7l)。我还在 x86 平台上进行了测试,它看起来工作正常。

奇怪的图

RRD 文件是使用以下命令创建的:

$ rrdcreate /var/db/homed_sensor_7.rrd --step 10 DS:data:GAUGE:3600:U:U RRA:AVERAGE:0.5:1:8640

数据来自 MQTT 随机时间,并通过下一个命令插入到数据库中,例如:

$ rrdupdate /var/db/homed_sensor_7.rrd N:24.8125

输入带有时间戳和值的数据日志:

$ cat /var/log/homed.log | grep 'Sensor 7' | grep '2020.08.11 08:1'
2020.08.11 08:10:08.667 homed-sensor: Sensor 7 temperature 24.8125
2020.08.11 08:10:09.616 homed-sensor: Sensor 7 temperature 24.75
2020.08.11 08:10:13.400 homed-sensor: Sensor 7 temperature 24.8125
2020.08.11 08:10:14.348 homed-sensor: Sensor 7 temperature 24.75
2020.08.11 08:10:40.324 homed-sensor: Sensor 7 temperature 24.8125
2020.08.11 08:10:41.269 homed-sensor: Sensor 7 temperature 24.75
2020.08.11 08:10:45.894 homed-sensor: Sensor 7 temperature 24.8125
2020.08.11 08:10:46.856 homed-sensor: Sensor 7 temperature 24.75
2020.08.11 08:10:54.293 homed-sensor: Sensor 7 temperature 24.8125
2020.08.11 08:10:55.215 homed-sensor: Sensor 7 temperature 24.75
2020.08.11 08:10:58.032 homed-sensor: Sensor 7 temperature 24.8125
2020.08.11 08:10:58.972 homed-sensor: Sensor 7 temperature 24.75
2020.08.11 08:11:03.592 homed-sensor: Sensor 7 temperature 24.8125
2020.08.11 08:11:04.518 homed-sensor: Sensor 7 temperature 24.75
2020.08.11 08:11:22.266 homed-sensor: Sensor 7 temperature 24.8125
2020.08.11 08:11:23.204 homed-sensor: Sensor 7 temperature 24.75
2020.08.11 08:11:49.320 homed-sensor: Sensor 7 temperature 24.8125
2020.08.11 08:11:50.264 homed-sensor: Sensor 7 temperature 24.75
2020.08.11 08:12:08.986 homed-sensor: Sensor 7 temperature 24.8125
2020.08.11 08:12:09.906 homed-sensor: Sensor 7 temperature 24.75
2020.08.11 08:12:19.224 homed-sensor: Sensor 7 temperature 24.8125
2020.08.11 08:12:20.159 homed-sensor: Sensor 7 temperature 24.75
2020.08.11 08:12:35.085 homed-sensor: Sensor 7 temperature 24.8125
2020.08.11 08:12:35.999 homed-sensor: Sensor 7 temperature 24.75
2020.08.11 08:13:10.514 homed-sensor: Sensor 7 temperature 24.8125
2020.08.11 08:13:11.453 homed-sensor: Sensor 7 temperature 24.75
2020.08.11 08:13:34.626 homed-sensor: Sensor 7 temperature 24.8125
2020.08.11 08:13:36.513 homed-sensor: Sensor 7 temperature 24.75
2020.08.11 08:13:57.952 homed-sensor: Sensor 7 temperature 24.8125
2020.08.11 08:13:58.896 homed-sensor: Sensor 7 temperature 24.75
2020.08.11 08:14:12.028 homed-sensor: Sensor 7 temperature 24.8125
2020.08.11 08:14:12.982 homed-sensor: Sensor 7 temperature 24.75
2020.08.11 08:14:33.386 homed-sensor: Sensor 7 temperature 24.8125
2020.08.11 08:14:34.341 homed-sensor: Sensor 7 temperature 24.75
2020.08.11 08:14:43.482 homed-sensor: Sensor 7 temperature 24.8125
2020.08.11 08:14:43.711 homed-sensor: Sensor 7 temperature 24.75
2020.08.11 08:14:45.597 homed-sensor: Sensor 7 temperature 24.8125
2020.08.11 08:14:46.534 homed-sensor: Sensor 7 temperature 24.75
2020.08.11 08:15:08.645 homed-sensor: Sensor 7 temperature 24.8125
2020.08.11 08:15:09.751 homed-sensor: Sensor 7 temperature 24.75
2020.08.11 08:15:12.852 homed-sensor: Sensor 7 temperature 24.8125
2020.08.11 08:15:13.317 homed-sensor: Sensor 7 temperature 24.75
2020.08.11 08:18:41.772 homed-sensor: Sensor 7 temperature 24.8125
2020.08.11 08:18:42.712 homed-sensor: Sensor 7 temperature 24.75
2020.08.11 08:19:07.107 homed-sensor: Sensor 7 temperature 24.8125
2020.08.11 08:19:08.058 homed-sensor: Sensor 7 temperature 24.75
2020.08.11 08:19:33.253 homed-sensor: Sensor 7 temperature 24.8125
2020.08.11 08:19:34.194 homed-sensor: Sensor 7 temperature 24.75
2020.08.11 08:19:53.916 homed-sensor: Sensor 7 temperature 24.8125
2020.08.11 08:19:54.860 homed-sensor: Sensor 7 temperature 24.75

RRD同时转储:

$ rrdtool dump /var/db/rrd/homed_sensor_7.rrd | grep '2020-08-11 08:1'
<!-- 2020-08-11 08:10:00 MSK / 1597122600 --> <row><v>2.600518229e+01</v></row>
<!-- 2020-08-11 08:10:10 MSK / 1597122610 --> <row><v>2.480645131e+01</v></row>
<!-- 2020-08-11 08:10:20 MSK / 1597122620 --> <row><v>2.350490220e+01</v></row>
<!-- 2020-08-11 08:10:30 MSK / 1597122630 --> <row><v>2.546319293e+01</v></row>
<!-- 2020-08-11 08:10:40 MSK / 1597122640 --> <row><v>2.546319293e+01</v></row>
<!-- 2020-08-11 08:10:50 MSK / 1597122650 --> <row><v>2.480096602e+01</v></row>
<!-- 2020-08-11 08:11:00 MSK / 1597122660 --> <row><v>2.480094575e+01</v></row>
<!-- 2020-08-11 08:11:10 MSK / 1597122670 --> <row><v>2.391521916e+01</v></row>
<!-- 2020-08-11 08:11:20 MSK / 1597122680 --> <row><v>2.570375508e+01</v></row>
<!-- 2020-08-11 08:11:30 MSK / 1597122690 --> <row><v>2.305996423e+01</v></row>
<!-- 2020-08-11 08:11:40 MSK / 1597122700 --> <row><v>2.655912879e+01</v></row>
<!-- 2020-08-11 08:11:50 MSK / 1597122710 --> <row><v>2.480876661e+01</v></row>
<!-- 2020-08-11 08:12:00 MSK / 1597122720 --> <row><v>2.481034981e+01</v></row>
<!-- 2020-08-11 08:12:10 MSK / 1597122730 --> <row><v>2.480667576e+01</v></row>
<!-- 2020-08-11 08:12:20 MSK / 1597122740 --> <row><v>2.480821922e+01</v></row>
<!-- 2020-08-11 08:12:30 MSK / 1597122750 --> <row><v>2.481094399e+01</v></row>
<!-- 2020-08-11 08:12:40 MSK / 1597122760 --> <row><v>2.266941020e+01</v></row>
<!-- 2020-08-11 08:12:50 MSK / 1597122770 --> <row><v>2.552484289e+01</v></row>
<!-- 2020-08-11 08:13:00 MSK / 1597122780 --> <row><v>2.552484289e+01</v></row>
<!-- 2020-08-11 08:13:10 MSK / 1597122790 --> <row><v>2.552484289e+01</v></row>
<!-- 2020-08-11 08:13:20 MSK / 1597122800 --> <row><v>2.366359064e+01</v></row>
<!-- 2020-08-11 08:13:30 MSK / 1597122810 --> <row><v>2.595585752e+01</v></row>
<!-- 2020-08-11 08:13:40 MSK / 1597122820 --> <row><v>2.383080995e+01</v></row>
<!-- 2020-08-11 08:13:50 MSK / 1597122830 --> <row><v>2.578249258e+01</v></row>
<!-- 2020-08-11 08:14:00 MSK / 1597122840 --> <row><v>2.476898851e+01</v></row>
<!-- 2020-08-11 08:14:10 MSK / 1597122850 --> <row><v>2.485007357e+01</v></row>
<!-- 2020-08-11 08:14:20 MSK / 1597122860 --> <row><v>2.249212094e+01</v></row>
<!-- 2020-08-11 08:14:30 MSK / 1597122870 --> <row><v>2.712694797e+01</v></row>
<!-- 2020-08-11 08:14:40 MSK / 1597122880 --> <row><v>2.480676238e+01</v></row>
<!-- 2020-08-11 08:14:50 MSK / 1597122890 --> <row><v>2.397873126e+01</v></row>
<!-- 2020-08-11 08:15:00 MSK / 1597122900 --> <row><v>2.563894731e+01</v></row>
<!-- 2020-08-11 08:15:10 MSK / 1597122910 --> <row><v>2.480573101e+01</v></row>
<!-- 2020-08-11 08:15:20 MSK / 1597122920 --> <row><v>2.333396444e+01</v></row>
<!-- 2020-08-11 08:15:30 MSK / 1597122930 --> <row><v>2.488628828e+01</v></row>
<!-- 2020-08-11 08:15:40 MSK / 1597122940 --> <row><v>2.488628828e+01</v></row>
<!-- 2020-08-11 08:15:50 MSK / 1597122950 --> <row><v>2.488628828e+01</v></row>
<!-- 2020-08-11 08:16:00 MSK / 1597122960 --> <row><v>2.488628828e+01</v></row>
<!-- 2020-08-11 08:16:10 MSK / 1597122970 --> <row><v>2.488628828e+01</v></row>
<!-- 2020-08-11 08:16:20 MSK / 1597122980 --> <row><v>2.488628828e+01</v></row>
<!-- 2020-08-11 08:16:30 MSK / 1597122990 --> <row><v>2.488628828e+01</v></row>
<!-- 2020-08-11 08:16:40 MSK / 1597123000 --> <row><v>2.488628828e+01</v></row>
<!-- 2020-08-11 08:16:50 MSK / 1597123010 --> <row><v>2.488628828e+01</v></row>
<!-- 2020-08-11 08:17:00 MSK / 1597123020 --> <row><v>2.488628828e+01</v></row>
<!-- 2020-08-11 08:17:10 MSK / 1597123030 --> <row><v>2.488628828e+01</v></row>
<!-- 2020-08-11 08:17:20 MSK / 1597123040 --> <row><v>2.488628828e+01</v></row>
<!-- 2020-08-11 08:17:30 MSK / 1597123050 --> <row><v>2.488628828e+01</v></row>
<!-- 2020-08-11 08:17:40 MSK / 1597123060 --> <row><v>2.488628828e+01</v></row>
<!-- 2020-08-11 08:17:50 MSK / 1597123070 --> <row><v>2.488628828e+01</v></row>
<!-- 2020-08-11 08:18:00 MSK / 1597123080 --> <row><v>2.488628828e+01</v></row>
<!-- 2020-08-11 08:18:10 MSK / 1597123090 --> <row><v>2.488628828e+01</v></row>
<!-- 2020-08-11 08:18:20 MSK / 1597123100 --> <row><v>2.488628828e+01</v></row>
<!-- 2020-08-11 08:18:30 MSK / 1597123110 --> <row><v>2.488628828e+01</v></row>
<!-- 2020-08-11 08:18:40 MSK / 1597123120 --> <row><v>2.488628828e+01</v></row>
<!-- 2020-08-11 08:18:50 MSK / 1597123130 --> <row><v>2.432612710e+01</v></row>
<!-- 2020-08-11 08:19:00 MSK / 1597123140 --> <row><v>2.529321738e+01</v></row>
<!-- 2020-08-11 08:19:10 MSK / 1597123150 --> <row><v>2.268383952e+01</v></row>
<!-- 2020-08-11 08:19:20 MSK / 1597123160 --> <row><v>2.587393409e+01</v></row>
<!-- 2020-08-11 08:19:30 MSK / 1597123170 --> <row><v>2.587393409e+01</v></row>
<!-- 2020-08-11 08:19:40 MSK / 1597123180 --> <row><v>2.316523793e+01</v></row>
<!-- 2020-08-11 08:19:50 MSK / 1597123190 --> <row><v>2.645360868e+01</v></row>
<!-- 2020-08-11 08:10:00 MSK / 1597122600 --> <row><v>2.479729023e+01</v></row>
4

2 回答 2

0

通过在将数据插入数据库时​​添加最接近的时间戳来解决问题:

$ rrdupdate /var/db/homed_sensor_7.rrd 1597122920:24.8125
于 2020-08-11T08:40:38.820 回答
0

这是导致您的问题的数据规范化。

简单来说,RRD的数据必须恰好在配置的时间间隔边界上。如果您为此提供数据偏移量,那么它将使用直线插值来尝试并根据可用样本及其时间点进行估计。

如果您的样本距离很远,这可能意味着它高估了下一个样本,从而低估了下一个样本。总体平均值是正确的,但你会有尖峰(如你所见)。

正如您所发现的,解决方案是确保时间戳正好在时间边界上 - 在您的情况下,是 10 秒的倍数。

这里对各种数据操作有很好的解释:http ://rrdtool.vandenbogaerdt.nl/process.php

于 2020-08-12T05:13:20.203 回答