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
. 따라서 파일에 데이터가 충분하지 않거나 데이터 입력에 문제가 있고 $TWOSTEP
"NaN if long than" 값과 충돌하는 것 같습니다. 이 값의 창을 늘리고 $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