我在 RRDTool 图表上绘制了很多 NaN 值,但我不明白为什么。
我的脚本用于填充 RRD 中的 RRA:
#! /bin/bash
LOAD=`cat /proc/loadavg | awk '{print $1}'`
RXBYTES=`cat /sys/class/net/eth0/statistics/rx_bytes`
TXBYTES=`cat /sys/class/net/eth0/statistics/tx_bytes`
TEMP=`/opt/vc/bin/vcgencmd measure_temp|cut -c6-9`
MEM=`free -b | grep Mem | awk '{print $4/$2 * 100.0}'`
/usr/bin/rrdtool update /usr/local/bin/system/load.rrd N:$LOAD
/usr/bin/rrdtool update /usr/local/bin/system/data.rrd -t datadown:dataup N:$RXBYTES:$TXBYTES
/usr/bin/rrdtool update /usr/local/bin/system/pitemp.rrd N:$TEMP
/usr/bin/rrdtool update /usr/local/bin/system/mem.rrd N:$MEM
echo $LOAD
echo $RXBYTES
echo $TXBYTES
echo $TEMP
echo $MEM
如您所见,我正在绘制以下图表:
- 平均负载
- 数据吞吐量计数器
- CPU/GPU/SoC 温度
- 内存百分比
以及将值输出到终端以确认所传递的值是数字。
所以我运行脚本并得到这个:
0.36
2665426950
1669124151
41.7
2.36093
这一切看起来都很好,特别是因为 bash 中没有数据类型定义(因此无需担心整数/双精度数/字符串/等)。然后我运行脚本来绘制图表:
#! /bin/bash
/usr/bin/rrdtool graph 'data.png' \
--title 'Odin traffic (eth0)' \
--watermark "Graph Drawn `date`" \
--vertical-label 'Bytes' \
--alt-autoscale \
--units=si \
--width '640' \
--height '300' \
--full-size-mode \
--start end-172800s \
'DEF:rx=data.rrd:datadown:AVERAGE' \
'DEF:tx=data.rrd:dataup:AVERAGE' \
'AREA:rx#FF0000FF:Tx\:' \
'GPRINT:tx:LAST:\:%8.2lf %s]' \
'STACK:tx#0709FDFF:Rx\:' \
'GPRINT:rx:LAST:\:%8.2lf %s]\n'
/usr/bin/rrdtool graph 'load.png' \
--title 'Odin Load Average' \
--watermark "Graph Drawn `date`" \
--alt-autoscale \
--width '640' \
--height '300' \
--full-size-mode \
--start end-172800s \
'DEF:load=load.rrd:load:AVERAGE' \
'AREA:load#FF0000FF:Load Average\:' \
'GPRINT:load:LAST:\:%8.2lf %s]'
/usr/bin/rrdtool graph 'mem.png' \
--title 'Odin Memory Usage' \
--watermark "Graph Drawn `date`" \
--vertical-label '%' \
--upper-limit '100' \
--lower-limit '0' \
--width '640' \
--height '300' \
--full-size-mode \
--start end-172800s \
'DEF:mem=mem.rrd:mem:AVERAGE' \
'AREA:mem#FF0000FF:Memory\:' \
'GPRINT:mem:LAST:\:%8.2lf %s]'
/usr/bin/rrdtool graph 'pitemp.png' \
--title 'Odin SoC Temperature' \
--watermark "Graph Drawn `date`" \
--vertical-label '°C' \
--alt-autoscale \
--width '640' \
--height '300' \
--full-size-mode \
--start end-172800s \
'DEF:pitemp=pitemp.rrd:pitemp:AVERAGE' \
'AREA:pitemp#FF0000FF:CPU/GPU Temperature\:' \
'GPRINT:pitemp:LAST:\:%8.2lf %s]'
我得到预期的输出:
640x300
640x300
640x300
640x300
但是当我查看图表时(所有图表都如下图所示),所有值都不是数字(nan)。任何帮助,将不胜感激。
答案1
我可以NaN
使用以下(两个数据点)重现该内容,或者如果数据点“稀疏”且超出该$TWOSTEP
值。因此,我怀疑您的文件中要么没有足够的数据,要么数据条目有问题,它与“NaN if long than $TWOSTEP
”值发生冲突。尝试增加该值的窗口$TWOSTEP
,并随着时间的推移检查数据文件rrdtool dump
以查看它们是如何填充的?
#!/bin/sh
GRAPH_VIEWER=open
METRIC=twods
NOW=`date +%s`
STEP=10
TWOSTEP=20
rm -f $METRIC.rrd $METRIC.png
set -e
rrdtool create $METRIC.rrd --step $STEP -- \
"DS:xxx:COUNTER:$TWOSTEP:0:U" \
"DS:yyy:COUNTER:$TWOSTEP:0:U" \
'RRA:AVERAGE:0.5:1:2160' \
'RRA:AVERAGE:0.5:60:14400' \
'RRA:AVERAGE:0.5:1440:1825'
XSTART=1000
YSTART=500
# NOTE 1 2 3 okay; lower than that does produce NaN, as does "sparse"
# entries such as "1 2 50 99" or such
for i in 1 2; do
TS=$(expr $NOW + $(expr $i \* 10))
XXX=$(expr $XSTART + $i)
YYY=$(expr $YSTART + $(expr $i \* 7))
rrdtool update $METRIC.rrd -t xxx:yyy $TS:$XXX:$YYY
done
rrdtool graph $METRIC.png \
--width 640 --height 480 --full-size-mode --alt-autoscale \
--start $NOW --end $(expr $NOW + $(expr $STEP \* 10)) \
"DEF:blahx=$METRIC.rrd:xxx:AVERAGE" \
"DEF:blahy=$METRIC.rrd:yyy:AVERAGE" \
'AREA:blahx#FF0000FF:blahy\:' \
'GPRINT:blahy:LAST:\:%8.2lf %s]' \
'STACK:blahy#0709FDFF:blahx\:' \
'GPRINT:blahx:LAST:\:%8.2lf %s]\n'
# NOTE be sure to view the new image, and not the old cached one
# (Preview.app on Mac OS X is bad about this, hence the `rm *.png`
# line, above.)
exec $GRAPH_VIEWER $METRIC.png