☰
rrdtool 1.4.7编译安装与监控图表实战指南
2026/9/26 1:14:12 网站建设 项目流程

简介:这份压缩包是 RRDTool 1.4.7 的完整发行源码,适合正在搭建 Smokeping、Cacti、MRTG 等监控平台的运维工程师,也适合想深入理解时序数据环形存储机制的开发者。包内共 314 个文件,1.29 MB;主要包含 49 个 C 源码与 22 个头文件,用于编译核心库和 rrdtool 命令行程序;另有 31 个 POD 格式的手册页、31 个 HTML 说明、30 个 TXT 文档以及 Perl 模块和 configure 构建脚本,方便离线阅读和自定义编译。已有 263 人学习下载。通过源码可了解 RRD 特有的环形数据库如何以固定大小文件滚动写入、如何通过 Heartbeat 控制采集频率,以及如何利用 rrdgraph 生成折线图、饼图等可视化结果;透过 rrdcreate、rrdgraph、rrdcached、rrdtutorial 等手册,还能掌握数据库建表、图形化输出、缓存守护进程的工作方式,并参考其与常见监控系统对接的接口。对需要二次开发或进行低版本兼容适配的读者,这套小型源码包也是很好的学习样本。

1. 折腾 rrdtool-1.4.7.tar.gz:监控图表背后的环形数据库

做网络监控的同行应该都有印象,smokeping 的延迟曲线、cacti 的流量图、mrtg 的老式日周月图,背后统一是 rrdtool 在干活。这个 rrdtool-1.4.7.tar.gz 里装的是监控绘图链路最核心的底座:一个按环形缓冲方式存储时间序列数据的数据库,和一套 rrdcreate、rrdtool update、rrdtool graph 命令行工具。1.4.7 虽然老,但稳定、依赖简单,至今仍是 smokeping 2.6.x 和 cacti 0.8.8 生产环境的常用搭配。适合需要自己编译监控后端、定制保留策略或离线部署的人。一句话:如果你只用 apt 装,确实不用折腾;但如果要在内网环境离线编译、或者让 smokeping 的 RRA 配置完全可控,自己编译一遍 1.4.7 才是最省心的路。

2. RRD 数据模型:理解环形缓冲、PDP 与 RRA 再动手

RRDtool 这个名字拆开是两件事:RRD(Round Robin Database)和 tool。它不是一个通用数据库,而是预先挖好一圈固定大小的槽位,数据写满后从头覆盖,像一个环形缓冲区。对应监控场景就是:你只关心最近一天、最近一周、最近一个月,老数据没有无限保留的必要,环形覆盖正好省空间。1.4.7 的数据文件格式非常稳定,同一份 .rrd 从编译机直接拷到另一台服务器,只要架构一致,smokeping 读起来没差别。理解这个基础,后面所有参数才不会玄学。

2.1 环形缓冲与 PDP 的关系

数据落盘的最小单位是 PDP(Primary Data Point)。每过一个 --step 周期(默认 300 秒),引擎会把这一周期内收到的 update 值归并成一个 PDP。比如你用 smokeping 每 5 分钟探一次延迟,一个 PDP 就是一次探针结果的代表。RRA(Round Robin Archive)里的点叫 CDP(Consolidated Data Point),它是对多个 PDP 聚合后的结果,比如 6 个 PDP 合成一个半小时均值。xff 参数控制容错比例:生成 CDP 时,原始 PDP 里超过多少比例是 unknown,这个 CDP 就直接记为未知。

写数据的最小单位是 PDP,读出来画图的单位是 CDP,这两个概念经常被搞混。新手容易犯的错误是以为 rows=N 就代表 N 分钟,实际上 rows 是 CDP 个数,要乘以 steps 再乘以 step 间隔,才算得出这份归档能覆盖的时间长度。比如 RRA:AVERAGE:0.5:6:288,step 300 秒,steps=6,那么一个 CDP 占 1800 秒,288 个 CDP 正好覆盖 6 天。

heartbeat 是另一个容易被忽略的参数。它表示允许相邻两次 update 的最大间隔,超过这个间隔,引擎认为数据流中断,中间的 PDP 会标记为 unknown。探针间隔是 300 秒时,heartbeat 至少给到 600 秒,否则偶尔丢一次探针,整段曲线就会出缺口。

