这是 rrdtutorial 命令,可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器
程序:
您的姓名
rrdtutorial - Alex van den Bogaerdt 的 RRDtool 教程
商品描述
RRDtool 由 Tobias Oetiker 编写[电子邮件保护]> 有很多人的贡献
世界各地。 本文档由 Alex van den Bogaerdt 撰写
<[电子邮件保护]> 帮助您了解什么是 RRDtool 以及它可以做什么
你。
RRDtool 提供的文档对于某些人来说可能过于技术化。 这个
本教程旨在帮助您了解 RRDtool 的基础知识。 它应该让你做好准备
自己阅读文档。 它还解释了有关统计的一般内容
专注于网络。
在线课程
重要
请不要跳过本文档! 本文档的第一部分解释了
基础知识,可能很无聊。 但是,如果您不了解基础知识,示例将不会
对你有意义。
有时事情会发生变化。 此示例用于提供诸如“0.04”之类的数字而不是
“4.00000e-02”。 这些实际上是相同的数字,只是写法不同。 别
如果 rrdtool 的未来版本显示略有不同的输出形式,请注意。
本文档中的示例适用于 RRDtool 1.2.0 版。
此外,有时确实会出现错误。 它们也可能影响示例的结果。
示例 speed4.png 受此困扰(在 if-
说法有误)。 正常数据就好了(rrdtool 中的错误不会持续很长时间)
但是像 NaN、INF 等特殊情况可能会持续更长时间。 尝试另一个版本,如果
你可以,或者只是忍受它。
我修复了 speed4.png 示例(并添加了注释)。 可能还有其他例子
遭受相同或类似的错误。 尝试自己修复它,这很棒
锻炼。 但请不要提交您的结果作为对本文档来源的修复。
在用户列表上讨论它,或者写信给我。
什么是 is RRD工具?
RRDtool 指的是循环数据库工具。 循环是一种与
固定数量的数据,以及指向当前元素的指针。 想一个圈子
点绘制在边缘。 这些点是可以存储数据的地方。 画一个
从圆心到圆点之一的箭头; 这是指针。 当。。。的时候
当前数据被读取或写入,指针移动到下一个元素。 当我们在
圈子没有开始也没有结束,你可以一直走下去,一直走下去。 之后
同时,所有可用的地方都将被使用,并且该过程会自动重用旧的
地点。 这样,数据集的大小就不会增长,因此不需要
维护。 RRDtool 与循环数据库 (RRD) 一起使用。 它存储和检索
来自他们的数据。
什么是 data 能够 be 放 成 an RRD?
你说出它的名字,只要它是某种时间序列数据,它就可能适合。 这个
意味着您必须能够在多个时间点测量某些值并提供此值
RRDtool 的信息。 如果您能做到这一点,RRDtool 将能够存储它。 价值
必须是数字,但不必是整数,就像 MRTG(下一个
部分将提供有关此更专业应用程序的更多详细信息)。
下面的许多例子都讨论了 SNMP,它是简单网络管理的首字母缩写词
协议。 “简单”是指协议。 这并不意味着它易于管理或
监控网络。 完成本文档后,您应该了解足够的知识
能够理解人们在谈论什么。 现在,只要意识到 SNMP 可以
用于查询设备的计数器值。 这是来自那些的价值
我们想要存储在 RRD 中的计数器。
什么是 能够 I do - Free Introduction 工具?
RRDtool 起源于 MRTG (Multi Router Traffic Grapher)。 MRTG 开始时很小
用于绘制大学与 Internet 连接的使用情况的脚本。 MRTG是后来
(ab-) 用作绘制其他数据源的工具,包括温度、速度、电压、
打印件数等。
您很可能会开始使用 RRDtool 来存储和处理通过 SNMP 收集的数据。
数据很可能是从网络或网络传输的字节(或位)
计算机。 但它也可以用来显示潮汐波、太阳辐射、功率
消费量、展览的参观人数、机场附近的噪音水平、
您最喜欢的度假地点的温度、冰箱中的温度以及您喜欢的任何温度
想象力可以想出来。
您只需要一个传感器来测量数据并能够将数字输入 RRDtool。
RRDtool 然后让您创建一个数据库,在其中存储数据,检索该数据并创建
PNG 格式的图形,用于在 Web 浏览器上显示。 这些 PNG 图像依赖于
您收集的数据可以是,例如,平均网络使用情况的概述,
或出现的峰值。
什么是 if I 仍然 它们在许多情况下都能提供类似的结果。 问题 after 阅读 Free Introduction 文档?
首先:再读一遍! 你可能错过了一些东西。 如果无法编译
来源和你有一个相当普遍的操作系统,这可能不是 RRDtool 的错。
Internet 上可能有预编译版本。 如果他们来自可信赖的
来源,得到其中之一。
另一方面,如果程序有效但没有给你预期的结果,它会
配置有问题。 检查您的配置并将其与
下面的例子。
有一个邮件列表和它的存档。 阅读列表几周并搜索
档案。 只问一个问题而不搜索档案被认为是粗鲁的:你的
问题可能已经为其他人解决了! 这对大多数人来说都是正确的,如果不是的话
所有,邮件列表,而不仅仅是这个特定的。 在文档中查看
附带 RRDtool 用于列表的位置和用法。
我建议您现在花点时间通过发送电子邮件订阅邮件列表
到[电子邮件保护]> 主题为“订阅”。 如果你想
离开这个列表,只需写一封电子邮件到相同的地址,但现在的主题是
“取消订阅”。
创新中心 将 帮助 我?
通过给你一些详细的描述和详细的例子。 我假设以下
显示的顺序中的说明将使您对 RRDtool 有足够的了解
自己实验。 如果第一次不起作用,请不要放弃。 重读
你确实理解的东西,你可能错过了一些东西。
通过遵循示例,您可以获得一些实践经验,更重要的是,您可以获得一些
它是如何工作的背景信息。
您需要了解有关十六进制数的知识。 如果没有,请从
在继续之前阅读 bin_dec_hex。
您的 第一 圆形 知更鸟 数据库
在我看来,学习某些东西的最好方法就是实际去做。 为什么不正确开始
现在? 我们将创建一个数据库,在其中放入一些值并再次提取这些数据。 您的
输出应与本文档中包含的输出相同。
我们将从一些简单的东西开始,比较汽车和路由器,或者比较公里
(英里,如果你愿意)与位和字节。 都是一样的:一段时间内的某个数字。
假设我们有一个设备可以将字节传输到 Internet 和从 Internet 传输字节。 该设备保持
一个计数器在打开时从零开始,随着每个字节的增加而增加
转入。 这个计数器可能有一个最大值。 如果达到这个值并且
计算一个额外的字节,计数器从零开始。 这和很多一样
世界上的计数器,例如汽车中的里程计数器。
大多数关于网络的讨论都讨论每秒比特数,所以让我们习惯这一点
马上。 假设一个字节是八位,并开始以位而不是字节来思考。 柜台,
但是,仍然计算字节! 在 SNMP 世界中,大多数计数器都是 32 位的。 那
表示它们从 0 到 4294967295 计数。我们将在示例中使用这些值。
当被询问时,设备返回计数器的当前值。 我们知道时间
自从我们上次询问以来已经过去了,所以我们现在知道传输了多少字节***
平均***每秒。 这不是很难计算。 首先是文字,然后是
计算:
1. 取当前计数器,从中减去先前的值。
2. 对当前时间和前一时间(以秒为单位)执行相同操作。
3. 将(1)的结果除以(2)的结果,结果是每个字节的数量
第二。 乘以 XNUMX 得到每秒位数 (bps)。
bps = (当前计数器 - 之前计数器) / (现在时间 - 之前时间) * 8
对于某些人来说,将其转化为汽车示例可能会有所帮助。 不要尝试这个
例如,如果你这样做了,不要因为结果而责怪我!
不习惯以公里/小时来思考的人可以将大部分转化为英里/小时
小时用公里除以 1.6(足够接近)。 我将使用以下缩写:
米:米
km:公里(= 1000 米)。
h:小时
s:第二
km/h:公里/小时
m/s:米每秒
你在开车。 在 12:05,您阅读仪表板上的计数器,它告诉您
直到那一刻,汽车已经行驶了 12345 公里。 在 12:10 你再看,它写着
12357 公里。 这意味着您在五分钟内行驶了 12 公里。 一位科学家会翻译
以米每秒为单位,这很好地比较了(字节
每五分钟)与(每秒位数)。
我们走了12公里,也就是12000米。 我们在 300 分钟或 XNUMX 分钟内完成了
秒。 我们的速度是 12000m/300s 或 40m/s。
我们还可以以公里/小时为单位计算速度:12 乘以 5 分钟是一个小时,所以我们必须
12 公里乘以 12 得到 144 公里/小时。 对于我们母语为英语的朋友:那是 90
mph 所以不要在家里或我住的地方尝试这个例子:)
请记住:这些数字只是平均值。 没有办法从
数字,如果您以恒定速度行驶。 本教程后面有一个示例
这解释了这一点。
我希望你明白计算 m/s 或 bps 没有区别; 只有这样
我们收集的数据是不同的。 甚至kilo中的k也与网络术语相同
k 也表示 1000。
我们现在将创建一个数据库,我们可以在其中保存所有这些有趣的数字。 方法
用于启动程序的操作系统可能略有不同,但我假设您可以计算出
如果它在你的工作方式不同,它就会出来。 确保您没有覆盖您的任何文件
系统执行以下命令时,将整行输入为一个长行(我
必须将其拆分以提高可读性)并跳过所有 '\' 字符。
rrdtool 创建 test.rrd \
--开始 920804400 \
DS:速度:计数器:600:U:U \
RRA:平均:0.5:1:24 \
RRA:平均:0.5:6:10
(所以输入:“rrdtool create test.rrd --start 920804400 DS ...”)
什么是 具有 很 创建?
我们创建了名为 test (test.rrd) 的循环数据库,它从我当天中午开始
7 年 1999 月 920804400 日开始编写此文档(此日期转换为 XNUMX
秒,如下所述)。 我们的数据库包含一个名为“speed”的数据源 (DS)
代表一个计数器。 此计数器每五分钟读取一次(这是默认值
因此您不必输入“--step=300”)。 在同一个数据库中两次循环
存档 (RRA) 被保留,每次读取数据时都会对其进行平均(例如,有
没有什么可平均的)并保留 24 个样本(24 次 5 分钟是 2 小时)。 另一个
平均 6 个值(半小时)并包含 10 个这样的平均值(例如 5 小时)。
RRDtool 使用来自 UNIX 世界的特殊时间戳。 这个时间戳是
自 UTC 1 年 1970 月 XNUMX 日以来经过的秒数。 时间戳值为
转换为当地时间,因此在不同的时区看起来会有所不同。
很有可能你和我不在世界的同一个地方。 这意味着你的时间
区不一样。 在我谈论时间的所有例子中,小时数可能是错误的
你。 这对示例的结果几乎没有影响,只需更正小时数即可
读。 例如:我会看到“12:05”,英国人会看到“11:05”。
我们现在必须用一些数字填充我们的数据库。 我们会假装读过
以下数字:
12:05 12345 公里
12:10 12357 公里
12:15 12363 公里
12:20 12363 公里
12:25 12363 公里
12:30 12373 公里
12:35 12383 公里
12:40 12393 公里
12:45 12399 公里
12:50 12405 公里
12:55 12411 公里
13:00 12415 公里
13:05 12420 公里
13:10 12422 公里
13:15 12423 公里
我们填充数据库如下:
rrdtool 更新 test.rrd 920804700:12345 920805000:12357 920805300:12363
rrdtool 更新 test.rrd 920805600:12363 920805900:12363 920806200:12373
rrdtool 更新 test.rrd 920806500:12383 920806800:12393 920807100:12399
rrdtool 更新 test.rrd 920807400:12405 920807700:12411 920808000:12415
rrdtool 更新 test.rrd 920808300:12420 920808600:12422 920808900:12423
内容如下:使用以下数字更新我们的测试数据库
时间 920804700,值 12345
时间 920805000,值 12357
等。
如您所见,可以一次将多个值输入数据库
命令。 为了可读性,我不得不停在三点,但每行的真正最大值是操作系统
依赖。
我们现在可以使用“rrdtool fetch”从我们的数据库中检索数据:
rrdtool fetch test.rrd 平均值 --start 920804400 --end 920809200
它应该返回以下输出:
速度
920804700:南
920805000:4.0000000000e-02
920805300:2.0000000000e-02
920805600:0.0000000000e+00
920805900:0.0000000000e+00
920806200:3.3333333333e-02
920806500:3.3333333333e-02
920806800:3.3333333333e-02
920807100:2.0000000000e-02
920807400:2.0000000000e-02
920807700:2.0000000000e-02
920808000:1.3333333333e-02
920808300:1.6666666667e-02
920808600:6.6666666667e-03
920808900:3.3333333333e-03
920809200:南
920809500:南
请注意,您可能会获得比预期更多的行。 这样做的原因是你要求
以 920809200 结束的时间范围。 920809200 后面的数字:在
上面的列表涵盖了从 920808900 到 920809200 的时间范围,不包括 920809200。因此
保险起见,您会收到从 920809200 到 920809500 的条目,因为它
包括 920809200。您可能还会看到“NaN”而不是“nan”,这取决于操作系统。 “南”
代表“非数字”。 如果您的操作系统写“U”或“UNKN”或类似的东西
好的。 如果其他地方出了问题,那可能是由于您犯的错误(假设
我的教程当然是正确的:-)。 在这种情况下:删除数据库并尝试
一次。
上面输出的含义将在下面变得清晰。
时间 至 创建信息图 一些 图像
尝试以下命令:
rrdtool 图形速度.png \
--开始 920804400 --结束 920808000 \
DEF:myspeed=test.rrd:速度:平均 \
LINE2:我的速度#FF0000
这将创建从 12:00 开始到 13:00 结束的 speed.png。 有一个定义
一个名为 myspeed 的变量,使用来自数据库“test.rrd”的 RRA“speed”数据。
绘制的线高 2 个像素,代表变量 myspeed。 颜色是红色
(由其 rgb 表示指定,见下文)。
您会注意到图表的开始不是在 12:00,而是在 12:05。 这是因为
我们没有足够的数据来判断在那之前的平均值。 这只会发生在
你错过了一些样本,希望这种情况不会发生很多。
如果这有效:恭喜! 如果没有,请检查哪里出了问题。
颜色由红色、绿色和蓝色构成。 对于每个组件,您指定
在十六进制中使用多少,其中 00 表示不包括在内,FF 表示完全包括在内。
“颜色”白色是红色、绿色和蓝色的混合物:FFFFFF “颜色”黑色是所有
关闭颜色:000000
红色#FF0000
绿色 #00FF00
蓝色 #0000FF
洋红色 #FF00FF(红蓝混合)
灰色 #555555(所有组件的三分之一)
此外,您可以(使用最近的 RRDtool)添加 alpha 通道(透明度)。 这
默认为“FF”,表示不透明。
您刚刚创建的 PNG 可以使用您最喜欢的图像查看器显示。 网络浏览器
将通过 URL "file:///the/path/to/speed.png" 显示 PNG
图像 - 一些 数学
查看图像时,您会注意到水平轴标记为 12:10、12:20、
12:30、12:40 和 12:50。 有时标签不适合(可能是 12:00 和 13:00
候选人)所以他们被跳过。
纵轴显示我们输入的范围。 我们提供公里,当分开时
到 300 秒,我们得到的数字非常小。 准确地说,第一个值是 12
(12357-12345) 除以 300 得到 0.04,由 RRDtool 显示为“40 m”
意思是“40/1000”。 “m”(毫)与米(也是米)、公里或
毫米! RRDtool 不知道我们数据的物理单位,它只是与
无量纲数。
如果我们以米为单位测量我们的距离,这将是 (12357000-12345000)/300 =
12000 / 300 = 40。
由于大多数人对这个范围内的数字有更好的感觉,我们将对此进行更正。 我们可以
重新创建我们的数据库并存储正确的数据,但有一个更好的方法:我们做一些
在创建 png 文件时进行计算!
rrdtool 图 speed2.png \
--开始 920804400 --结束 920808000 \
--垂直标签 m/s \
DEF:myspeed=test.rrd:速度:平均 \
CDEF:realspeed=myspeed,1000,\*\
LINE2:实际速度#FF0000
注意:我需要用反斜杠转义乘法运算符 *。 如果我不这样做,
操作系统可能会解释它并将其用于文件名扩展。 你也可以放置
引号内的行,如下所示:
"CDEF:realspeed=myspeed,1000,*" \
归结为:它是 RRDtool 应该看到 *,而不是你的 shell。 这是你的外壳
解释\,而不是RRDtool。 如果您碰巧遇到以下情况,您可能需要相应地调整示例
使用行为不同的操作系统或外壳。
查看此 PNG 后,您会注意到“m”(毫)消失了。 这是什么
正确的结果是。 此外,还为图像添加了标签。 除了东西
上面提到过,PNG 应该看起来一样。
计算在上面的 CDEF 部分中指定,并采用反向波兰表示法
(“RPN”)。 我们要求 RRDtool 做的是:“将数据源 myspeed 和 number
1000; 将它们相乘”。先不要理会 RPN,稍后会详细解释
细节。 另外,您可能想阅读我的 CDEF 教程和 Steve Rader 的 RPN 教程。
但首先完成本教程。
不挂断! 如果我们可以将值乘以 1000,应该也可以显示
公里每小时来自相同的数据!
要更改以米/秒为单位测量的值:
计算每小时米数:值 * 3600
计算每小时公里数:值/1000
这使得:价值 * (3600/1000) 或价值 * 3.6
在我们的示例数据库中,我们犯了一个错误,我们需要通过以下方式对此进行补偿
乘以 1000。应用该校正:
值 * 3.6 * 1000 == 值 * 3600
现在让我们创建这个 PNG,并添加一些更多的魔法......
rrdtool 图 speed3.png \
--开始 920804400 --结束 920808000 \
--垂直标签公里/小时\
DEF:myspeed=test.rrd:速度:平均 \
"CDEF:kmh=myspeed,3600,*" \
CDEF:快=kmh,100,GT,kmh,0,IF \
CDEF:好=kmh,100,GT,0,kmh,IF \
HRULE:100#0000FF:"允许的最大值" \
AREA:good#00FF00:“速度不错”\
AREA:fast#FF0000:"太快了"
注意:这里我们使用另一种方法来转义 * 运算符,将整个字符串包含在
双引号。
这个图看起来好多了。 速度以公里/小时显示,甚至还有一条额外的线
最大允许速度(在我行驶的道路上)。 我也改变了以前的颜色
显示速度并将其从一条线变为一个区域。
现在的计算更加复杂。 对于限速内的速度测量,他们
是:
检查 kmh 是否大于 100 ( kmh,100 ) GT
如果是,则返回 0,否则 kmh ((( kmh,100 ) GT ), 0, kmh) IF
对于高于速度限制的值:
检查 kmh 是否大于 100 ( kmh,100 ) GT
如果是,则返回 kmh,否则返回 0 ((( kmh,100) GT ), kmh, 0) IF
图像 魔术
我喜欢相信 RRDtool 图如何操作数据几乎没有限制。
我不会解释它是如何工作的,而是看看下面的 PNG:
rrdtool 图 speed4.png \
--开始 920804400 --结束 920808000 \
--垂直标签公里/小时\
DEF:myspeed=test.rrd:速度:平均 \
CDEF:nonans=myspeed,UN,0,myspeed,IF \
CDEF:kmh=nonans,3600,* \
CDEF:快=kmh,100,GT,100,0,IF \
CDEF:超过=kmh,100,GT,kmh,100,-,0,IF \
CDEF:好=kmh,100,GT,0,kmh,IF \
HRULE:100#0000FF:"允许的最大值" \
AREA:good#00FF00:“速度不错”\
AREA:fast#550000:"太快了" \
堆栈:over#FF0000:“超速”
还记得开头的注释吗? 我不得不从这个例子中删除未知数据。 这
'nonans' CDEF 是新的,第 6 行(曾经是第 5 行)用于读取
'CDEF:kmh=myspeed,3600,*'
让我们创建一个快速而肮脏的 HTML 页面来查看三个 PNG:
速度
将文件命名为“speed.html”或类似名称,然后在您的 Web 浏览器中查看它。
现在,您所要做的就是定期测量值并更新数据库。 当你
想要查看数据,重新创建 PNG,并确保在浏览器中刷新它们。
(注意:仅仅点击重新加载可能还不够,尤其是当涉及到代理时。尝试
shift-reload 或 ctrl-F5)。
最新动态 in 现实
我们已经使用过“更新”命令:它采用了一个或多个形式的参数
” : "。您会很高兴知道您可以通过填写来指定当前时间
以“N”为时间。 或者你可以使用 Perl 中的“时间”函数(最短的例子
在本教程中):
perl -e '打印时间, "\n" '
如何定期运行程序取决于操作系统。 但这里有一个伪示例
码:
- 获取值并将其放入变量“$speed”
- rrdtool 更新速度.rrd N:$speed
(不要用我们的测试数据库尝试这个,我们将在进一步的例子中使用它)
这就是全部。 每五分钟运行一次上述脚本。 当您需要知道什么
图形看起来像,运行上面的例子。 您也可以将它们放在脚本中。 后
运行该脚本,查看我们上面创建的页面 index.html。
有 话 on SNMP
我可以想象很少有人能够每五年从他们的汽车中获取真实数据
分钟。 所有其他人将不得不接受其他类型的柜台。 你可以
测量打印机打印的页数,例如,由
咖啡机,一种计算所用电量的设备,等等。 任何递增
可以使用你目前学到的东西来监控和绘制计数器。 稍后我们将
还能够监控其他类型的值,如温度。
许多对 RRDtool 感兴趣的人会使用跟踪八位字节(字节)的计数器
由网络设备传输。 所以让我们接下来就这样做。 我们将从一个
描述如何收集数据。
有些人会说有工具可以做这个数据收集
你。 他们是对的! 然而,我觉得重要的是你明白它们不是
必要的。 当您必须确定事情出错的原因时,您需要知道它们是如何出错的
工作。
示例中使用的一个工具在本文开头已经非常简要地讨论过
文件,它被称为 SNMP。 这是一种与联网设备交谈的方式。 我使用的工具
下面称为“snmpget”,这是它的工作原理:
snmpget 设备密码 OID
or
snmpget -v[version] -c[password] 设备 OID
对于设备,您可以替换设备的名称或 IP 地址。 对于密码你
使用“社区读取字符串”,因为它在 SNMP 世界中被称为。 对于某些设备,
“public”的默认值可能有效,但是可以禁用、更改或保护
隐私和安全原因。 阅读设备随附的文档或
程序。
然后就是这个参数,叫做OID,意思是“对象标识符”。
当您开始学习 SNMP 时,它看起来非常混乱。 没那么难
当您查看管理信息库(“MIB”)时。 这是一棵倒挂的树
描述数据,以单个节点为根,从那里有许多分支。 这些
分支在另一个节点结束,它们分支出来,等等。所有的分支都有一个名字和
它们构成了我们一路走下去的道路。 我们遵循的分支是
命名:iso、org、dod、internet、mgmt 和 mib-2。 这些名字也可以写成
数字和是 1 3 6 1 2 1。
iso.org.dod.internet.mgmt.mib-2 (1.3.6.1.2.1)
关于某些程序使用的前导点存在很多混淆。 有*没有*
OID 中的前导点。 但是,有些程序可以使用 OID 的上述部分作为
默认。 为了表明缩写 OID 和完整 OID 之间的区别,他们需要一个
指定完整 OID 时的前导点。 通常这些程序会遗漏
将数据返回给您时的默认部分。 更糟糕的是,他们有几个
默认前缀...
好的,让我们继续开始我们的 OID:我们有 1.3.6.1.2.1 从那里,我们是
对编号为 2 的分支“接口”特别感兴趣(例如,1.3.6.1.2.1.2
或 1.3.6.1.2.1.interfaces)。
首先,我们必须得到一些 SNMP 程序。 先看看有没有预编译包
可用于您的操作系统。 这是首选方式。 如果没有,您将必须获得
自己获取资源并编译它们。 互联网上充满了资源、程序等。查找
使用搜索引擎或您喜欢的任何方式获取信息。
假设你得到了程序。 首先尝试收集一些在大多数情况下可用的数据
系统。 请记住:我们最感兴趣的树部分有一个简称
在我们生活的世界里!
我将举一个可以在 Fedora Core 3 上使用的例子。如果它不适合你,
通过 snmp 手册按照自己的方式工作,并调整示例以使其工作。
snmpget -v2c -c 公共 myrouter system.sysDescr.0
设备应该用它自己的描述来回答,也许是一个空的描述。 直到你得到
来自设备的有效答案,可能使用不同的“密码”,或不同的设备,
继续下去是没有意义的。
snmpget -v2c -c 公共 myrouter 接口.ifNumber.0
希望您得到一个数字,即接口的数量。 如果是这样,你可以继续
并尝试一个名为“snmpwalk”的不同程序。
snmpwalk -v2c -c 公共 myrouter 接口.ifTable.ifEntry.ifDescr
如果它返回一个接口列表,你就快到了。 下面是一个例子:
[用户@主机/home/alex]$ snmpwalk -v2c -c 公共 cisco 2.2.1.2
interface.ifTable.ifEntry.ifDescr.1 = "BRI0: B-Channel 1"
interface.ifTable.ifEntry.ifDescr.2 = "BRI0: B-Channel 2"
interfaces.ifTable.ifEntry.ifDescr.3 = "BRI0" 十六进制:42 52 49 30
interface.ifTable.ifEntry.ifDescr.4 = "Ethernet0"
interfaces.ifTable.ifEntry.ifDescr.5 = "Loopback0"
在这台 cisco 设备上,我想监视“Ethernet0”接口并从
上面的输出我看到它是第四个。 我尝试:
[user@host /home/alex]$ snmpget -v2c -c 公共思科 2.2.1.10.4 2.2.1.16.4
interface.ifTable.ifEntry.ifInOctets.4 = 2290729126
interface.ifTable.ifEntry.ifOutOctets.4 = 1256486519
所以现在我有两个 OID 需要监控,它们是(这次是完整的):
1.3.6.1.2.1.2.2.1.10
和
1.3.6.1.2.1.2.2.1.16
两者的接口编号均为 4。
不要被愚弄,这不是我第一次尝试。 我也花了一些时间才明白
所有这些数字是什么意思。 当它们被翻译成描述性时,它确实有很大帮助
文本...至少,当人们谈论 MIB 和 OID 时,您知道这一切
关于。 不要忘记接口编号(如果它不是接口相关的,则为 0)并尝试
如果您没有从 snmpget 得到答案,请使用 snmpwalk。
如果您了解上述部分并从您的设备中获得数字,请继续
本教程。 如果没有,请返回并重新阅读此部分。
A 真实成功 世界 例如:
让乐趣开始。 首先,创建一个新的数据库。 它包含来自两个计数器的数据,
称为输入和输出。 数据被放入存档中,对其进行平均。 他们取 1, 6, 24
或一次 288 个样本。 他们还会进入保存最大数量的档案。 这个
稍后会解释。 样本之间的时间是 300 秒,这是一个很好的开始
点,相当于五分钟。
1 个样本“平均”保持 1 个 5 分钟的周期
6 个样本平均成为 30 分钟的一个平均值
平均 24 个样本在 2 小时内变成一个平均值
288 个样本平均成为 1 天的一个平均值
让我们尝试与存储以下数据量的 MRTG 兼容:
600 个 5 分钟样本:2 天 2 小时
600 个 30 分钟样本:12.5 天
600 个 2 小时样品:50 天
732 个 1 天样品:732 天
这些范围是附加的,因此存储在数据库中的数据总量是
大约 797 天。 RRDtool 以不同的方式存储数据,它不会启动“每周”
“每日”存档停止的存档。 对于这两个档案,最新的数据将是
接近“现在”,因此我们需要保留比 MRTG 更多的数据!
我们会需要:
600 分钟(5 天 2 小时)的 2 个样本
700 个 30 分钟样本(2 天 2 小时,加上 12.5 天)
775 个样本 2 小时(以上 + 50 天)
797 天的 1 个样本(以上 + 732 天,四舍五入为 797)
rrdtool 创建 myrouter.rrd \
DS:输入:计数器:600:U:U \
DS:输出:计数器:600:U:U \
RRA:平均:0.5:1:600 \
RRA:平均:0.5:6:700 \
RRA:平均:0.5:24:775 \
RRA:平均:0.5:288:797 \
RRA:最大:0.5:1:600 \
RRA:最大:0.5:6:700 \
RRA:最大:0.5:24:775 \
RRA:最大:0.5:288:797
接下来要做的是收集数据并存储它。 这是一个例子。 这个已经写完了
部分在伪代码中,您将不得不找出在您的操作系统上准确执行的操作
这行得通。
虽然不是宇宙的尽头
do
得到结果
snmpget 路由器社区 2.2.1.10.4
进入变量 $in
得到结果
snmpget 路由器社区 2.2.1.16.4
进入变量 $out
rrdtool 更新 myrouter.rrd N:$in:$out
等待 5 分钟
完成
然后,在收集了一天的数据后,尝试使用以下方法创建图像:
rrdtool 图 myrouter-day.png --start -86400 \
DEF:inoctets=myrouter.rrd:输入:平均\
DEF:outoctets=myrouter.rrd:输出:平均 \
区域:inoctets#00FF00:“交通中”\
LINE1:outoctets#0000FF:"外流量"
这应该会生成一张具有一天流量的图片。 一天是 24 小时 60
60 秒的分钟数:24*60*60=86400,我们从现在开始减去 86400 秒。 我们定义
(带有 DEF) inoctets 和 outoctets 作为来自数据库 myrouter.rrd 的平均值
并为“输入”流量绘制一个区域,并为“输出”流量绘制一条线。
查看图像并继续记录数据几天。 如果你喜欢,你可以试试
测试数据库中的示例,看看您是否可以获得各种选项和计算
工作。
建议:以每秒字节数和每秒位数显示。 制作以太网图形
如果它们超过每秒 XNUMX 兆位,则变为红色。
固结 功能
前几段我提到了保持最大值而不是
平均值。 让我们再深入一点。
回想一下有关汽车速度的所有内容。 假设我们在 144 分钟内以 5 公里/小时的速度行驶
分钟,然后被警察拦下 25 分钟。 在讲座结束时,我们
将带上我们的笔记本电脑并创建和查看从数据库中获取的图像。 如果我们看
我们创建的第二个 RRA,我们将获得 6 个样本的平均值。 样品
测量结果为 144+0+0+0+0+0=144,除以 30 分钟,修正误差为
1000,换算成km/h,结果是24km/h。 我仍然会得到一张票,但不会
再超速了:)
显然,在这种情况下,我们不应该看平均值。 在某些情况下,它们很方便。
如果你想知道你走了多少公里,平均图片会是正确的
一看。 另一方面,对于我们行进的速度,最大数量
看过更有趣。 稍后我们将看到更多类型。
数据也是一样。 如果您想知道金额,请查看平均值。 如果你想
要知道比率,请查看最大值。 随着时间的推移,它们会越来越分开。 在
我们创建的最后一个数据库,有两个档案每天保存数据。 这
保持平均值的存档将显示低数字,显示最大值的存档将具有
更高的数字。
对于我的汽车,这将转化为平均每天 96/24=4 公里/小时(因为我旅行了大约 94
公里)在工作日,最大 120 公里/小时(我的最高速度,我
每天到达)。
巨大差距。 不要看第二张图来估计我旅行的距离
不要看第一张图来估计我的速度。 如果样本是
靠近在一起,因为它们在五分钟内,但如果你是平均的,就不会。
在某些日子里,我会长途跋涉。 如果我穿越欧洲旅行 12 个小时,
第一张图将上升到大约 60 公里/小时。 第二个将显示 180 公里/小时。 这意味着
我行驶了 60 公里/小时乘以 24 小时 = 1440 公里的距离。 我以更高的速度做到了这一点
最高约 180 公里/小时。 然而,这可能并不意味着我旅行了 8 个小时
以 180 公里/小时的恒定速度!
这是一个真实的例子:随着流经德国(快!)并停下来几次
煤气和咖啡。 缓慢驶过奥地利和荷兰。 小心在
山脉和村庄。 如果你看一下从五分钟创建的图表
平均你会得到一个完全不同的画面。 你会看到相同的值
平均和最大图表(假设我每 300 秒测量一次)。 你将能够
看看我什么时候停下来,什么时候处于最高档,什么时候我开过快速的高速公路等等。
数据的粒度要高得多,所以你可以看到更多。 然而,这需要 12
每小时采样,或每天 288 个值,因此在较长时期内将是大量数据
时间。 因此,我们对其进行平均,最终得出每天一个值。 从这个值,我们
当然,看不到太多细节。
确保你理解最后几段。 只有一行和一个没有值
几个轴,您需要知道它们的含义并以适当的方式解释数据。
这适用于所有数据。
您可能犯的最大错误是将收集到的数据用于不该做的事情
适合。 如果您根本没有图表,情况会更好。
让我们 检讨 什么 现在 应该 知道
您知道如何创建数据库并可以将数据放入其中。 你可以把数字弄出来
再次通过创建图像,对数据库中的数据进行数学运算并查看结果
而不是原始数据。 您知道平均值和最大值之间的差异,并且
何时使用 which(或至少您应该有一个想法)。
RRDtool 可以做的比我们迄今为止学到的更多。 在你继续剩下的事情之前
关于本文档,我建议您从头开始重新阅读并尝试对文档进行一些修改
例子。 确保你完全理解一切。 这将是值得的努力和帮助
您不仅可以学习本教程的其余部分,还可以在您的日常监控中
看完这篇介绍后。
时间 来源 类型
好吧,你想继续。 欢迎回来并准备好加快速度
例子和解释。
您知道,为了随着时间的推移查看计数器,您必须取两个数字和
在经过的时间之间除以它们的差异。 这对于示例来说是有意义的
我给了你,但还有其他的可能性。 例如,我能够检索
我的路由器在三个地方的温度,即入口,所谓的热点和
排气。 这些值不是计数器。 如果我取两个样本的差异
并将其除以 300 秒,我将要求每秒的温度变化。
希望这是零! 如果没有,可能是机房着火了:)
所以,我们能做些什么? 我们可以告诉 RRDtool 将我们测量的值直接存储为它们
是(这并不完全正确,但足够接近)。 我们制作的图表看起来会很多
更好的是,它们将显示一个相当恒定的值。 我知道路由器什么时候忙(它可以工作
-> 它使用更多的电力 -> 它产生更多的热量 -> 温度升高)。 我知道
当门打开时(房间有空调)-> 来自其他地方的暖空气
建筑物的流入机房->入口温度升高)。 等。
我们之前创建数据库时使用的数据类型是计数器,现在我们有一个不同的
数据类型,因此它的名称不同。 它被称为 GAUGE。 还有更多这样的数据
类型:
- 反我们已经知道这个
- GAUGE 我们刚刚学会了这个
- 派生
- 绝对
两个附加类型是 DERIVE 和 ABSOLUTE。 绝对可以像计数器一样使用
一个区别:RRDtool 假定计数器在读取时被重置。 那就是:它的 delta 是
无需由 RRDtool 计算即可知道,而 RRDtool 需要为计数器计算
类型。 示例:我们的第一个示例 (12345, 12357, 12363, 12363) 将读取:unknown, 12, 6,
0. 其余计算保持不变。 另一种,派生,就像计数器。
与计数器不同,它也可以减少,因此它可以有一个负增量。 再次,剩下的
计算保持不变。
让我们都尝试一下:
rrdtool 创建 all.rrd --start 978300900 \
DS:a:计数器:600:U:U \
DS:b:仪表:600:U:U \
DS:c:DERIVE:600:U:U\
DS:d:绝对值:600:U:U \
RRA:平均:0.5:1:10
rrdtool 更新 all.rrd \
978301200:300:1:600:300 \
978301500:600:3:1200:600 \
978301800:900:5:1800:900 \
978302100:1200:3:2400:1200 \
978302400:1500:1:2400:1500 \
978302700:1800:2:1800:1800 \
978303000:2100:4:0:2100 \
978303300:2400:6:600:2400 \
978303600:2700:4:600:2700 \
978303900:3000:2:1200:3000
rrdtool 图 all1.png -s 978300600 -e 978304200 -h 400 \
DEF:linea=all.rrd:a:AVERAGE LINE3:linea#FF0000:"Line A" \
DEF:lineb=all.rrd:b:AVERAGE LINE3:lineb#00FF00:"Line B" \
DEF:linec=all.rrd:c:AVERAGE LINE3:linec#0000FF:"Line C" \
DEF:lined=all.rrd:d:AVERAGE LINE3:lined#000000:"Line D"
RRD工具 下 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 显微镜
· A 行是 COUNTER 类型,所以它应该不断递增并且 RRDtool 必须计算
差异。 此外,RRDtool 需要将差异除以时间量
失效了。 这应该以 1 处的直线结束(增量为 300,时间为
300)。
· B 线为 GAUGE 类型。 这些是“真实”值,因此它们应该与我们输入的值相匹配:
一种波浪。
· C 行是 DERIVE 类型。 它应该是一个可以减少的计数器。 它这样做之间
2400 和 0,中间有 1800。
· D 行是绝对类型。 这就像计数器,但它适用于没有
计算差异。 数字是相同的,正如您所看到的(希望如此)
有不同的结果。
这将转换为以下值,从 23:10 开始到下一个 00:10 结束
天(其中“u”表示未知/未绘制):
- A行:uu 1 1 1 1 1 1 1 1 1 u
- B行:u 1 3 5 3 1 2 4 6 4 2 u
- C行:uu 2 2 2 0 -2 -6 2 0 2 u
- D行:u 1 2 3 4 5 6 7 8 9 10 u
如果您的 PNG 显示所有这些,您就知道您已正确输入数据,RRDtool
可执行文件工作正常,您的查看器不会欺骗您,并且您已成功输入
2000 年 :)
您可以尝试四次相同的示例,每次只使用其中一行。
让我们再次回顾一下数据:
· A线:300,600,900等。 计数器增量是一个常数 300,时间也是如此
三角洲。 一个数自除总是 1(除以零时除外)
未定义/非法)。
为什么第一点是未知的? 我们确实知道我们放入数据库的内容,
对? 是的,但我们没有计算增量的值,所以我们不知道
我们开始的地方。 假设我们从零开始是错误的,所以我们没有!
· B行:没有什么可计算的。 数字是这样的。
· C 行:同样,起始值是未知的。 同样的故事也适用于 A 行。
在这种情况下,增量不是恒定的,因此线也不是。 如果我们把
数据库中的数字与我们在 A 行中所做的相同,我们会得到相同的
线。 与类型计数器不同,这种类型可以减少,我希望稍后向您展示原因
这有所作为。
· D 行:此处设备计算增量。 因此我们确实知道第一个增量和
它被绘制。 我们有和 A 行一样的输入,但是这个输入的意思是
不同,因此线路不同。 在这种情况下,增量每次都会增加
与 300。时间增量保持在一个常数 300,因此两者的除法
给出递增的值。
Counter 包裹
还有一些基础知识要展示。 一些重要的选项仍有待讨论,我们
还没看柜台包装。 首先是柜台包装:在我们的汽车中,我们注意到
柜台显示 999987。我们行驶了 20 公里,柜台应该转到 1000007。不幸的是,
我们的计数器上只有六位数字,所以它确实显示了 000007。如果我们绘制它
在类型 DERIVE 上,这意味着计数器被设置回 999980 公里。 不是,而且
对此必须有一些保护。 此保护仅适用于类型
COUNTER 无论如何都应该用于这种计数器。 它是如何工作的? 类型
计数器永远不应该减少,因此 RRDtool 必须假设它已包装
减少! 如果 delta 为负,这可以通过添加最大值来补偿
计数器的值 + 1。对于我们的汽车,这将是:
Delta = 7 - 999987 = -999980(而不是 1000007-999987=20)
真实增量 = -999980 + 999999 + 1 = 20
在撰写本文档时,RRDtool 知道计数器是 32 位或
64 位大小。 这些计数器可以处理以下不同的值:
- 32 位:0 .. 4294967295
- 64 位:0 .. 18446744073709551615
如果您觉得这些数字很奇怪,您可以查看它们的十六进制形式:
- 32 位:0 .. FFFFFFFF
- 64 位:0 .. FFFFFFFFFFFFFFFF
RRDtool 以相同的方式处理两个计数器。 如果发生溢出并且增量为
负数,RRDtool 首先将小计数器的最大值 + 1 添加到增量中。 如果三角洲
仍然是负面的,它必须是包裹的大柜台。 添加最大可能
大计数器的值 + 1 并减去错误添加的小值。
这有一个风险:假设大计数器在添加一个巨大的增量时被包裹,它
理论上可能会发生,添加较小的值会使增量为正。
在这种不太可能的情况下,结果将不正确。 增幅应该差不多
高到发生这种情况的最大计数器值,所以你很可能会有
还有其他几个问题,这个特定的问题甚至不值得
想着。 尽管如此,我确实包含了一个例子,所以你可以自己判断。
下一节为您提供了一些反包裹的数值示例。 尝试做
自己计算或者相信我,如果你的计算器不能处理数字:)
修正编号:
- 32 位:(4294967295 + 1) = 4294967296
- 64 位:(18446744073709551615 + 1)
- 更正 1 = 18446744069414584320
之前:4294967200
增加:100
应该变成:4294967300
但确实是:4
三角洲:-4294967196
更正1:-4294967196 + 4294967296 = 100
之前:18446744073709551000
增加:800
应该变成:18446744073709551800
但确实是:184
三角洲:-18446744073709550816
更正1:-18446744073709550816
+ 4294967296 = -18446744069414583520
更正2:-18446744069414583520
+ 18446744069414584320 = 800
之前:18446744073709551615(最大值)
增加:18446744069414584320(荒谬的增加,最低
应该变成:36893488143124135935 这个例子才能工作)
但确实是:18446744069414584319
三角洲:-4294967296
更正1:-4294967296 + 4294967296 = 0
(非负 -> 没有更正2)
之前:18446744073709551615(最大值)
增加:18446744069414584319(少增加一)
应该变成:36893488143124135934
但确实是:18446744069414584318
三角洲:-4294967297
更正1:-4294967297 + 4294967296 = -1
更正2:-1 + 18446744069414584320 = 18446744069414584319
正如您从最后两个示例中看到的,您需要奇怪的数字才能使 RRDtool 失败
(当然,前提是它没有错误),所以这不应该发生。 但是,SNMP 或其他
您选择的收集数据的方法,也可能偶尔会报告错误的数字。 我们
不能防止所有错误,但我们可以做一些事情。 RRDtool“创建”
命令为此需要两个特殊参数。 它们定义了允许的最小值和最大值
值。 直到现在,我们都使用“U”,意思是“未知”。 如果您为一个或两个提供值
其中,如果 RRDtool 收到超出这些限制的数据点,它将忽略
那些价值观。 对于以摄氏度为单位的温度计,绝对最小值刚好低于
-273。 对于我的路由器,我可以假设这个最小值要高得多,所以我将它设置为 10,
作为最高温度,我将设置为 80。任何更高的设备都会被淘汰
秩序。
对于我的车的速度,我永远不会期望负数,也不会期望
速度高于230。其他任何东西,肯定有错误。 记住:该
相反不是真的,如果数字通过了这个检查,这并不意味着它们是
正确的。 如果您觉得图表很奇怪,请始终以合理的怀疑态度来判断图表。
时间 重采样
RRDtool 的一个重要特性尚未解释:几乎不可能
收集数据并以精确的时间间隔将其输入 RRDtool。 RRDtool 因此插值
数据,因此它们以精确的间隔存储。 如果您不知道这意味着什么或如何
它有效,那么这是您寻求的帮助:
假设一个计数器每秒钟正好增加 300。 你想用 XNUMX 来衡量它
秒间隔。 您应该检索相距 300 的值。 然而,由于
各种情况你迟到几秒,间隔是 303。 delta 会
在这种情况下也是 303。 显然,RRDtool 不应该把 303 放在数据库中并进行
您认为计数器在 303 秒内增加了 300。 这就是 RRDtool
插值:它改变 303 值,就好像它会更早地存储一样,它会
在 300 秒内达到 300。 下一次你正是在正确的时间。 这意味着
当前间隔为 297 秒,计数器也增加了 297。再次,RRDtool
按原样插入并存储 300。
在现实中的 RRD
时间+000:0 delta="U" 时间+000:0 delta="U"
时间+300:300 delta=300 时间+300:300 delta=300
时间+600:600 delta=300 时间+603:603 delta=303
时间+900:900 delta=300 时间+900:900 delta=297
让我们创建两个相同的数据库。 我选择了 920805000 到 920805900 的时间范围作为
这与示例数字非常吻合。
rrdtool 创建 seconds1.rrd \
--开始 920804700 \
DS:秒:计数器:600:U:U \
RRA:平均:0.5:1:24
制作副本
对于 Unix:cp seconds1.rrd seconds2.rrd
对于 Dos:复制 seconds1.rrd seconds2.rrd
对于 vms:我怎么知道 :)
输入一些数据
rrdtool 更新 seconds1.rrd \
920805000:000 920805300:300 920805600:600 920805900:900
rrdtool 更新 seconds2.rrd \
920805000:000 920805300:300 920805603:603 920805900:900
创建输出
rrdtool 图 seconds1.png \
--开始 920804700 --结束 920806200 \
--高度 200 \
--上限1.05 --下限0.95 --刚性\
DEF:秒=秒1.rrd:秒:平均 \
CDEF:未知=秒,UN \
LINE2:秒#0000FF \
区域:未知#FF0000
rrdtool 图 seconds2.png \
--开始 920804700 --结束 920806200 \
--高度 200 \
--上限1.05 --下限0.95 --刚性\
DEF:秒=秒2.rrd:秒:平均 \
CDEF:未知=秒,UN \
LINE2:秒#0000FF \
区域:未知#FF0000
一起查看两个图像(将它们添加到您的 index.html 文件)并进行比较。 两个图
尽管输入不同,但应该显示相同。
包起来
现在是结束本教程的时候了。 我们涵盖了所有基础知识,以便您能够
使用 RRDtool 并阅读可用的附加文档。 还有很多
发现 RRDtool,你会发现这个包越来越多的用途。 你可以
仅使用提供的示例并仅使用 RRDtool 即可轻松创建图形。 你也可以
使用可用的 RRDtool 前端之一。
邮件列表
记得订阅 RRDtool 邮件列表。 即使您不回复邮件
来,它对您和其他用户都有帮助。 很多我知道的东西
关于 MRTG(因此关于 RRDtool)我在阅读列表时学到了
发布到它。 我不需要问基本问题,因为它们已在常见问题解答中得到解答
(阅读它!)以及其他用户的各种邮件。 拥有数以千计的用户遍布全国
世界上,总会有人问你能回答的问题,因为你读过
这个和其他文件,他们没有。
使用 onworks.net 服务在线使用 rrdtutorial