定义
rrdtool 是一套命令行程序,用于建立、更新和读取环形数据库文件,并依据库中的数据生成图表[1]。它处理的数值都带时间戳,典型的例子有链路带宽、机房温度、服务器负载平均值等[1]。数据以环形数据库(Round Robin Database,RRD)文件的形式保存,这种格式占用空间很小,并且不会随着时间推移而膨胀[1]。程序在读取数据时会按设定的数据密度做处理,从而把数值以图形方式呈现出来[3]。rrdtool 也提供图形化输出能力,可以把库中的数据导出为图,原始设计目的正是如此[2]。
原理
一个 RRD 文件在创建时就要指定时间步长(step),也就是相邻两个数据点之间的秒数,创建之后不能再修改[4]。外部送入的数值往往不在步长边界上,rrdtool 会先对它们做插值,使数据落在内部的时间格上,一个时间格内插值后的结果称为主数据点(PDP)[4]。若干主数据点按归并函数(CF)合并成一个归并数据点(CDP),常见的归并函数有平均值、最小值、最大值和最后一个值[4][5]。合并结果存入环形归档(RRA);RRA 保存固定条数的 CDP,并规定多少个 PDP 合成一条以及使用哪种归并函数[4]。
第二段
当归档写满之后,下一次写入会覆盖最旧的一条记录,这种绕圈覆盖的行为正是「环形」一词的来源,程序的名称也由此而来[4]。覆盖意味着历史数据无法无限保留,因此一个 RRD 文件可以同时包含多个 RRA,分别覆盖不同的时间跨度或使用不同的归并函数[4]。取值时,rrdtool 会自动挑选「分辨率最高、同时仍能覆盖所请求时间段」的那个归档,绘图子系统同样遵循这一机制。用来衡量某个归并区间内允许有多少比例数据缺失的参数称为 xff,取值范围为 0 到 1,缺失比例超过该值时该点记为未知[5]。
发展历程
rrdtool 脱胎于MRTG。MRTG 于 1995 年为一个小站点而写,它采用固定大小的日志文件;随着用户增多,大量补丁使代码难以维护,大型安装中还出现性能问题,并且只能在一张图里画两个值、日志为整数格式、采样间隔固定为 5 分钟,也没有「未知值」的概念[6]。1997 年底,MRTG 的重新设计工作启动;设计从实现一种全新的数据存储机制开始,负责数据处理与绘图的 C 程序被命名为 rrdtool,它既可从命令行调用,也可通过 Perl 绑定调用[7]。在 MRTG 开发者邮件列表上讨论之后,人们决定把 rrdtool 从 MRTG-3 中拆分出来,作为独立软件包发布[7]。
1.0 版于 1999 年 7 月 16 日发布,被视为「把 MRTG 做对」的成果[2]。此后 1.1 版于 2005 年 4 月 25 日发布,带来 EPS、PDF 与 SVG 输出、VDEF、趋势线、百分位数以及 Holt-Winters 预测等功能[2]。1.3 版于 2008 年 6 月 11 日发布,改用 cairo 与 pango 绘图,加入抗锯齿、虚线、国际化与 XML 转储等能力;1.4 版于 2009 年 10 月 27 日发布,引入缓存守护进程 rrdcached、Lua 绑定等[2]。1.6 版(2016 年 5 月 9 日)实现线程安全,1.7 版(2017 年 5 月 17 日)完成代码审计并重写 Python 绑定,1.8 版于 2022 年 3 月 13 日发布,1.9 版于 2024 年 7 月 29 日发布并支持可配置的加锁方式[2]。
应用
rrdtool 往往不直接面向最终用户,而是由各类包装脚本或前端程序调用:这些程序轮询设备、把数据送进 RRD 文件,并提供更友好的界面和定制图表[1]。它可以经由 Shell 脚本或 Perl 模块使用,也常作为其他测量工具的后端[8]。采用它的工具为数众多,最早的大概是 MRTG,它把 rrdtool 作为旧有 ASCII 日志格式的替代方案;SmokePing 与 Cricket 也是例子[8]。在校园与科研网络中,Cacti 围绕 rrdtool 构建,把必要信息存入 MySQL,以 Web 界面配置绝大多数功能,并通过轮询脚本采集设备数据[9]。
在大规模监控场景中,rrdcached 守护进程负责接收对 RRD 文件的更新,把它们累积起来,待数量足够或超过设定时间后再写入文件,并提供 flush 命令强制落盘,使绘图程序能拿到最新数据,从而减少大量 RRD 文件带来的磁盘活动[10]。有监控系统借助 rrdcached 优化对 RRD 文件的访问,以达到所需的操作量[11]。除网络与系统监控外,也有流量分析工具用 RRD 展示流、包与字节数,并依据条件设置告警[12]。rrdtool 提供 Perl、Python、Ruby、Tcl、PHP、Lua 等多种语言的绑定[2][13]。图表输出支持 PNG、SVG、EPS、PDF 等图像格式,也可导出 XML、JSON、CSV、TSV 等结构化格式[14]。
局限
归一化与归并会不可逆地改动原始数据。rrdtool 不是按提交内容原样保存记录的关系型数据库,它在存储前会做数据归一化、速率计算和归并,这些步骤可能以使用者意料之外的方式改变数值[15]。数据必须恰好落在步长边界上,否则会被调整以适配边界,数值随之改变[16]。以 5 分钟采样、600 像素宽的图为例,rrdtool 只能把两个样本合并成一个,这种操作要做 600 次[17]。归并本身也必然造成精度与信息损失,关键在于选择聚合方式,使数据中受关注的性质在聚合过程中得以保留[5]。
时间步长在文件创建时确定,事后无法更改,若采集间隔配置不当就会丢失信息[4][18]。rrdtool 自身不采集数据,需要外部进程收集数值再写入 RRD 文件[18]。此外,当查看的时间范围较大、程序选用低分辨率归档时,若高分辨率归档中尚未积累足够数据,低分辨率归档不会被填充,图上对应区间会显示为 NaN[19]。在归并时间窗口完整、用于归并的主数据点齐备之前,该归并点的取值是未定义的[19]。
参见
-
MRTG —— 多路由器流量绘图工具,rrdtool 的存储与绘图机制正是在它的基础上重新设计而成。
-
Cacti —— 以 rrdtool 为核心的后端,面向网络设备与服务器统计的监控与绘图前端。
-
SmokePing —— 侧重网络延迟与拥塞测量的工具,采用 rrdtool 存储和展示数据。
-
时序数据库 —— 专门存储带时间戳数据的一类数据库,rrdtool 的 RRD 文件是其早期的一种轻量实现。
-
SNMP —— 网络监控中常用的设备数据采集协议,采集到的数值常被写入 RRD 文件。
-
Holt-Winters 预测 —— rrdtool 1.1 起提供的预测功能,可在图上给出数据的预测走势。
参考资料
- 软件包:rrdtool(1.9.0-2.1 以及其他的) [引用日期2026-10-14]
- RRDTool [引用日期2026-10-14]
- rrdtool-1.8.0-19.fc41.src | RPM Info [引用日期2026-10-14]
- Nagios Support Forum [引用日期2026-10-14]
- content [引用日期2026-10-14]
- RRDtool [引用日期2026-10-14]
- The following paper was originally published in the [引用日期2026-10-14]
- RRDtool [引用日期2026-10-14]
- Network Monitoring & Management Using Cacti [引用日期2026-10-14]
- Using rrdcached with Nagios XI 2024 [引用日期2026-10-14]
- Computing in High Energy and Nuclear Physics (CHEP) 2012 [引用日期2026-10-14]
- sanog20-network-mgmt-gzkabir(PDF) [引用日期2026-10-14]
- rrdtool-1.9.0-1.fc41.src | RPM Info [引用日期2026-10-14]
- rrdgraph [引用日期2026-10-14]
- rrdtool update error (nan) [引用日期2026-10-14]
- Using RRDtool without consolidation function [引用日期2026-10-14]
- oetiker.ch 上的网页 [引用日期2026-10-14]
- content [引用日期2026-10-14]
- RRD graphs in Zenoss showing NaN on large time ranges [引用日期2026-10-14]