2.2 rrdcreate 参数与保留策略设计

创建文件的命令长这样:

rrdtool create traffic.rrd \ --start now-2h --step 300 \ DS:input:COUNTER:600:0:U \ DS:output:COUNTER:600:0:U \ RRA:AVERAGE:0.5:1:288 \ RRA:AVERAGE:0.5:6:288 \ RRA:MAX:0.5:6:288

第一行 --start 用 now-2h,是给第一个 PDP 留出预热空间,同时避免从 1970 年开始占位。DS:input:COUNTER:600:0:U 定义数据源 input,类型 COUNTER,heartbeat 600 秒,最小值 0,最大值不限。COUNTER 类型专门处理网络流量这种不断递增的计数器,引擎会自动计算两次 update 之间的差值;如果你直接喂的是瞬时速率,就用 GAUGE。

RRA 行最劝退新手的其实是那个 0.5。它叫 xff,是未知数据允许比例的阈值。RRA:AVERAGE:0.5:6:288 表示 6 个 PDP 合成一个 CDP,如果这 6 个 PDP 里有超过 50% 是 unknown,这个 CDP 就是 UN;没超过,就按已有值计算。监控链路抖动时,这个参数决定你的曲线是断成锯齿还是直接透传一个洞。

至于 rows 的换算,我自己第一次部署时全靠手算,后来直接写成小脚本:

step=300; steps=12; rows=1440 echo $((rows * steps * step / 86400)) "days"

step 300、steps 12 意味着每小时一个 CDP,rows 1440 就是 1440 小时,正好 60 天。保留策略设计阶段,把这些值先算明白,比装完再回头改 RRA 省事得多。

2.3 rrdupdate、fetch 与结构校验

数据写入用 update:

rrdtool update traffic.rrd N:102455:87123

N 表示当前时间,也可以写绝对时间戳。一次更新多个 DS 时,按 create 定义的顺序给值,顺序错了数据就张冠李戴。批量回填历史数据时,用 --template 指定字段名,避免全靠记忆:

rrdtool update traffic.rrd --template input:output 1620000000:98000:76000

fetch 用来确认数据真的写进去了:

rrdtool fetch traffic.rrd AVERAGE --start -1h --end now

fetch 输出第一列是时间戳,后面是各 DS 的值,UN 表示未知。写监控脚本时,我习惯用 rrdtool info 检查文件里的 step、rows、steps、last_ds 这几个字段,确认结构跟配置一致,再交给 smokeping 或者 cacti。这一步能省掉后面大量排查时间,尤其是多台设备共用一套模板时,哪怕只有一台设备的 DS 顺序写错,图表也会静默错位。

3. 编译安装 rrdtool-1.4.7:从 tar.gz 解压到 configure 全流程

下载回来的 rrdtool-1.4.7.tar.gz 是源码包,不是编译好的成品。tar.gz 文件怎么解压就不赘述了,但解压前建议先核对一下包大小和校验和,防止传输过程中损坏。解压后进入目录,第一件事不是跑 configure,而是先检查系统里有没有画图和压缩相关的开发包,否则 configure 会在第一步就报错。

3.1 tar.gz 解压与依赖检查

sha256sum rrdtool-1.4.7.tar.gz tar -zxf rrdtool-1.4.7.tar.gz cd rrdtool-1.4.7

在 Debian / Ubuntu 系(包括银河麒麟 V10 这种基于 Ubuntu 的桌面环境)上,需要先确认这些包:

apt install -y libpng-dev zlib1g-dev libfreetype6-dev libart-2.0-dev

1.4.7 的 configure 默认找 libart 作为绘图后端,cairo 是可选的。我一般把 libart 装上,因为它跟 1.4.7 的 graph 功能配合最稳;cairo 也顺手装,后面想调 --enable-cairo 时不用回头补依赖。如果你用的是内网离线环境,把这些 deb 包先下好再离线安装,这个版本的依赖链很短,比装 smokeping 那一整套省事多了。

3.2 configure 参数按需裁剪

configure 是这套源码里最容易翻车的地方,因为 1.4.7 默认会尝试编译 tcl、python、ruby、perl 的语言绑定,任何一个对应开发环境不干净都会报错。我实际部署时一般这样裁剪:

