rrdtool 是「Round Robin Database tool」的缩写,是一个存放固定数量的数值型数据库,适合随时间变化的量的统计。比如网络传输速度、CPU 使用率、聊天室在线人数等。与大部分数据库软件不一样的是,它可以直接可视化数据,生成 PNG 图像。第一次使用,找点容易快速获取又有意义的数据源——ping 延迟好了。
第一步,确定数据库怎么存放什么数据。我打算发一千个 ping 包,然后存储其延迟。rrdtool 本来是按时间存储的,我用序号来骗骗它好了。起始时间为现在时间。数据的时间间隔为 1 秒,但实际上是一个序号。聚集函数为平均值,存储 1000 个数据。命令如下(百分号提示符表示 shell 是 zsh,下同):
% start=$(date +'%s') % rrdtool create ping.rrd --start=$start -s1 DS:ping:GAUGE:1:0:U RRA:AVERAGE:0.5:1:1000
其中,DS
是「数据源(data source)」的意思,RRA
是「round robin archives」。-s1
表示间隔为 1s。时间点是以距 epoche 的秒数表示的。
DS 部分,ping 是数据的名字,GAUGE
表示这就是一个值,不是累加(COUNTER
,如已传输字节数)或者其它的。1
是 heartbeat,超时这个时间还没收到数据的话就当作UNKNOWN
值了。再后边是最小值和最大值,超出的话也会被当成UNKNOWN
。那里的U
表示「UNKNOWN」。
RRA 部分,AVERAGE
是求平均值的聚集函数。类似的还有MAX
之类的。用于决定一个区间内的多个值如何归并为一个值。0.5
部分没看太懂。1
即每秒取一个值,1000
则是存储 1000 个这样的值。
取得数据:
% ping -c 1000 google.com > ping.log
把数据处理后喂给 rrdtool 的数据库,每次喂最多 1000 条数据:
% grep -oP '\d+\sttl\S+ \S+' ping.log | sed 's/ttl.*=//g' | awk -vstart=$start '{print $1+start ":" $2}' | xargs -n 1000 rrdtool update ping.rrd
生成每 1、5、15 秒的统计图像:
% for i in 1 5 15; do rrdtool graph ping_$i.png --start=$start --end=$(( $start + 1000 )) -S $i --vertical-label=ms --width=800 --height=300 DEF:v=ping.rrd:ping:AVERAGE 'AREA:v#00dd00'; done
其中,-S
是指定绘图的步长。其它参数很好理解。后两部分解释如下:
DEF
设置变量v
为 ping.rrd 数据库中的 ping 变量。还有可选的CDEF
,比如可以写CDEF:s=v,1000,/
,即令变量s
等于v / 1000
。这里是逆波兰表达式。'AREA:v#00dd00'
表示绘制矩形图,纵轴变量为v
,颜色为 #00dd00。画线的话可以用'LINE1:v#00dd00'
这样子,LINE
后边的数字是线的宽度。
好啦,图像如下: