Linux中MRTG的高级应用
1/ 简介
在多数情况下,使用MRTG的基本配置来监测系统的网络流量是不够的。你还可能想看一看CPU、磁盘和内存使用的曲线。这一章解释如何在SNMP的MIB文件中找到你要查看的值,如何利用这些信息配置MRTG。
本章中所有的实例使用SNMP的只读COMMUNITY串为“craz33guy”,并且net-snmp-utils的RPM包已经安装。(参考22章,“监测系统性能”)。
2/ 查找和查看Linux的MIBs的内容
MIBs以数据方式居留在内存当中,并通过SNMP进程不断更新。MIB的配置文本文档位于硬盘中,并当每次SNMP重启时加载到内存中。
你能够很容易地使用命令“locate”和过滤器让输出过滤为仅包含“snmp”来找到Fedora的MIBs。就像下面这样例子一样,MIBs的位置在 /usr/share/snmp/mibs/目录中:
[root@bigboy tmp]# locate mib | grep snmp
/usr/share/doc/net-snmp-5.0.6/README.mib2c
/usr/share/snmp/mibs
/usr/share/snmp/mibs/DISMAN-SCHEDULE-MIB.txt
...
...
[root@bigboy tmp]#
由于MIB的配置文件是用文本文件方式存储的,所以我们可以使用“grep”命令来搜索关键词。下面这个例子查找追踪TCP连接的MIBs,RFC1213和TCP MIBs就是返回的结果。
[root@silent mibs]# grep -i tcp /usr/share/snmp/mibs/*.txt | grep connections
...
RFC1213-MIB.txt: "The limit on the total number of TCP connections
RFC1213-MIB.txt: "The number of times TCP connections have made a
...
TCP-MIB.txt:     "The number of times TCP connections have made a
...
...
[root@silent mibs]#
我们可以使用编辑器 vi来查看MIBs。不要改变它们,因为这样会导致SNMP失败。MIBs非常复杂,但庆幸的是关键区域则是可以注释的(commented ?)。
MIB里的每一个值都被称为一个对象,且经常与它的目标ID或OID对应。在RFC1213-MIB.txt中,我们可以看到查询对象“tcpActiveOpens ”会返回一个服务器的激活的TCP连接数。字段“SYNTAX(语法)”表明这是一个计数值。
MIBs经常追踪两种类型的值:
计数值被用于随着时间不断增加的项,例如流经NIC的数据包的数目或自启动以来CPU工作的时间。
整数值是随时都在变化的值,这个在追踪内存被使用的统计情况是非常有用。
tcpActiveOpens OBJECT-TYPE
    SYNTAX  Counter
    ACCESS  read-only
    STATUS  mandatory
    DESCRIPTION
            "The number of times TCP connections have made a
            direct transition to the SYN-SENT state from the
            CLOSED state."
    ::= { tcp 5 }
	tcpMaxConn OBJECT-TYPE
    SYNTAX  INTEGER
    ACCESS  read-only
    STATUS  mandatory
    DESCRIPTION
            "The limit on the total number of TCP connections
            the entity can support.  In entities where the
            maximum number of connections is dynamic, this
            object should contain the value -1."
    ::= { tcp 4 }