./configure --prefix=/opt/rrdtool-1.4.7 \ --disable-tcl --disable-python --disable-ruby \ --with-libart

参数说明:

  • --prefix 指定安装目录,建议用独立目录而不是 /usr/local,方便以后切换版本。
  • --disable-tcl / --disable-python / --disable-ruby 关掉语言绑定,监控场景只用命令行工具和 C 库,绑定模块反而引入版本冲突。
  • --with-libart 明确指定绘图后端,避免 configure 在 libart 和 cairo 之间摇摆。

configure 结束时如果看到类似 "rrdtool is now configured, run make to build" 的输出,说明依赖检查过了。如果卡在某个 "checking for ..." 上,把报错那行的库名拿去 apt search,缺哪个装哪个。我遇到最典型的错误是 "configure: error: Please set PYTHON to point to a valid python binary",其实就是没装 python-dev,或者系统 python 版本太新,加上 --disable-python 就能跳过。

提示:configure 报错时,不要反复重跑碰运气。先看 config.log 最后 30 行,缺库就装库,缺头文件就装 -dev 包。这样处理过一次之后,后面基本一路通畅。

3.3 make 安装与冒烟验证

依赖齐了,编译就是机械操作:

make -j4 make install

make -j4 用 4 进程并行编译,编译机内存小于 1G 时老老实实去掉 -j4,1.4.7 单进程编译也就吃两三百 MB。安装完成后,验证三步走:

/opt/rrdtool-1.4.7/bin/rrdtool --version /opt/rrdtool-1.4.7/bin/rrdtool --help | head -30 echo "export PATH=/opt/rrdtool-1.4.7/bin:\$PATH" >> /etc/profile.d/rrdtool.sh echo "export LD_LIBRARY_PATH=/opt/rrdtool-1.4.7/lib:\$LD_LIBRARY_PATH" >> /etc/profile.d/rrdtool.sh

LD_LIBRARY_PATH 很多人会漏。rrdtool 的命令行工具安装时会往 /opt/rrdtool-1.4.7/lib 放共享库,不加这个变量,运行时动不动就报 "error while loading shared libraries: librrd.so.4"。验证通过后,再建一个最小 rrd 文件测一下读写,能 create、update、fetch 完整走一圈,再接入 smokeping 或 cacti。

rrdtool create test.rrd --start now-60 --step 300 DS:t:GAUGE:600:0:U RRA:AVERAGE:0.5:1:288 rrdtool update test.rrd N:42 rrdtool fetch test.rrd AVERAGE --start -10min --end now

三条命令都正常返回,说明引擎本身没问题,接下来接监控链路才不会一脸懵。

4. 对接 smokeping 与 cacti:把 rrdtool 1.4.7 塞进监控链路

rrdtool 装好只是有了引擎,真正干活要接进 smokeping、cacti 或者 mrtg 的链路。三条链路对 rrdtool 的调用方式完全不同,这也是很多人装好之后不知道下一步干什么的原因。

4.1 smokeping 的 rrdtool 路径与 RRA 配置

smokeping 2.6.x 是 rrdtool 1.4.7 最常见的搭档。smokeping 自己不会画图,它只是定期跑 fping 探针,把延迟数据通过 rrdtool update 写进 rrd 文件,然后在 web 请求时调用 rrdtool graph 生成图片。所以 smokeping 的配置里必须明确告诉它 rrdtool 在哪里。

/etc/smokeping/config.d/General 里的关键行:

*** General *** owner = monitor contact = admin@example.com imgcache = /var/www/smokeping/cache imgurl = cache datadir = /var/www/smokeping/data piddir = /var/run/smokeping rrdtool = /opt/rrdtool-1.4.7/bin/rrdtool

rrdtool 这一行必须填绝对路径,不能光写 rrdtool 三个字让它去 PATH 里找。smokeping 进程由 web 服务器启动时,环境变量 PATH 往往被精简过,绝对路径是唯一保险的写法。imgcache 和 datadir 归属用户要对,否则 smokeping 写不进缓存,网页上全是红叉。

Targets 配置里,每个 host 会自动继承 General 里的 RRA 定义。smokeping 默认的 RRA 是 5 分钟一个点,我在内网监控一般会追加一行小时均值归档,方便看超过一周的趋势:

