使用VDEF提取RTT最大值时rrdgraph核心转储问题求助
RRDtool VDEF触发缓冲区溢出,如何获取时间跨度内的RTT最大值?
我有一个存储每分钟采集的ping往返时间(RTT)序列的RRD文件,使用DEF:roundtrip=$TARGET.rrd:rtt:LAST提取数据。但尝试用VDEF提取序列最大值时,rrdgraph直接核心转储:
VDEF:rttmax=roundtrip,MAXIMUM *** buffer overflow detected ***: terminated
我需要生成图表时间跨度内RTT最大值的水平线,用来缩放其他数据序列。试过用DEF:maxrtt=$TARGET.rrd:rtt:MAX,但结果和roundtrip一致——因为我的RRD是1分钟间隔的,合并函数MAX和LAST效果完全相同。
请问用VDEF时哪里出错了?是不是必须在RRD中预先存储最大值才能实现需求?
我的最终需求是制作双Y轴图表:一个Y轴显示ping往返时间(波动极大,范围从0-1000ms到0-10000ms,需要自动缩放),另一个显示固定0-100%范围的丢包率百分比。
rrdtool info 输出:
filename = "K6ORI-LPD-TABLETOP-OMNI.rrd" rrd_version = "0003" step = 60 last_update = 1690739945 header_size = 896 ds[pl].index = 0 ds[pl].type = "GAUGE" ds[pl].minimal_heartbeat = 120 ds[pl].min = 0.0000000000e+00 ds[pl].max = 1.0000000000e+02 ds[pl].last_ds = "0" ds[pl].value = 0.0000000000e+00 ds[pl].unknown_sec = 0 ds[rtt].index = 1 ds[rtt].type = "GAUGE" ds[rtt].minimal_heartbeat = 120 ds[rtt].min = 0.0000000000e+00 ds[rtt].max = 1.0000000000e+07 ds[rtt].last_ds = "9.099" ds[rtt].value = 5.1636724911e+01 ds[rtt].unknown_sec = 0 rra[0].cf = "MAX" rra[0].rows = 1500 rra[0].cur_row = 440 rra[0].pdp_per_row = 1 rra[0].xff = 5.0000000000e-01 rra[0].cdp_prep[0].value = NaN rra[0].cdp_prep[0].unknown_datapoints = 0 rra[0].cdp_prep[1].value = NaN rra[0].cdp_prep[1].unknown_datapoints = 0
触发崩溃的rrdgraph命令:
rrdtool graph $TARGET.png -w 700 -h 400 -a PNG \ --start -7200 --end now --slope-mode \ --title "$TARGET" --watermark "`date`" --vertical-label "latency(ms)" \ --lower-limit 0 --x-grid MINUTE:10:HOUR:1:MINUTE:30:0:%R \ DEF:roundtrip=$TARGET.rrd:rtt:LAST \ DEF:packetloss=$TARGET.rrd:pl:LAST \ VDEF:rttmax=roundtrip,MAXIMUM \ CDEF:plscaled=rttmax,packetloss,*,100,/ \ AREA:plscaled#ff8800:"packetloss (%)" \ LINE2:roundtrip#000000:"roundtrip (ms)\n" \ GPRINT:roundtrip:LAST:"Cur\: %5.2lf" \ GPRINT:roundtrip:MAX:"Max\: %5.2lf" \ GPRINT:roundtrip:MIN:"Min\: %5.2lf\n" \ GPRINT:plscaled:LAST:"Plscaled\: %5.2lf\n" \ GPRINT:packetloss:LAST:"Packetloss\: %5.2lf\n" \ GPRINT:rttmax:LAST:"Rttmax\: %5.2lf\n" \
问题原因与解决方法
VDEF缓冲区溢出的原因
这是旧版RRDTool(如1.4.x系列)的已知bug,处理VDEF的MAXIMUM计算时,若数据集过大或内部缓冲区分配不足,会触发缓冲区溢出崩溃。直接升级到最新稳定版(1.7.x及以上)即可修复这类内存问题。无需预存最大值的替代方案
即使不升级,也能通过现有资源获取全局最大值:- 利用已有的MAX类型RRA:你的RRD已经配置了
MAX类型的RRA(rra[0].cf = "MAX"),且pdp_per_row=1,可以直接从该RRA提取数据后用VDEF计算全局最大值:DEF:rtt_max_rra=$TARGET.rrd:rtt:MAX VDEF:rttmax=rtt_max_rra,MAXIMUM - CDEF模拟最大值计算:若升级和RRA提取都不可行,可通过CDEF遍历数据点计算最大值(仅适合小时间跨度,性能较差):
CDEF:rttmax_init=roundtrip,POP,0 CDEF:rttmax_calc=roundtrip,rttmax_init,MAX,rttmax_init,EXCHANGE VDEF:rttmax=rttmax_calc,LAST
- 利用已有的MAX类型RRA:你的RRD已经配置了
双Y轴图表的最优实现
你不需要手动缩放丢包率,RRDTool原生支持双Y轴,直接用--right-axis参数即可实现独立刻度:rrdtool graph $TARGET.png -w 700 -h 400 -a PNG \ --start -7200 --end now --slope-mode \ --title "$TARGET" --watermark "`date`" \ --vertical-label "latency(ms)" --right-axis 1:0 --right-axis-label "packetloss(%)" \ --lower-limit 0 --x-grid MINUTE:10:HOUR:1:MINUTE:30:0:%R \ DEF:roundtrip=$TARGET.rrd:rtt:LAST \ DEF:packetloss=$TARGET.rrd:pl:LAST \ LINE2:roundtrip#000000:"roundtrip (ms)" \ AREA:packetloss#ff8800:"packetloss (%)":STACK \ GPRINT:roundtrip:LAST:"Cur latency\: %5.2lf ms" \ GPRINT:roundtrip:MAX:"Max latency\: %5.2lf ms" \ GPRINT:roundtrip:MIN:"Min latency\: %5.2lf ms\n" \ GPRINT:packetloss:LAST:"Cur packetloss\: %5.2lf %%"其中
--right-axis 1:0表示右侧Y轴独立使用0-100的刻度,丢包率直接用原始值绘制,RTT自动适配左侧Y轴的动态范围。
内容的提问来源于stack exchange,提问作者wsanders
相关产品推荐
相关产品推荐