你会后面发现SNMP和MRTG之间用语的差异。理解它们在使用MRTG追踪MIB的值时是非常重要的。
3/ 测试你的MIB的值
一旦你确定一个感兴趣的Linux系统的MIB值,你就可以使用“snmpwalk”来收集它。多数情况下,MIB的文本别名只是对OID的分支有效,而不是以额外的“.0”或“.1”结尾的OID的数据叶子。“snmpget”命令在使用分支时将会报错,说这个MIB变量找不到。
在下面这个例子中,我们对别名为”ssCpuRawUser”的OID感兴趣,但是“snmpget”却不能取到值。根据“snmpwalk”显示的数据我们用“ssCpuRawUser.0”代替。现在“snmpget”就成功执行了,得到了“counter32”类型的数据,且值为“396271”。
[root@bigboy tmp]# snmpget -v1 -c craz33guy localhost ssCpuRawUser
Error in packet
Reason: (noSuchName) There is no such variable name in this MIB.
Failed object: UCD-SNMP-MIB::ssCpuRawUser
[root@bigboy tmp]#
[root@bigboy tmp]# snmpwalk -v1 -c craz33guy localhost ssCpuRawUser
UCD-SNMP-MIB::ssCpuRawUser.0 = Counter32: 396241
[root@bigboy tmp]# snmpget -v1 -c craz33guy localhost ssCpuRawUser.0
UCD-SNMP-MIB::ssCpuRawUser.0 = Counter32: 396271
[root@bigboy tmp]#
用“snmpget”可以成功执行的MIB值,我们就可以使用MRTG来获得。
4/ MIB与MRTG名词解释之间的区别
要时刻记住MRTG引用MIB的计数值作为计数器的值。引用MIB整数和规格作为规格。默认情况下,MRTG把所有的值当作计数值。(有点不太顺,原文如下:Always keep in mind that MRTG refers to MIB counter values as counter values. It refers to MIB integer and gauge values as gauge. By default, MRTG considers all values to be counters. )
MRTG并不用计数值来绘制不断增加的曲线,它只使用与最后一次收集时的数据相比改变的值来绘制曲线。CPU使用情况是典型的被MIBs追踪的计数值;幸运的是,你能够编辑MRTG的配置文档来让它以百分比的形式来绘制曲线(后面有详细说明)。
语法类型,MIB对象名称和它是什么的描述是你在配置MRTG时要知道的最重要的事情。这个将在后面说明。
5/ 监测CPU和内存的MIB(?)
名称为“UCD-SNMP-MIB ”追踪MIB对象的关键性能,包括下图中最常用的几个。
5.1/ 在UCD-SNMP-MIB中重要的对象
##UCD-SNMP-MIB
## 对象变量 MIB类型 MRTG类型 描述
## =========== ======= ======== =========
ssCpuRawUser Counter Counter 系统启动之后未授权用户运行的
程序占用CPU的总量
—————————————————————-
ssCpuRawSystem Counter Counter 系统启动之后授权的系统进程
运行的程序占用的CPU总量
—————————————————————-
ssCpuRawNice Counter Counter 运行在非默认优先权级别的
程序占用的CPU总量
—————————————————————-
ssCpuRawIdle Counter Counter 某一时刻空闲CPU所占百分比。
用100减去这个值会对整个CPU的
使用情况有较好的估计
—————————————————————-
6/ 监测TCP/IP的MIB
名称为“TCP-MIB”追踪数据连接信息,包括了非常有用的对象“tcpActiveOpens”和“tcpCurrEstab”。
6.1/ 在TCP-MIB中重要的对象
## TCP-MIB对象变量 MIB类型 MRTG类型 描述
## =============== ======= ======== =========
tcpActiveOpens Counter Counter 衡量已完成的TCP连接数
—————————————————————-
tcpCurrEstab Gauge Gauge 衡量处于“established”
状态的TCP连接数
—————————————————————-
tcpInErrs Counter Counter 带有验证错误的TCP段的数目
—————————————————————-
7/ 手动配置MRTG文档
MRTG的cfgmaker程序只是为网络接口建立配置文档,同时追踪两个OIDs:网络接口的输入和输出数据统计信息。MRTG的程序使用这些配置文档来决定记录在它的数据目录中的数据类型。indexmaker程序也使用这些信息来建立总的消息,或者对你监测的OIDs进行一个可浏览的网页摘要。
摘要页只显示每天的统计信息。单击摘要图可以看到它后面的详细页面,有每天、每周、每月和每年的曲线。配置文档中的一些参数参阅详细信息,其它的参阅摘要信息。
如果你想监测其它的OIDs,你要手动建立配置文档,因为cfgmaker除了与NIC有关的OIDs之外的OIDs就不知道了。MRTG和indexmaker程序会自定义的配置文档当中发现(fed ?)独立的OIDs,如果你编辑正确的话,那它就完成你所期望的功能。
7.1/ 参数格式
MRTG配置参数总是跟着一个用“[]”括起来的曲线名称和一个“:”。格式如下:
Parameter[graph name]: value
为了便于编辑,针对某一个特定的曲线的参数通常会成组放在一起。每一个曲线能够追踪两个列在目标参数中的OIDs,它通常被放置在曲线名称列表的最上方。这两个OID值用“&”分隔;第一个是输入OID,第二个是输出OID。
7.2/ legend参数
在详细的Web浏览页,每一个曲线都有一个legend被用来显示OID的统计信息的最大值、平均数和当前值。你可以用“legendI”参数来描述输入曲线(第一个OID曲线),用“legendO”参数来描述输出曲线(第二个OID曲线)。
在每一个曲线legend下文的可用空白都是很少的,这样MRTG还有“legend1”和“legend2”两个参数要放在页面的最底部来提供更多的详细资料。参数“legend1”是“legendI”的扩展,参数“legend2”是“legendO”的扩展。
“Ylegend”是Y轴的legend,它的值就是你想比较的值。在默认的MRTG的配置文档中它可能是位或字节每秒流经接口的数据流。下面是一个默认的MRTG的配置档:
YLegend[graph1]: Bits per second
Legend1[graph1]: Incoming Traffic in Bits per Second
Legend2[graph1]: Outgoing Traffic in Bits per Second
LegendI[graph1]: In
LegendO[graph1]: Out
要是不想让MRTG在曲线底部显示某项legend,可以让该legend的值为空就可以了:
LegendI[graph1]:
在后面你将会知道如何在不同的情形中匹配legend与OIDs。
7.3/ 选项参数
选项参数给MRTG提供了曲线格式的一个信息。选项 growright保证屏幕右边的数据是最近的曲线的值。这使曲线更直观更容易读懂。MRTG默认的选项是从左边增长。
选项 nopercent防止MRTG在曲线的底部的legends处打印出百分比样式的统计信息。选项 gauge警告MRTG的一个事实,那就是曲线的值是“gauge”类型的。如果你监测的值是字节类型的,你可以通过选项 bits来使输出转换成“bits”类型的。同样,你可以通过选项 perminute将曲线的值从每秒转换成每分钟。下面是两种不同曲线的一些实例:
options[graph1]: growright,nopercent,perminute
options[graph2]: gauge,bits
如果你将一个选项放在顶端并跟着一个“[_]”就表明这个选项会对这个文件当中所有的曲线都有效,例如:
options[_]: growright
摘要页的标题由选项 Title标明,详细页的标题由选项 PageTop标明。“PageTop”选项的值必须用“< H1 >”括起来。
Title[graph1]: Interface eth0
PageTop[graph1]: < H1 >Detailed Statistics For Interface eth0 < H1 >
7.4/ 缩放比例参数
参数 MaxBytes是MRTG在曲线图中数据的最大值。任何超过这个值的都会超过曲线的边界而看不见。
MRTG还是会尽量调整它的曲线使它的最大值一直接近它的曲线的顶端。这种情况即使你设置了最大值也还是会发生。
当你收集一个值,它有已知的最大值,你可能想让这个值一直呆在竖直legend的顶端,那么你可能要关闭MRTG的自动缩放。如果你收集CPU使用的百分比,而服务器则达到了最大值的60%,通过缩放,MRTG就会使竖直的数据从0%到60%,这个垂直方向波峰就接近曲线的顶端了。
当缩放关闭时,而且 MaxBytes被设置为100,那么曲线的值就会从0%到100%,而波峰则只会60%。下面这个例子将详细页面中的每年、每月、每周和每天视图的缩放去掉了,并且设定了最大值为100。
Unscaled[graph1]: ymwd
MaxBytes[graph1]: 100
7.5/ 定义MIB目标参数
就像前面所说的那样,MRTG总是比较目标参数定义的两个MIB OID的值。我们要指定两个MIB OID对象,SNMP密码和你要查询设备的IP地址,并用“&”将它们分开。
Target[graph1]: mib-object-1.0&mib-object-2.0:@
在MIB最后的数值,在这里是“.0”,是需要的。下面这个例子返回了LINUX服务器的CPU在用户模式下的综合使用情况。注意输出当中的“.0”是跟在标记的后面的。
[root@silent mibs]# snmpwalk -v 1 -c craz33guy localhost ssCpuRawUser
UCD-SNMP-MIB::ssCpuRawUser.0 = Counter32: 926739
[root@silent mibs]#
7.5.1/ 将MIBs映射到曲线的legend
MRTG的legend映射到MIBs的列表在下面:
Legend  Maps To Target MIB
Legend1  #1
Legend2  #2
LegendI  #1
LegendO  #2
所以,在下面这个例子中,legend1和legendI描述的是mib-object-1.0,而legend2和legendO描述的是mib-object-2.0。
Target[graph1]: mib-object-1.0&mib-object-2.0:@
7.5.2/ 只绘制一个MIB值
如果你只想绘制一个MIB的值,你只需像下面例子中一样重复对目标MIB的定义就可以了,这里只绘制mib-object-1。结果MRTG曲线实际上superimposes输入和输出曲线一个接着一个。
Target[graph1]: mib-object-1.0&mib-object-1.0:@
7.5.3/ Adding MIB Values Together For a Graph
你可以用“+”将一对MIB对象连接起来。下面这个实例将mib-object-1.0和mib-object-3.0添加到一个曲线中,并将mib-object-2.0和mib-object-4.0添加到另一个曲线中。
Target[graph1]: mib-object-1.0&mib-object-2.0:@ + mib-object-3.0&mib-object-4.0:@
你还可以使用其它的算术符号,如“-”,“*”和“%”,“(”和“)”也是有效的。在这些符号的左右都必须有空格,要不然你的曲线就会古怪而带有阴影。
7.5.4/ 目标实例:CPU使用情况
在Linux系统中CPU被系统进程、用户进程和一些运行在“nice”模式的进程所占用。下面这个实例将它们都放在一起了。
Target[graph1]:ssCpuRawUser.0&ssCpuRawUser.0:@ + ssCpuRawSystem.0&ssCpuRawSystem.0:@ + ssCpuRawNice.0&ssCpuRawNice.0:@
请确认这些命令在单独的一行中。
7.5.5/ 目标实例:内存使用
下面是一个有关可用内存情况的例子。注意这是一个“gauge”类型的变量。
Target[graph1]: memAvailReal.0&memTotalReal.0:@
options[graph1]: nopercent,growright,gauge
接下来,是一个可用内存百分比的例子。注意在数学运算符与下一个目标对象之间有强制的空白。
Target[graph1]: ( memAvailReal.0& memAvailReal.0:@ ) * 100 / ( memTotalReal.0&memTotalReal.0:@ )
options[graph1]: nopercent,growright,gauge
7.5.6/ 目标实例:新建连接
HTTP流量是由通常是非常短的Web浏览的连接产生的。MIB对象 tcpPassiveOpens追踪新建连接,并适合这种类型的数据传输。MIB对象 tcpActiveOpens监测从服务器发起的新建连接。在小一点的Web站点,你可能要用选项 perminute来使曲线更有意义。
Target[graph1]: tcpPassiveOpens.0& tcpPassiveOpens.0:@
MaxBytes[graph1]: 1000000
Options[graph1]: perminute
7.5.7/ 目标实例:全部TCP建立连接
其它像FTP和SSH等协议则建立长时间的连接,当人们下载大的文件或者登陆到服务器上时。MIB对象 tcpCurrEstab衡量连接状态为 established 的连接总数,并且它是一个 gauge值。
Target[graph1]: tcpCurrEstab.0&tcpCurrEstab.0:@
MaxBytes[graph1]: 1000000
Options[graph1]: gauge
7.5.8/ 目标实例:磁盘分区使用
在这个实例中,让我们来监测系统上的 /var/home分区。
1. 使用 df -k列出在使用的分区。
[root@bigboy tmp]# df -k
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/hda8               505605    128199    351302  27% /
/dev/hda1               101089     19178     76692  21% /boot
/dev/hda5              1035660    122864    860188  13% /home
/dev/hda6               505605      8229    471272   2% /tmp
/dev/hda3              3921436    890092   2832140  24% /usr
/dev/hda2              1510060    171832   1261520  73% /var
[root@bigboy tmp]#
2. 在 snmpd.conf文档中添加两行:
disk  /home
disk  /var
3. 重启SNMP来重读值
[root@bigboy tmp]# service snmpd restart
4. 使用snmpwalk来查询MIB dskPercent
对象 dskPercent.1对应snmpd.conf中的对一个磁盘(/home), dskPercent.2对应第二个(/var)。
[root@bigboy tmp]# snmpwalk -v 1 -c craz33guy localhost dskPercent.1
UCD-SNMP-MIB::dskPercent.1 = INTEGER: 13
[root@bigboy tmp]# snmpwalk -v 1 -c craz33guy localhost dskPercent.2
UCD-SNMP-MIB::dskPercent.2 = INTEGER: 73
[root@bigboy tmp]#
对于这些”gauge”MIB对象,你的MRTG目标可能会是这样子的:
Target[graph1]: dskPercent.1& dskPercent.1:@
options[graph1]: growright,gauge
7.5.9/ 定义全局变量
你要让MRTG知道你所使用的MIBs的位置。MRTG默认使用的路径可能无效。要用全局参数 LoadMIBs来明确位置。你还要定义HTML文件保存位置;下面的例子明确了Fedora默认情况下MRTG的HTML文件目录。
LoadMIBs: /usr/share/snmp/mibs/UCD-SNMP-MIB.txt, /usr/share/snmp/mibs/TCP-MIB.txt
workdir: /var/www/mrtg/
8/ 服务器高级监测实践
你现在能够将你所知道的联合起来建立一个配置文件来监测这些所有的变量,并且你能把它整合到现存的MRTG配置文件中。
8.1/ 一个完整的配置文档
下面是一个用来查询本地CPU,内存,磁盘和TCP连接信息的配置文件脚本。
#
# File: /etc/mrtg/server-info.cfg
#
# Configuration file for non bandwidth server statistics
#
#
# Define global options
#
LoadMIBs: /usr/share/snmp/mibs/UCD-SNMP-MIB.txt,/usr/share/snmp/mibs/TCP-MIB.txt
workdir: /var/www/mrtg/
#
# CPU Monitoring
# (Scaled so that the sum of all three values doesn't exceed 100)
#
Target[server.cpu]:ssCpuRawUser.0&ssCpuRawUser.0:craz33guy@localhost + ssCpuRawSystem.0&ssCpuRawSystem.0:craz33guy@localhost + ssCpuRawNice.0&ssCpuRawNice.0:craz33guy@localhost
Title[server.cpu]: Server CPU Load
PageTop[server.cpu]: < H1 >CPU Load - System, User and Nice Processes< /H1 >
MaxBytes[server.cpu]: 100
ShortLegend[server.cpu]: %
YLegend[server.cpu]: CPU Utilization
Legend1[server.cpu]: Current CPU percentage load
LegendI[server.cpu]: Used
LegendO[server.cpu]:
Options[server.cpu]: growright,nopercent
Unscaled[server.cpu]: ymwd
#
# Memory Monitoring (Total Versus Available Memory)
#
Target[server.memory]: memAvailReal.0&memTotalReal.0:craz33guy@localhost
Title[server.memory]: Free Memory
PageTop[server.memory]: < H1 >Free Memory< /H1 >
MaxBytes[server.memory]: 100000000000
ShortLegend[server.memory]: B
YLegend[server.memory]: Bytes
LegendI[server.memory]: Free
LegendO[server.memory]: Total
Legend1[server.memory]: Free memory, not including swap, in bytes
Legend2[server.memory]: Total memory
Options[server.memory]: gauge,growright,nopercent
kMG[server.memory]: k,M,G,T,P,X
#
# Memory Monitoring (Percentage usage)
#
Title[server.mempercent]: Percentage Free Memory
PageTop[server.mempercent]: < H1 >Percentage Free Memory< /H1 >
Target[server.mempercent]: ( memAvailReal.0&memAvailReal.0:craz33guy@localhost ) * 100 / ( memTotalReal.0&memTotalReal.0:craz33guy@localhost )
options[server.mempercent]: growright,gauge,transparent,nopercent
Unscaled[server.mempercent]: ymwd
MaxBytes[server.mempercent]: 100
YLegend[server.mempercent]: Memory %
ShortLegend[server.mempercent]: Percent
LegendI[server.mempercent]: Free
LegendO[server.mempercent]: Free
Legend1[server.mempercent]: Percentage Free Memory
Legend2[server.mempercent]: Percentage Free Memory
#
# New TCP Connection Monitoring (per minute)
#
Target[server.newconns]: tcpPassiveOpens.0&tcpActiveOpens.0:craz33guy@localhost
Title[server.newconns]: Newly Created TCP Connections
PageTop[server.newconns]: < H1 >New TCP Connections< /H1 >
MaxBytes[server.newconns]: 10000000000
ShortLegend[server.newconns]: c/s
YLegend[server.newconns]: Conns / Min
LegendI[server.newconns]: In
LegendO[server.newconns]: Out
Legend1[server.newconns]: New inbound connections
Legend2[server.newconns]: New outbound connections
Options[server.newconns]: growright,nopercent,perminute
#
# Established TCP Connections
#
Target[server.estabcons]: tcpCurrEstab.0&tcpCurrEstab.0:craz33guy@localhost
Title[server.estabcons]: Currently Established TCP Connections
PageTop[server.estabcons]: < H1 >Established TCP Connections< /H1 >
MaxBytes[server.estabcons]: 10000000000
ShortLegend[server.estabcons]:
YLegend[server.estabcons]: Connections
LegendI[server.estabcons]: In
LegendO[server.estabcons]:
Legend1[server.estabcons]: Established connections
Legend2[server.estabcons]:
Options[server.estabcons]: growright,nopercent,gauge
#
# Disk Usage Monitoring
#
Target[server.disk]: dskPercent.1&dskPercent.2:craz33guy@localhost
Title[server.disk]: Disk Partition Usage
PageTop[server.disk]: < H1 >Disk Partition Usage /home and /var< /H1 >
MaxBytes[server.disk]: 100
ShortLegend[server.disk]: %
YLegend[server.disk]: Utilization
LegendI[server.disk]: /home
LegendO[server.disk]: /var
Options[server.disk]: gauge,growright,nopercent
Unscaled[server.disk]: ymwd
8.2/ 测试配置
下一步就是测试MRTG能否正确加载这个配置文件。
重启SNMP确认snmpd.conf中的磁盘监测命令被激活。运行 /usr/bin/mrtg加上配置文件名三次。
[root@bigboy tmp]# service snmpd restart
[root@bigboy tmp]# env LANG=C /usr/bin/mrtg /etc/mrtg/server-stats.cfg
8.3/ 建立一个新的MRTG索引页,并包含这个文件
使用第22章中讲到的 indexmaker命令包括原来的配置文件(/etc/mrtg/mrtg.cfg)再加上你所创建的新的配置文件(/etc/mrtg/server-stats.cfg)。
[root@bigboy tmp]# indexmaker --output=/var/www/mrtg/index.html \
/etc/mrtg/mrtg.cfg /etc/mrtg/server-stats.cfg
8.4/ 使用新的MRTG文档来配置cron
最后一步就是确认MRTG使用新的配置文件每隔5分钟就收集一下服务器的资料。只要在 /etc/cron.d/mrtg中添加下面一行就可以了:
0-59/5 * * * * root env LANG=C /usr/bin/mrtg /etc/mrtg/server-stats.cfg
一些Linux版本可能要求你修改/etc/crontab文件。你还可能需要使用命令 service crond restart来重新启动cron以便让它读取新的配置文件。
[root@bigboy tmp]# service crond restart
9/ 监测非Linux系统的MIB的值
到目前为止,我们所谈论的MIB都是Linux系统的。其它类型的系统需要额外的MIBs,这些MIBs的安装可能在用户指南中也没有说清楚,或者根本不可用。在这种情况下,你需要知道精确的OID的值。
9.1/ 情景
设想一下你们的小公司购买了二手的Cisco交换机来连接Web服务器到Internet上。在第22章中MRTG的基本配置,“监测系统性能”,提供了有关带宽的统计,但是你还想知道系统的CPU负载。从Cisco网站上下载MIBs,然后使用 snmpget,但却不会成功。你不知道下一步该如何去做了。去查找OIDs。
当MIB的值失败时,最好去查找精确的OID的值。像多数的网络设备制造商一样,Cisco有一个FTP站点可供你下载MIBs和OIDs。Cisco的SNMP文件可以在 ftp.cisco.com/pub/mibs目录当中;而OIDs在它下面的 oid目录中。
在查看了所有的OID文件之后,你认为 CISCO-PROCESS-MIB.oid会包含需要的值,并在其中找到下面这些:
"cpmCPUTotalPhysicalIndex"  "1.3.6.1.4.1.9.9.109.1.1.1.1.2"
"cpmCPUTotal5sec"           "1.3.6.1.4.1.9.9.109.1.1.1.1.3"
"cpmCPUTotal1min"           "1.3.6.1.4.1.9.9.109.1.1.1.1.4"
"cpmCPUTotal5min"           "1.3.6.1.4.1.9.9.109.1.1.1.1.5"
"cpmCPUTotal5secRev"        "1.3.6.1.4.1.9.9.109.1.1.1.1.6"
"cpmCPUTotal1minRev"        "1.3.6.1.4.1.9.9.109.1.1.1.1.7"
"cpmCPUTotal5minRev"        "1.3.6.1.4.1.9.9.109.1.1.1.1.8"
9.2/ 测试OIDs
就像你看到的一样,所有的OIDs都是开始于 1.3.6.1.4.1.9.9.109.1.1.1.1.的一棵相同的树的一部分。这个OIDs提供的值可能不完整,所以最好先用 snmpwalk命令来获取根下面所有的值。
[root@bigboy tmp]# snmpwalk -v1 -c craz33guy cisco-switch 1.3.6.1.4.1..9.9.109.1.1.1.1
SNMPv2-SMI::enterprises.9.9.109.1.1.1.1.2.1 = INTEGER: 0
SNMPv2-SMI::enterprises.9.9.109.1.1.1.1.3.1 = Gauge32: 32
SNMPv2-SMI::enterprises.9.9.109.1.1.1.1.4.1 = Gauge32: 32
SNMPv2-SMI::enterprises.9.9.109.1.1.1.1.5.1 = Gauge32: 32
[root@bigboy tmp]#
虽然列在OID的文件当中,但 1.1.1.1.61.1.1.1.71.1.1.1.8却没有被支持。这里注意一下,SNMP将原始OID文件中OID值的开始部分( 1.3.6.1.4.1)映射为单词 enterprise
接下来,我们使用 命令来设定snmpwalk返回的一个OID值。
[root@bigboy tmp]# snmpget -v1 -c craz33guy cisco-switch \
enterprises.9.9.109.1.1.1.1.5.1
SNMPv2-SMI::enterprises.9.9.109.1.1.1.1.5.1 = Gauge32: 33
[root@bigboy tmp]#
成功了!现在你就可以使用这个OID值, enterprises.9.9.109.1.1.1.1.5.1用于MRTG查询了。
10/ 用RRDtool来给MRTG加速
MRTG是一个非常有用的程序,但它有一些限制。每次设备被采集时,所有的曲线和Web页面都要重新建立一次。这就有可能使你的MRTG服务器过载,尤其是当你有大量的设备要监测时,只是那曲线就有可能需要超出5分钟的时间来生成。 RRDtool是MRTG的作者写得另一个程序,它能够存储通用的数据,却按照需要来产生曲线。将 整合起来将会有一个引人注目的效率提升。下面实例演示如何快速实施一个通用的解决办法。
10.1/ 情景
RRDtool的用途需要降低监测服务器的负载,由于大量的每次采集产生的MRTG曲线而使服务器的性能较差。
由于空间的制约,RRD数据库需要存放在 /var分区中。
服务器有默认Apache对CGI支持的配置,用于产生位于 /var/www/cgi-bin目录中的动态内容。
需要一个用RRDtool格式读取MRTG数据的脚本。
MRTG的配置文档为 /etc/mrtg/mrtg.cfg
下面是如何操作:
10.2/ 安装RRDtool
RRDtool和RRDtool PERL模块可以从下面这个站点下载:http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/
但安装则比较严格,因为安装程序在错误的目录当中可能要寻找支持的库文件。
幸运的是,预先要安装的RRDtool和RRDtool perl包现在已经是多数linux发行版的一部分了。
10.3/ 用RRDtool格式来存储MRTG数据
整合的操作可以在几分钟内完成,但步骤却是严格的:
1. 第一步是添加一些新的选项到你的 cfgmaker命令中。第一个指示MRTG只存储rrdtool格式的数据,第二个定义数据存储目录 /var/mrtg。为了增添安全性,这个目录应该在你的Web服务器根目录的外部。
--global 'LogFormat: rrdtool' --global "workdir: /var/mrtg"  --global 'IconDir: /mrtg'
最后,你还应该指明一个icon目录,用于存储所有未分类的MRTG页面的图标。RRD的Web接口脚本,我们会在后面用一个不正确(?什么意思)的目录来安装。图标目录 /mrtg实际上也是URL的一部分。在Fedora中,我们使用Apache默认的配置,这里MRTG的图标文件存放在 /var/www/mrtg目录中。如果你使用了一个非默认的Apache的MRTG配置或使用其它的Linux的发行版本或不同的版本,你要将这些图标复制到自定义的目录当中。
2.第二步建立一个数据repository(库?)目录 /var/mrtg,改变它的所有者为apache的用户(通常为apache或nobody),并使它能运行默认的Linux服务器程序。
[root@bigboy tmp]# mkdir /var/mrtg
[root@bigboy tmp]# chown apache /var/mrtg
[root@bigboy tmp]#
注:如果你使用的是SELinux,那你要将目录的背景(context ?)与目录 /var/www/html相匹配,这样当你的apache进程能够读取的CGI脚本需要的那些数据库文件。下面这些命令比较这两个目录的背景,并设置为正确的 /var/mrtg
[root@bigboy tmp]# ls -alZ /var/www | grep html
drwxr-xr-x  root     root     system_u:object_r:httpd_sys_content_t html
[root@bigboy tmp]# ls -alZ /var | grep mrtg
drwxr-xr-x  apache   root     root:object_r:var_t              mrtg
[root@bigboy tmp]# chcon -R -u system_u -r object_r -t httpd_sys_content_t /var/mrtg
[root@bigboy tmp]#
3. 我们现在需要测试一下RRD文件是否正确地被建立了。使用 /etc/mrtg/mrtg.cfg 作为源配置文件来运行MRTG,然后测试是否目录 /var/mrtg中的内容被改变了。
成功!
[root@bigboy tmp]# ls /var/mrtg/
localhost_192.168.1.100.rrd
[root@bigboy tmp]#
这些文件被正常建立了。接下来,我们需要找一个脚本来读取新的数据格式,并把它用Web格式表现出来。这就是我们接下来要讨论的。
10.4/ MRTG/RRDtool整合脚本
MRTG的官方网站建议mrtg-rrd站点(http://www.fi.muni.cz/~kas/mrtg-rrd/)上有个很好用的脚本。让我们继续来安装它。
1. 使用 wget来下载脚本。这个站点上有几个不同的版本,下载最新的那个。
[root@bigboy tmp]# wget ftp://ftp.linux.cz/pub/linux/people/jan_kasprzak/mrtg-rrd/mrtg-rrd-0.7.tar.gz
--12:42:12--  ftp://ftp.linux.cz/pub/linux/people/jan_kasprzak/mrtg-rrd/mrtg-rrd-0.7.tar.gz
           => `mrtg-rrd-0.7.tar.gz'
Resolving ftp.linux.cz... 147.251.48.205
Connecting to ftp.linux.cz|147.251.48.205|:21... connected.
Logging in as anonymous ... Logged in!
...
...
...
15:24:50 (53.53 KB/s) - `mrtg-rrd-0.7.tar.gz' saved [20863]
[root@bigboy tmp]# ls
mrtg-rrd-0.7.tar.gz
[root@bigboy tmp]#
2. 解压
[root@bigboy tmp]# tar -xzvf mrtg-rrd-0.7.tar.gz
mrtg-rrd-0.7/
mrtg-rrd-0.7/COPYING
mrtg-rrd-0.7/FAQ
mrtg-rrd-0.7/TODO
mrtg-rrd-0.7/Makefile
mrtg-rrd-0.7/mrtg-rrd.cgi
mrtg-rrd-0.7/ChangeLog
[root@bigboy tmp]#
3. 建立 /var/www/cgi-bin/mrtg目录,拷贝文件 mrtg-rrd.cgi到里面。
[root@bigboy tmp]# mkdir -p /var/www/cgi-bin/mrtg
[root@bigboy tmp]# cp mrtg-rrd-0.7/mrtg-rrd.cgi /var/www/cgi-bin/mrtg/
[root@bigboy tmp]#
4. 编辑 mrtg-rrd.cgi文件,使它调用文件 /etc/mrtg/mrtg.cfg的详细配置,或者你将目录当中所有的 .cfg文件都包含进去。
单个文件:
#
# File: mrtg-rrd.cgi (Single File)
#
# EDIT THIS to reflect all your MRTG config files
BEGIN { @config_files = qw(/etc/mrtg/mrtg.cfg); }
多个文件:
#
# File: mrtg-rrd.cgi (multipl .cfg files)
#
# EDIT THIS to reflect all your MRTG config files
BEGIN { @config_files = ; }
现在,你就可以通过浏览器来访问你的MRTG RRD曲线了:
http://ip/cgi-bin/mrtg/mrtg-rrd.cgi
一旦安装上去,RRDtool的操作对MRTG来说就是透明的了。你要记得当你添加新的MRTG配置时也要添加RRD的声明,添加配置文件到CGI脚本中。我们的服务器终于可以喘口气了^-^.
11/ 疑难解答
这个有关MRTG高级应用的疑难解答与我们在第22章的有些类似。
1.确认目标设备的IP和community串
2.确认你能对目标设备进行 SNMP walk。如果不能,修改目标设备上的访问控制或防火墙规则,它们可能阻碍SNMP经过。
3.确认你能够在你的MRTG配置文件中使用 snmpget来获得特定OID的值。
4.检查MRTG参数来确认它们都是正确的。如果 Guage值被定义成相反的 countervice,那么会使你的曲线经常变成0值。如果你的参数设置为位,那曲线的结果可能是你期望的8倍。
5.在RRDtool初始化的整合里面有一些错误。
下面的消息显示在MRTG配置文件里CGI脚本不正确
Error: Cannot open config file: No such file or directory
“权限禁止”通常是由于权限或SELinuxcontexts不正确而导致的。
Error: RRDs::graph failed, opening '/var/mrtg/localhost_192.168.1.100.rrd': Permission denied
/var/log/httpd/errorlog中“文件或目录不存在”的错误可能是MRTG的 IconDir配置不正确所致。
[Wed Jan 04 15:42:13 2006] [error] [client 192.168.1.102] File does not exist: /var/www/html/var,
referer: http://bigboy/cgi-bin/mrtg/mrtg-rrd.cgi/ 
[Wed Jan 04 15:45:46 2006] [error] [client 192.168.1.102] script not found or unable to stat:
 /var/www/cgi-bin/mrtg/mrtg-l.png, referer: http://bigboy/cgi-bin/mrtg/mrtg-rrd.cgi/
这些快捷的步骤在多数情况下是充足的了,也使你的网络更加可管理了。
12/ 总结
使用本章中的指南,你应该可以对任何类型的设备绘制多数可用的SNMP MIB的值了。MRTG是一个优秀的、灵活的监测工具,它应该被任何系统管理员考虑作为服务器管理计划的一部分。