*** RRD *** step = 300 rra = RRA:AVERAGE:0.5:1:288 rra = RRA:AVERAGE:0.5:6:288 rra = RRA:AVERAGE:0.5:24:360 rra = RRA:MAX:0.5:6:288

最后一行 24 个 PDP 合成一个点,每小时一个 CDP,360 个覆盖 15 天,正好对应 smokeping 页面上个月的粒度。

4.2 cacti 对接:版本匹配比路径更重要

cacti 对 rrdtool 的依赖更直接,主机负载、接口流量全部走 rrdtool graph。路径配置在 cacti 管理界面的 Settings → Paths → RRDTool Utility Path,填:

/opt/rrdtool-1.4.7/bin/rrdtool

但真正要命的是版本匹配。cacti 0.8.8 系列对 rrdtool 1.4.x 支持得非常好,而 cacti 1.2.x 官方要求 rrdtool 1.7 以上,强行用 1.4.7 会出现「图能生成但全空白,日志里刷 invalid DS」的情况。如果公司内网统一用的是 cacti 0.8.8,那 1.4.7 是合适选择;如果已经升级到 1.2.x,就别在 1.4.7 上耗时间。

cacti 版本建议 rrdtool 版本备注
0.8.8e 及以下1.4.x / 1.5.x稳定,经典组合
1.0.x1.5.x / 1.6.x部分新模板不兼容 1.4
1.2.x1.7.x / 1.8.x1.4.7 不建议使用

cacti 的模板钩子会读取 rrdtool 的 --version 输出并做能力判断,版本太旧,新模板直接不给用。所以给 cacti 接 rrdtool 时,先确认 cacti 版本再决定编不编译 1.4.7。

4.3 把 mrtg 历史日志转存进 rrd

mrtg 本身不依赖 rrdtool,它靠 rateup 出图。但 mrtg 的日志是纯文本,数据粒度只有 5 分钟,又没有环形归档的概念,日志会无限长大。很多老监控机上同时还躺着几年的 mrtg 日志,转成 rrd 是常见的归档需求。

mrtg 日志格式固定,第一行是当前时间戳,之后每行四列:时间、入流量速率、出流量速率、最大入流量。用 awk 把后三列拼成 rrd update 的输入:

awk 'NR>1 {cmd="rrdtool update mrtg.rrd "$1":"$2":"$3; system(cmd)}' mrtg.log

跑完后,再用 rrdtool fetch 抽查几个时间点,确认数值量纲没有对错。mrtg 的速率单位是 bytes/s 的派生单位,而你在 rrd 里建 DS 时如果用 GAUGE,写进去的就是原值;如果用 COUNTER,写入后引擎还会再做一次差分。同一批数据两种 DS 类型画出来完全不一样,转之前先想清楚。

5. 避坑指南:编译报错、时区偏移、绘图乱码与版本陷阱

rrdtool 这套东西资料不少,但坑都藏在细节里。这里列五条我实际踩过的,每条按现象、原因、解决的顺序说。

5.1 configure 报错找不到 libpng / libart

现象:./configure 执行到一半,输出 "configure: error: Can not find libpng" 或者 "libart is required"。原因:系统里没有安装对应的 -dev 开发包,rrdtool 需要头文件而不是运行库。解决:Debian 系执行 apt install libpng-dev libart-2.0-dev,Red Hat 系对应的是 libpng-devel libart_lgpl-devel,装完重新 configure 即可。注意装完要先跑 ldconfig,否则有时能找到头文件但链接不到动态库。

5.2 画图中文乱码或豆腐块

现象:rrdtool graph 生成的 PNG 里,中文标题显示为一排方块。原因:rrdtool 默认字体路径指向系统英文字体,中文字形缺失。解决:graph 命令里显式指定中文字体,例如 wqy-zenhei:

rrdtool graph day.png \ --font DEFAULT:/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc \ --title "中文标题" \ DEF:in=traffic.rrd:input:AVERAGE \ LINE1:in#00cc00:in

如果没有 wqy,先装 fonts-wqy-zenhei 再指定路径。这个问题在内网麒麟 V10 上尤其常见,系统自带字体集被裁剪过,务必检查字体路径是否存在。

5.3 rrd 文件时间整体偏移 8 小时

现象:图上的横轴时间比实际时间早或晚 8 小时,怎么看怎么别扭。原因:rrdtool 的时间参数接受本地时间字符串或时间戳,你在 create 时写了 --start 2025-01-01 00:00:00,引擎按当地时间解析,但存储和图表输出默认按 UTC,偏移就出来了。解决:create 和 graph 的时间全部用时间戳,或 date -u 生成的 UTC 时间,最省事的是直接写 N。规范做法是:

rrdtool create traffic.rrd --start=$(date -u -d '2 hours ago' +%s) --step 300

从那以后我建 rrd 文件一律用 date -u,再没见过时间偏移问题。

5.4 smokeping 启动报 rrdtool not found

现象:smokeping 服务起来后马上退出,日志里一行 "rrdtool not found" 或 "RRDtool is not executable"。原因:General 配置里的 rrdtool 字段没填,或者填了相对路径,smokeping 的 CGI 进程 PATH 环境不完整。解决:在 /etc/smokeping/config.d/General 里写死绝对路径 /opt/rrdtool-1.4.7/bin/rrdtool,然后重启 smokeping 服务,再看日志。排查时直接运行 smokeping --config=/etc/smokeping/config 手动拉起,可以看到最原始的错误输出,systemd 日志里往往只有截断后的报错。

5.5 cacti 图形空白但数据正常

现象:cacti 的图能显示坐标轴,数据区全空白,rra 目录下的 .rrd 文件在增长。原因:最常见是 cacti 与 rrdtool 版本不匹配,或 rrdtool graph 的绘图后端没选对。解决:先看 cacti 版本,0.8.8e 配 1.4.7 基本不会出这种问题;1.2.x 就别用 1.4.7。再手动跑一遍 cacti 生成的 rrdtool graph 命令,如果报 "unknown argument" 之类的错,就是版本问题。手动跑命令这个习惯帮我定位过不少 cacti 的隐性故障,比在界面里翻日志快得多。

6. 进阶:rrdtool graph 绘图参数与监控数据自动归档

rrdtool graph 不只是出图工具,它是整个监控系统里最值得定制的一环。graph 命令的核心是 DEF、CDEF、VDEF 三个关键字:DEF 从 rrd 文件里取数,CDEF 做 RPN 表达式运算,VDEF 计算最大值、平均值这类聚合值。

我常用的一组参数长这样:

rrdtool graph week.png \ --start end-7d --end now --step 900 \ --title "eth0 周流量趋势" \ --vertical-label "bit/s" \ --font DEFAULT:/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc \ DEF:in=traffic.rrd:input:AVERAGE \ DEF:out=traffic.rrd:output:AVERAGE \ CDEF:in_bits=in,8,* \ CDEF:out_bits=out,8,* \ AREA:in_bits#00cc00:入流量 \ LINE1:out_bits#0000ff:出流量 \ VDEF:maxin=in_bits,MAXIMUM \ GPRINT:maxin:"最大入流量: %6.2lf %sbit/s"

CDEF 里的 ,8,* 是 RPN 后缀表达式,意思是把 in 乘以 8,把 bytes 换算成 bit。GPRINT 会把 VDEF 算出来的最大值直接印在图上,生成日报时不用再单独算一轮。这些都是 1.4.7 完整支持的,老版本反而简单直接。

批量归档的场景,我一般写一个 shell 循环,把多台设备、多个 DS 统一出图:

for dev in eth0 eth1 eth2; do rrdtool graph /var/www/mon/${dev}-week.png \ --start end-7d --end now \ --title "${dev} weekly" \ --font DEFAULT:/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc \ DEF:in=traffic-${dev}.rrd:input:AVERAGE \ LINE1:in#00cc00:${dev} in done

循环里每次 graph 都会读一遍 rrd 文件,设备多的时候 I/O 会上去,建议在 crontab 里错峰执行,不要整点全部一起跑。这个脚本再配合 rrdtool fetch 导出的 CSV,就能把月报数据一并归档。

说实话,rrdtool 1.4.7 的文档和社区资料虽然老,但恰恰是老版本才有一整套被验证过的生产配置。我自己每次编译完,都会强制走一遍 rrdtool info 加 rrdtool graph 的冒烟验证,确认时间偏移、字体、绘图后端全部正常,再交给 smokeping 或 cacti 使用。这个习惯帮我挡掉过至少三次时区导致的返工。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询