linux中 snmp及rrdtool和cacti安装及使用

    1. SNMP定义:

    简单网络管理协议(SNMP),由一组网络管理的标准组成,包含一个

    应用层协议(application layer protocol)、数据库模型(database schema)和一组资源对象。该协议能够支持网络管理系统,用以监测连接到网络上的设备是否有任何引起管理上关注的情况。该协议是互联网工程工作小组(IETF,Internet Engineering Task Force)定义的internet协议簇的一部分。SNMP的目标是管理互联网Internet上众多厂家生产的软硬件平台,因此SNMP受Internet标准网络管理框架的影响也很大。SNMP已经出到第三个版本的协议,其功能较以前已经大大地加强和改进了。

     

    来自 <http://baike.baidu.com/link?url=_C1yxxY6y_K0JdGLn1fmdW2Ynb98jvlCIpEmfj0qDAynwa66I62O3k4DOUFCEV7Jrpk30JMf2WOfzGmLnpnAtK>

    来自百度百科。

    1. SNMP版本:

    V1:三种模式:1ro 只读模式 2RW 读写模式 3trap模式 agent主动通知NMS

    V2:认证加强,采用community-string-based也称为V2C

    V3:认证更加加强,数据传输使用加密方式。

    1. SNMP监控对象:

    MIB库里面定义被监控的对象,OID采用树形结构来定义:其中1.3.6.1是用来定义internet的。1.3.6.1.2.1mib-2 的标准库,里面包含了system,interface,at(address translation),ip,icmp,tcp,udp,egp等相关的信息定义,在linux中就可以直接使用,不用再去定义和实现。只谈internet时候:{1.3.6.1.2.1}等同于{internet(1).2.1} 也就是mib-2

    clip_image001

    1. SNMP报文总计有5类:
      1. get OID:获取某个OID对应的值。
      2. get next:子节点上所有信息(只能在末端的上层使用)
      3. getbulk v2或者V3)获取从某个OID开始,之下的OID对应的值。
      4. set 设置某个OID的值
      5. get response
    2. centos下开启snmp管理和代理的功能。

    LINUX下提供SNMP功能的主要是两个包:net-snmpagent)是snmp的代理实现,net-snmp-utils(NMS-comand) 管理端命令行。

    我们在测试的情况下本机即作为代理,又作为管理端,所以两个软件都装。直接利用yum install net-snmp net-snmp-utils -y

    然后进行配置。net-snmp的配置文件在/etc/snmp/snmp.conf/etc/snmp/smtptrap.conf两个配置文件

    我们先来配置/etc/snmp/snmp.conf

    先定义密码,community就是指密码,source定义访问源,可以定义为其他的网络,sec.name就是指密码的名称,后面会用到。

    下面的组配置 groupname就是组名称 sercuitymodel指加密版本v1还是v2csercurityname就是定义这个组使用哪个密码配置。

    接着定义可以查看的MIB的选项,name对此view定义一个别名组,后面的授权访问会用到。subtree就是使用MIBOID

    access定义了访问选项 group定义了访问的组,ace.model指访问版本,read 是指哪些MIB是允许读取的,write是指哪些MIB是允许写入数据的。notif哪些是运行主动通知的。

    clip_image002

    这里定义了communitypublic的密码可以访问.1.3.6.1.2.1.1 根据上图就是可以查看系统相关信息,以及.1.3.6.1.2.1.6tcp的相关信息

    1. 验证和使用snmp的相关信息
      1. 上面的默认配置我们先不进行改动,可以使用net-snmpnet-snmp-utils 来进行验证。先开启snmpd的服务

    service snmpd start

    然后分别查看系统和网络的相关信息

    查看系统相关的:snmpwalk -v 2c -c public 192.168.8.21 system

    查看TCP相关的:[root@rs1 snmp]# snmpwalk -v 2c -c public 192.168.8.21 tcp

    也可以使用:[root@rs1 snmp]# snmpwalk -v 2c -c public 192.168.8.21 查看所有的SNMP信息。

    [root@rs1 snmp]# snmpwalk -v 2c -c public 192.168.8.21 system

    SNMPv2-MIB::sysDescr.0 = STRING: Linux rs1.loony 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64

    SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10

    DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (51348017) 5 days, 22:38:00.17

    SNMPv2-MIB::sysContact.0 = STRING: Root <root@localhost> (configure /etc/snmp/snmp.local.conf)

    SNMPv2-MIB::sysName.0 = STRING: rs1.loony

    SNMPv2-MIB::sysLocation.0 = STRING: Unknown (edit /etc/snmp/snmpd.conf)

    SNMPv2-MIB::sysORLastChange.0 = Timeticks: (13) 0:00:00.13

    SNMPv2-MIB::sysORID.1 = OID: SNMP-MPD-MIB::snmpMPDMIBObjects.3.1.1

    SNMPv2-MIB::sysORID.2 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance

    SNMPv2-MIB::sysORID.3 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance

    SNMPv2-MIB::sysORID.4 = OID: SNMPv2-MIB::snmpMIB

    SNMPv2-MIB::sysORID.5 = OID: TCP-MIB::tcpMIB

    SNMPv2-MIB::sysORID.6 = OID: IP-MIB::ip

    SNMPv2-MIB::sysORID.7 = OID: UDP-MIB::udpMIB

    SNMPv2-MIB::sysORID.8 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup

    SNMPv2-MIB::sysORDescr.1 = STRING: The MIB for Message Processing and Dispatching.

    SNMPv2-MIB::sysORDescr.2 = STRING: The MIB for Message Processing and Dispatching.

    SNMPv2-MIB::sysORDescr.3 = STRING: The SNMP Management Architecture MIB.

    SNMPv2-MIB::sysORDescr.4 = STRING: The MIB module for SNMPv2 entities

    SNMPv2-MIB::sysORDescr.5 = STRING: The MIB module for managing TCP implementations

    SNMPv2-MIB::sysORDescr.6 = STRING: The MIB module for managing IP and ICMP implementations

    SNMPv2-MIB::sysORDescr.7 = STRING: The MIB module for managing UDP implementations

    SNMPv2-MIB::sysORDescr.8 = STRING: View-based Access Control Model for SNMP.

    SNMPv2-MIB::sysORUpTime.1 = Timeticks: (12) 0:00:00.12

    SNMPv2-MIB::sysORUpTime.2 = Timeticks: (12) 0:00:00.12

    SNMPv2-MIB::sysORUpTime.3 = Timeticks: (12) 0:00:00.12

    SNMPv2-MIB::sysORUpTime.4 = Timeticks: (12) 0:00:00.12

    SNMPv2-MIB::sysORUpTime.5 = Timeticks: (12) 0:00:00.12

    SNMPv2-MIB::sysORUpTime.6 = Timeticks: (12) 0:00:00.12

    SNMPv2-MIB::sysORUpTime.7 = Timeticks: (12) 0:00:00.12

    SNMPv2-MIB::sysORUpTime.8 = Timeticks: (13) 0:00:00.13

    [root@rs1 snmp]# snmpwalk -v 2c -c public 192.168.8.21 tcp

    TCP-MIB::tcpRtoAlgorithm.0 = INTEGER: other(1)

    TCP-MIB::tcpRtoMin.0 = INTEGER: 200 milliseconds

    TCP-MIB::tcpRtoMax.0 = INTEGER: 120000 milliseconds

    TCP-MIB::tcpMaxConn.0 = INTEGER: -1

    TCP-MIB::tcpActiveOpens.0 = Counter32: 6898

    TCP-MIB::tcpPassiveOpens.0 = Counter32: 5665

    TCP-MIB::tcpAttemptFails.0 = Counter32: 2800

    TCP-MIB::tcpEstabResets.0 = Counter32: 60

    TCP-MIB::tcpCurrEstab.0 = Gauge32: 3

    TCP-MIB::tcpInSegs.0 = Counter32: 1495648

    TCP-MIB::tcpOutSegs.0 = Counter32: 1499951

    TCP-MIB::tcpRetransSegs.0 = Counter32: 1847

    TCP-MIB::tcpConnState.0.0.0.0.22.0.0.0.0.0 = INTEGER: listen(2)

    TCP-MIB::tcpConnState.0.0.0.0.111.0.0.0.0.0 = INTEGER: listen(2)

    TCP-MIB::tcpConnState.0.0.0.0.11211.0.0.0.0.0 = INTEGER: listen(2)

    TCP-MIB::tcpConnState.0.0.0.0.50799.0.0.0.0.0 = INTEGER: listen(2)

    TCP-MIB::tcpConnState.127.0.0.1.25.0.0.0.0.0 = INTEGER: listen(2)

    TCP-MIB::tcpConnState.127.0.0.1.199.0.0.0.0.0 = INTEGER: listen(2)

    TCP-MIB::tcpConnState.127.0.0.1.631.0.0.0.0.0 = INTEGER: listen(2)

    TCP-MIB::tcpConnState.192.168.8.21.22.192.168.8.1.38980 = INTEGER: established(5)

    TCP-MIB::tcpConnState.192.168.8.21.22.192.168.8.1.60101 = INTEGER: established(5)

    TCP-MIB::tcpConnState.192.168.8.21.22.192.168.8.148.49217 = INTEGER: established(5)

    TCP-MIB::tcpConnLocalAddress.0.0.0.0.22.0.0.0.0.0 = IpAddress: 0.0.0.0

    TCP-MIB::tcpConnLocalAddress.0.0.0.0.111.0.0.0.0.0 = IpAddress: 0.0.0.0

    TCP-MIB::tcpConnLocalAddress.0.0.0.0.11211.0.0.0.0.0 = IpAddress: 0.0.0.0

    TCP-MIB::tcpConnLocalAddress.0.0.0.0.50799.0.0.0.0.0 = IpAddress: 0.0.0.0

    TCP-MIB::tcpConnLocalAddress.127.0.0.1.25.0.0.0.0.0 = IpAddress: 127.0.0.1

    TCP-MIB::tcpConnLocalAddress.127.0.0.1.199.0.0.0.0.0 = IpAddress: 127.0.0.1

    TCP-MIB::tcpConnLocalAddress.127.0.0.1.631.0.0.0.0.0 = IpAddress: 127.0.0.1

    TCP-MIB::tcpConnLocalAddress.192.168.8.21.22.192.168.8.1.38980 = IpAddress: 192.168.8.21

    TCP-MIB::tcpConnLocalAddress.192.168.8.21.22.192.168.8.1.60101 = IpAddress: 192.168.8.21

    TCP-MIB::tcpConnLocalAddress.192.168.8.21.22.192.168.8.148.49217 = IpAddress: 192.168.8.21

    TCP-MIB::tcpConnLocalPort.0.0.0.0.22.0.0.0.0.0 = INTEGER: 22

    TCP-MIB::tcpConnLocalPort.0.0.0.0.111.0.0.0.0.0 = INTEGER: 111

    TCP-MIB::tcpConnLocalPort.0.0.0.0.11211.0.0.0.0.0 = INTEGER: 11211

    TCP-MIB::tcpConnLocalPort.0.0.0.0.50799.0.0.0.0.0 = INTEGER: 50799

    TCP-MIB::tcpConnLocalPort.127.0.0.1.25.0.0.0.0.0 = INTEGER: 25

    TCP-MIB::tcpConnLocalPort.127.0.0.1.199.0.0.0.0.0 = INTEGER: 199

    TCP-MIB::tcpConnLocalPort.127.0.0.1.631.0.0.0.0.0 = INTEGER: 631

    TCP-MIB::tcpConnLocalPort.192.168.8.21.22.192.168.8.1.38980 = INTEGER: 22

    TCP-MIB::tcpConnLocalPort.192.168.8.21.22.192.168.8.1.60101 = INTEGER: 22

    TCP-MIB::tcpConnLocalPort.192.168.8.21.22.192.168.8.148.49217 = INTEGER: 22

    TCP-MIB::tcpConnRemAddress.0.0.0.0.22.0.0.0.0.0 = IpAddress: 0.0.0.0

    TCP-MIB::tcpConnRemAddress.0.0.0.0.111.0.0.0.0.0 = IpAddress: 0.0.0.0

    TCP-MIB::tcpConnRemAddress.0.0.0.0.11211.0.0.0.0.0 = IpAddress: 0.0.0.0

    TCP-MIB::tcpConnRemAddress.0.0.0.0.50799.0.0.0.0.0 = IpAddress: 0.0.0.0

    TCP-MIB::tcpConnRemAddress.127.0.0.1.25.0.0.0.0.0 = IpAddress: 0.0.0.0

    TCP-MIB::tcpConnRemAddress.127.0.0.1.199.0.0.0.0.0 = IpAddress: 0.0.0.0

    TCP-MIB::tcpConnRemAddress.127.0.0.1.631.0.0.0.0.0 = IpAddress: 0.0.0.0

    TCP-MIB::tcpConnRemAddress.192.168.8.21.22.192.168.8.1.38980 = IpAddress: 192.168.8.1

    TCP-MIB::tcpConnRemAddress.192.168.8.21.22.192.168.8.1.60101 = IpAddress: 192.168.8.1

    TCP-MIB::tcpConnRemAddress.192.168.8.21.22.192.168.8.148.49217 = IpAddress: 192.168.8.148

    TCP-MIB::tcpConnRemPort.0.0.0.0.22.0.0.0.0.0 = INTEGER: 0

    TCP-MIB::tcpConnRemPort.0.0.0.0.111.0.0.0.0.0 = INTEGER: 0

    TCP-MIB::tcpConnRemPort.0.0.0.0.11211.0.0.0.0.0 = INTEGER: 0

    TCP-MIB::tcpConnRemPort.0.0.0.0.50799.0.0.0.0.0 = INTEGER: 0

    TCP-MIB::tcpConnRemPort.127.0.0.1.25.0.0.0.0.0 = INTEGER: 0

    TCP-MIB::tcpConnRemPort.127.0.0.1.199.0.0.0.0.0 = INTEGER: 0

    TCP-MIB::tcpConnRemPort.127.0.0.1.631.0.0.0.0.0 = INTEGER: 0

    TCP-MIB::tcpConnRemPort.192.168.8.21.22.192.168.8.1.38980 = INTEGER: 38980

    TCP-MIB::tcpConnRemPort.192.168.8.21.22.192.168.8.1.60101 = INTEGER: 60101

    TCP-MIB::tcpConnRemPort.192.168.8.21.22.192.168.8.148.49217 = INTEGER: 49217

    TCP-MIB::tcpInErrs.0 = Counter32: 0

    TCP-MIB::tcpOutRsts.0 = Counter32: 3028

    TCP-MIB::tcpConnectionState.ipv4."192.168.8.21".22.ipv4."192.168.8.1".38980 = INTEGER: established(5)

    TCP-MIB::tcpConnectionState.ipv4."192.168.8.21".22.ipv4."192.168.8.1".60101 = INTEGER: established(5)

    TCP-MIB::tcpConnectionState.ipv4."192.168.8.21".22.ipv4."192.168.8.148".49217 = INTEGER: established(5)

    TCP-MIB::tcpConnectionProcess.ipv4."192.168.8.21".22.ipv4."192.168.8.1".38980 = Gauge32: 7794

    TCP-MIB::tcpConnectionProcess.ipv4."192.168.8.21".22.ipv4."192.168.8.1".60101 = Gauge32: 7658

    TCP-MIB::tcpConnectionProcess.ipv4."192.168.8.21".22.ipv4."192.168.8.148".49217 = Gauge32: 47690

    TCP-MIB::tcpListenerProcess.ipv4."0.0.0.0".22 = Gauge32: 1662

    TCP-MIB::tcpListenerProcess.ipv4."0.0.0.0".111 = Gauge32: 1311

    TCP-MIB::tcpListenerProcess.ipv4."0.0.0.0".11211 = Gauge32: 54954

    TCP-MIB::tcpListenerProcess.ipv4."0.0.0.0".50799 = Gauge32: 1398

    TCP-MIB::tcpListenerProcess.ipv4."127.0.0.1".25 = Gauge32: 1746

    TCP-MIB::tcpListenerProcess.ipv4."127.0.0.1".199 = Gauge32: 12021

    TCP-MIB::tcpListenerProcess.ipv4."127.0.0.1".631 = Gauge32: 1480

    TCP-MIB::tcpListenerProcess.ipv6."00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00".22 = Gauge32: 1662

    TCP-MIB::tcpListenerProcess.ipv6."00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00".80 = Gauge32: 58869

    TCP-MIB::tcpListenerProcess.ipv6."00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00".111 = Gauge32: 1311

    TCP-MIB::tcpListenerProcess.ipv6."00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00".3306 = Gauge32: 57764

    TCP-MIB::tcpListenerProcess.ipv6."00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00".11211 = Gauge32: 54954

    TCP-MIB::tcpListenerProcess.ipv6."00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00".53816 = Gauge32: 1398

    TCP-MIB::tcpListenerProcess.ipv6."00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:01".631 = Gauge32: 1480

    [root@rs1 snmp]#

    1. 修改配置文件,获取自己想要的相关信息。

    在监控中,我们比较关注主机的相关信息,例如内存,swap,存储,等信息,我们通过修改配置文件来获取。

    首先找到mib-2库中25代表主机。那么我们直接开启这个访问,修改

    /etc/snmp/snmpd.conf里面的view    systemview    included   .1.3.6.1.2.1.25.1.1改成:

    view    systemview    included   .1.3.6.1.2.1.25

    这样就可以通过snmpwalk来获取相关HOST的信息了。

    [root@rs1 snmp]# snmpwalk -v 2c -c public 192.168.8.21 host

    不过貌似hrsw的信息太多了,也就是软件的信息。所以要想办法过滤下。我们并不需要软件的信息。

    感觉这个过滤很麻烦,然后用上万能的百度大法(虽然我想用谷歌的)。

    查到到cpu和内存相关的如下:

    CPU及负载

     

     

     

    OID

    描述

    备注

    请求方式

    . 1.3.6.1.4.1.2021.11.9.0

    用户CPU百分比

    ssCpuUser

    GET

    . 1.3.6.1.4.1.2021.11.10.0

    系统CPU百分比

    ssCpuSystem

    GET

    . 1.3.6.1.4.1.2021.11.11.0

    空闲CPU百分比

    ssCpuIdle

    GET

    . 1.3.6.1.4.1.2021.11.50.0

    原始用户CPU使用时间

    ssCpuRawUser

    GET

    .1.3.6.1.4.1.2021.11.51.0

    原始nice占用时间

    ssCpuRawNice

    GET

    . 1.3.6.1.4.1.2021.11.52.0

    原始系统CPU使用时间

    ssCpuRawSystem.

    GET

    . 1.3.6.1.4.1.2021.11.53.0

    原始CPU空闲时间

    ssCpuRawIdle

    GET

    . 1.3.6.1.2.1.25.3.3.1.2

    CPU的当前负载,N个核就有N个负载

    hrProcessorLoad

    WALK

    . 1.3.6.1.4.1.2021.11.3.0

    ssSwapIn

    GET

     

    . 1.3.6.1.4.1.2021.11.4.0

    SsSwapOut

    GET

     

    . 1.3.6.1.4.1.2021.11.5.0

    ssIOSent

    GET

     

    . 1.3.6.1.4.1.2021.11.6.0

    ssIOReceive

    GET

     

    . 1.3.6.1.4.1.2021.11.7.0

    ssSysInterrupts

    GET

     

    . 1.3.6.1.4.1.2021.11.8.0

    ssSysContext

    GET

     

    . 1.3.6.1.4.1.2021.11.54.0

    ssCpuRawWait

    GET

     

    . 1.3.6.1.4.1.2021.11.56.0

    ssCpuRawInterrupt

    GET

     

    . 1.3.6.1.4.1.2021.11.57.0

    ssIORawSent

    GET

     

    . 1.3.6.1.4.1.2021.11.58.0

    ssIORawReceived

    GET

     

    . 1.3.6.1.4.1.2021.11.59.0

    ssRawInterrupts

    GET

     

    . 1.3.6.1.4.1.2021.11.60.0

    ssRawContexts

    GET

     

    . 1.3.6.1.4.1.2021.11.61.0

    ssCpuRawSoftIRQ

    GET

     

    . 1.3.6.1.4.1.2021.11.62.0

    ssRawSwapIn.

    GET

     

    . 1.3.6.1.4.1.2021.11.63.0

    ssRawSwapOut

    GET

     

    .1.3.6.1.4.1.2021.10.1.3.1

    Load5

    GET

     

    .1.3.6.1.4.1.2021.10.1.3.2

    Load10

    GET

     

    .1.3.6.1.4.1.2021.10.1.3.3

    Load15

    GET

     

     

    来自 <http://www.cnblogs.com/aspx-net/p/3554044.html#commentform>

     

    内存及磁盘(1.3.6.1.2.1.25

     

     

     

    OID

    描述

    备注

    请求方式

    .1.3.6.1.2.1.25.2.2.0

    获取内存大小

    hrMemorySize

    GET

    .1.3.6.1.2.1.25.2.3.1.1

    存储设备编号

    hrStorageIndex

    WALK

    .1.3.6.1.2.1.25.2.3.1.2

    存储设备类型

    hrStorageType[OID]

    WALK

    .1.3.6.1.2.1.25.2.3.1.3

    存储设备描述

    hrStorageDescr

    WALK

    .1.3.6.1.2.1.25.2.3.1.4

    簇的大小

    hrStorageAllocationUnits

    WALK

    .1.3.6.1.2.1.25.2.3.1.5

    簇的的数目

    hrStorageSize

    WALK

    .1.3.6.1.2.1.25.2.3.1.6

    使用多少,跟总容量相除就是占用率

    hrStorageUsed

    WALK

    .1.3.6.1.4.1.2021.4.3.0

    Total Swap Size(虚拟内存)

    memTotalSwap

    GET

    .1.3.6.1.4.1.2021.4.4.0

    Available Swap Space

    memAvailSwap

    GET

    .1.3.6.1.4.1.2021.4.5.0

    Total RAM in machine

    memTotalReal

    GET

    .1.3.6.1.4.1.2021.4.6.0

    Total RAM used

    memAvailReal

    GET

    .1.3.6.1.4.1.2021.4.11.0

    Total RAM Free

    memTotalFree

    GET

    .1.3.6.1.4.1.2021.4.13.0

    Total RAM Shared

    memShared

    GET

    .1.3.6.1.4.1.2021.4.14.0

    Total RAM Buffered

    memBuffer

    GET

    .1.3.6.1.4.1.2021.4.15.0

    Total Cached Memory

    memCached

    GET

    .1.3.6.1.4.1.2021.9.1.2

    Path where the disk is mounted

    dskPath

    WALK

    .1.3.6.1.4.1.2021.9.1.3

    Path of the device for the partition

    dskDevice

    WALK

    .1.3.6.1.4.1.2021.9.1.6

    Total size of the disk/partion (kBytes)

    dskTotal

    WALK

    .1.3.6.1.4.1.2021.9.1.7

    Available space on the disk

    dskAvail

    WALK

    .1.3.6.1.4.1.2021.9.1.8

    Used space on the disk

    dskUsed

    WALK

    .1.3.6.1.4.1.2021.9.1.9

    Percentage of space used on disk

    dskPercent

    WALK

    .1.3.6.1.4.1.2021.9.1.10

    Percentage of inodes used on disk

    dskPercentNode

    WALK

     

    来自 <http://www.cnblogs.com/aspx-net/p/3554044.html#commentform>

    :.1.3.6.1.4.1.2021.9.1里面的信息,必须在snmpd.conf里面进行授权

    clip_image003

    通过disk进行授权,

     

     

    看了下都是.1.3.6.1.4.1下面的相关信息,果断在/etc/snmp/snmpd.config 里面的的添加view内容

    clip_image004

    然后重启snmpdservice snmpd restart

    这样可以获取到:cpu信息如下,分别为cpu空闲,系统使用率和用户使用率。

    clip_image005

    内存相关信息:依次为:内存大小,swap总量,内存总量,内存已使用量,内存未使用量,内存Buffter量,内存cached

    clip_image006

    获取磁盘信息:上面的磁盘信息获取的有问题,继续百度.

    获取到OID的是.1.3.6.1.2.1.25.2.3.1 

    把虽有的对应的1后面的信息累加起来就是一套完整的信息了

    1

     hrstorageramPhysical memory:units=1024bytes:size=1012352

    这个就是物理内存总数1012353K

    2

    hrstoragevirtualmemory:virtual memory:units=1024bytes:size=258208

    这个就是虚拟内存总数=物理内存+swap

    10

    hrstoragevirtualmemory:swap space:units=1024bytes:size=1572856

    swap的大小1572856k
     

    31

    htsoragefixeddisk:/:units=4096:size=3356140

    /根分区的大小 3346140X4=13384560K

    35

    htsoragefixeddisk:/dev/shm:units=4096:size=126544

    /dev/shm大小为 126544X4=506176K

    36

    htsoragefixeddisk:/boot:units=1024:size=495844

    /boot分区大小为 495844X1=495844

    相应的可以看到,我们没有获取到磁盘的使用率,继续百度。

     

     

    clip_image007

     

    clip_image008

    可以看到使用的大小,那么一比较就可以知道使用率了.

    1. RRDTOOL

    参考链接:RRD简体中文教程 rrdtool学习笔记

    1. RRD的解释:rrd是指一个圆周数据库,每个数据的存储点和数据的最大值已在最初的时候被限定,每次更新的时候,将数据插入对应的槽里面即可。

    rrd中数据存储模式:先存储pdp的数据,然后再根据cf运算对pdp进行运算后,将数据存储到cdp里面去,我们画图和使用就使用cdp的数据,所以事先要定义好pdpds数据源和cfcdp的数据。

    clip_image009

     

    用法:rrdtool create filename [--start|-b start time] [--step|-s step]

                             [DS:ds-name:DST:dst arguments] 

                             [RRA:CF:cf arguments]

    其中:DS如下:

    [DS:ds-name:DST:heartbeat:min:max]

    // DS:ds-name:GAUGE | COUNTER | DERIVE | ABSOLUTE:heartbeat:min:max

    RRA如下:

    RRA:AVERAGE | MIN | MAX | LAST:xff:steps:rows

     

    参数:filename:rra的文件名,默认为.rra结尾。

    --start|-b start time:第一个记录的时间,小于这个时间的记录RRD不会记录。时间是timestamp格式。默认为当前时间的10秒后。如果你需要一天前的时间可以这么定义。-b $($date -d  '1 days ago' +%s).

    --step|-s:指步长,就是pdp里面每个槽位的时间差,默认是300S

    DS:ds-name:DST:dst arguments:DS 指明定义数据源,ds-name就是数据源的名字,DST指明数据源的类型,nts包含以下几类:1COUNTER:只记录差值,只增\GUAGE:原始值,不做更改\DERIVE:累加,可增、可减。\ABSOLUTE:相对初始值,\COMPUTE:COMPUTE 比较特殊,它并不接受输入,它的定义是一个表达式,能够引用其他DS并自动计算出某个值。例如 DS:eth0_bytes:COUNTER:600:0:U DS:eth0_bits:COMPUTE:bytes,8,* 则值eth0_bytesX8为实际存储eth0_bits的值。

     

    COUNTER/DERIVE/AVSOLVTE 虽然都是取差值,但会再除以两次间隔间的秒数。

    ,两次间隔间为300,那画出来的就是 2/300,-2/300 的值

    Values = 300, 600, 900, 1200 实际值输入值(每隔300S输入一个)

    Step = 300 seconds 刷新周期

    COUNTER DS = 1, 1, 1, 1 COUNTER定义的DS的值

    DERIVE DS = 1, 1, 1, 1 DERIVE定义的DS的值

    ABSOLUTE DS = 1, 2, 3, 4 ABSOLUTE定义的DS的值

    GAUGE DS = 300, 600, 900, 1200 GAUGE定义的DS的值

     

    来自 <http://www.cnblogs.com/frankliiu-java/articles/1663818.html>

     

    dst arguments=heartbeat:min:max,heartbeat:指槽位在多少时间内接受数据有效,min,max:最小值和最大值。

     

    RRA:定义归档的数据

    CF:pdpcdp的运算类型。

    CF三种类型:AVERAGE,MIN,MAX,LAST.依次为下面steps个槽位内pdp中数据的平均值,最小值,最大值和最后一个值。

     

    cf argumentsCF的具体参数.

    xff:steps:rows

    xff:0-1的数字,表示多少比例内的unkown可以进行正常的CF,超过后直接unkown.

    steps:多少个槽位的pdp进行cf合成一个cdp.

    rows:总共存储多少位cdpstpsXpdpstepsXrows就是总存储时间。

    1. 把上文用snmp获取到的磁盘,内存,cpu,等信息用rratool进行存储,且归档,分5分钟,15分钟和30分钟归档。
      1. 获取磁盘根分区的大小,和已使用的大小。
        1. 配置smmpd.conf,添加:view    systemview    included   .1.3.6.1.4.1.2021.9,且找到 #disk / 10000 删掉前面的#号,启用根分区的snmp信息输出。
        2. 使用snmpwalk -v 2c -c public localhost   .1.3.6.1.4.1.2021.9即可获取到跟分区的信息。
        3. clip_image010
        4. 我们获取里面的根分区大小,已使用大小.
          1. 首先创建rrd文件,数据源为根分区大小,已使用大小。5分钟,30分钟,和1个小时取最大值,最小值进行聚合计算。

    [root@rhel5-2 ~]# rrdtool create rootdisk.rra DS:total:GAUGE:600:U:U DS:used:GAUGE:600:U:U RRA:AVERAGE:0.5:1:8640 RRA:MAX:0.5:6:8640 RRA:MIN:0.5:6:8640 RRA:MAX:0.5:12:8640 RRA:MIN:0.5:12:8640

    1. 然后编写脚本,进行数据更新。

    #!/bin/bash

    Host=localhost

    Community=public

    Total=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.9 | grep Total\.1.*INTEGER.* | sed -r 's@^.*INTEGER:[[:space:]]@@g'`

    Used=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.9 | grep dskUsed\.1.*INTEGER.* | sed -r 's@^.*INTEGER:[[:space:]]@@g'`

    #echo $Total \n $Used

    /usr/bin/rrdtool update /root/rootdisk.rra N:"$Total":"$Used"

    echo N:"$Total":"$Used"

    1. 将脚本赋予执行权限,且放到定时任务中,每五分钟执行一次.

     

    1. 内存使用情况:内存大小,swap总量,内存总量,内存已使用量,内存未使用量,内存Buffter量,内存cached量。
      1. 创建rrd文件,数据源为内存大小,swap大小,内存可用大小,swap可用大小,内存buffter大小,内存cached大小
        1. [root@rhel5-2 ~]# rrdtool create mem.rra DS:memtotal:GAUGE:600:U:U DS:swaptotal:GAUGE:600:U:U DS:memfree:GAUGE:600:U:U DS:swapfree:GAUGE:600:U:U DS:buffer:GAUGE:600:U:U DS:cached:GAUGE:600:U:U RRA:AVERAGE:0.5:1:800 RRA:AVERAGE:0.5:6:2400 RRA:AVERAGE:0.5:24:1200 RRA:MAX:0.5:1:800 RRA:MAX:0.5:6:2400 RRA:MAX:0.5:24:1200 RRA:MIN:0.5:1:800 RRA:MIN:0.5:6:2400 RRA:MIN:0.5:24:1200
      2. 编写脚本,进行数据更新:

    [root@rhel5-2 ~]# cat memrraupdate.sh

    #!/bin/bash

    Host=localhost

    Community=public

    Snmpdate=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.4`

    Ramtotal=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.4 | grep memTotalReal.0 |sed -r 's@^.*INTEGER:[[:space:]]@@g' | cut -d" " -f1`

    Swaptotal=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.4 | grep TotalSwap.0 |sed -r 's@^.*INTEGER:[[:space:]]@@g' | cut -d" " -f1`

    Ramfree=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.4 | grep AvailReal.0 |sed -r 's@^.*INTEGER:[[:space:]]@@g' | cut -d" " -f1`

    Swapfree=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.4 | grep AvailSwap.0 |sed -r 's@^.*INTEGER:[[:space:]]@@g' | cut -d" " -f1`

     

     

    Buffer=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.4 | grep Buffer.0 |sed -r 's@^.*INTEGER:[[:space:]]@@g' | cut -d" " -f1`

    Cached=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.4 | grep Cached.0 |sed -r 's@^.*INTEGER:[[:space:]]@@g' | cut -d" " -f1`

    /usr/bin/rrdtool update /root/mem.rra N:"$Ramtotal":"$Swaptotal":"$Ramfree":"$Swapfree":"$Buffer":"$Cached"

    1. 将脚本放到定时运行中.每五分钟运行一次.
    1. .rra数据中获取数据:fetch

    rrdtool fetch filename CF [--resolution|-r resolution] [--start|-s start] [--end| -e end]

    其中cf的类型必须是rra中有的才行。要想读取rra中的数据,有两个条件要满足:

    1、时间范围。

    2、解析度要求。如果解析度不够,会默认输出已存在的大于给定解析度上一档的解析度。

    如果不指定--start --end -r 则默认输出reslolution最小的RRA数据。

    1. cacti安装及使用,cacti是一款基于rrdtool的绘图监控软件,可以用来监控众多的资源,并且官方论坛有很多插件可以使用,完全没必要自己写监控模板,易用性更好。更方便。
      1. 安装参考官方文档:网址:http://docs.cacti.net/manual:088:1_installation.1_install_unix 简洁说下我自己的安装,由于是在虚拟机底下操作,所以很多安全性没有兼顾。下面简单说下。

    我用的系统是Linux rhel5-2 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

    所以安装官方文档安装如下的软件包:

    clip_image011

    其中由于不使用ldap的相关的认证,所以没有安装。所有软件都是yum安装的。

    yum install -y httpd php php-mysql php-snmp php-xml mysql mysql-server net-snmp net-snmp-utils

    安装好之后就可以根据文档配置相关的环境了。

    1. 配置PHP
      1. 关闭Safe Mode,由于cacti使用外部的命令,如rrdtool,所以需要关闭Safe Mode ,/etc/php.ini里面改成safe_mode = Off
      2. 配置时区,我第一次安装的时候没有参考配置手册,时区没有改,一直无法安装成功,最后打开了php的调试模式才找到问题所在。修改如下,在中国的一般用Asia/Shanghai即可。

    ; Defines the default timezone used by the date functions

    ; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone

    date.timezone = "Asia/Shanghai"

    1. 允许上传文件,由于导入模板需要用到上传文件的功能。找到以下内容,去掉注释即可。

    file_uploads = On

    1. php其他的配置由于采用yum安装,会自动配置好,就不用配置了。如果不是采用yum安装的,还需要配置phpxml,pcre,mysql,xml的扩展参数。
    1. 配置httpd,主要有两点,第一就是httpd要能将phpphp的模块处理,还有就是cacti所在的目录能够被访问到。
      1. 由于使用yum 安装的php,那么默认就会将php的扩展给装好。php是以httpd的一个模块存在的,省去了很多配置的问题。
      2. 我们这里直接采用httpd默认的安装目录/var/www/html作为cacti的父目录,由于默认配置里面已经配置了,就可以不用配置。
      3. httpd访问可能存在防火墙或者selinux的限制,所以关闭iptablesselinux

    service iptables stop

    setenforce 0

    1. 配置snmp,上面已经讲的很清楚了。
    2. 配置mysql,将刚才装的mysql装个密码,由于mysql版本比较低,默认密码为空,如果是mysql5.5以上,默认密码会在错误日志里面。将其找到,然后进行密码修改,这里版本比较低,直接进行密码修改。

    service mysqld start

      shell> mysqladmin --user=root password somepassword

      shell> mysqladmin --user=root --password reload

     

    1. 好了,前面的准备工作做好了,正式开始安装cacti
      1. cacti的安装文件放在httpd的网页目录下我这里是/var/www/html

    然后解压缩安装文件 tar zxcf cacti*.tar.gz

    1. 创建数据库

    mysqladmin --user=root create cacti

    1. 导入数据库

    mysql -uroot -p cacti <cacti.sql

    1. 创建cactimysql数据库和密码并且给其授权

    grant all on *.cacti to "cactiuser"@"%" identified by 'cactipasswd'

    1. 配置cacti安装文件的路径和数据库密码等。

    编辑cacti目录下的include/config.php 修改下面的对应项

    $database_type = "mysql";

    $database_default = "cacti";

    $database_hostname = "localhost";

    $database_username = "cactiuser";这里就是创建mysqlcacti用户

    $database_password = "cacti";这里是创建mysql cacti用户的密码。

     

    /* load up old style plugins here */

    $plugins = array();

    //$plugins[] = 'thold';

     

    /*

       Edit this to point to the default URL of your Cacti install

       ex: if your cacti install as at http://serverip/cacti/ this

       would be set to /cacti/

    */

    $url_path = "/cacti/";这里配置cacti在主机里面的路径,这里我放在了/cacti/下,不用做更改。如果你是直接放在根下.将其改成/即可。

     

    /* Default session name - Session name must contain alpha characters */

    #$cacti_session_name = "Cacti";

    1. 配置cacti里面的文件权限,我这里将cacti的目录权限全部改成apache,这样方便一些。
    2. poller.php放进自动执行任务列表里面。(poller的用处,用来执行获取监控数据的程序,poller是单线程的任务,如果监控数量比较多,建议换成Spine )

    crontab -e里面添加如下内容:

    */5 * * * *  php /var/www/html/cacti/poller.php > /dev/null 2>&1

    注意:我这里使用的是root用户来执行poller,所以6步里面的配置cacti的文件权限对此没有影响,因为root可以写入普通用户的文件。如果你上面的文件权限设置为其他用户,这里要做相应的更改。

    还有就是频率文件,这里是5分钟运行一次poller,也就是默认300S的步长,如果监控里面的步长有更改,也同样要更改这里的计划任务时间。

    1. 启用httpd,输入127.0.0.1/cacti即可运行了。
    1. 使用cacti模板,监控对应的对象。我们这里提供两个主机,一个 windows xp ip192.168.8.13 由于windows xp是网上下的ghost版本,安装不了snmp的服务,缺少一些文件,所以用192.168.8.10,2012 r2的服务器替代。,一个centos的主机192.168.8.21,我们用cacti分别监控着两个主机的cpu利用率,内容利用率,磁盘利用率和网络情况。
      1. 先监控windowscpu利用率,内存利用率,磁盘利用率和网络利用率。监控模板和方法参考以下资料
        1. https://github.com/mrlesmithjr/cacti/
        2. http://foreveryan.blog.51cto.com/3508502/775558
        3. http://www.snmp-informant.com/downloads.htm#Freeware_Products
      2. 安装windows snmp的代理软件和 snmp-informant-standard v1.7
        1. 首先在12 r2上面添加snmp的服务器,且安装snmp-informant-ST,且配置snmpcommunity和访问权限。配置方法如下图,

    clip_image012

    且验证是否安装OK。在centos上使用snmpwalk命令进行验证:

    [root@rhel5-2 ~]# snmpwalk -v 2c -c public 192.168.8.10

    你会看到出现很多滚动的信息,就是代表安装OK了。那么继续配置cacti的相关东西。

    1. 导入cacti关于windos监控的模板
      1. 下载模板 wget https://github.com/mrlesmithjr/cacti/archive/master.zip 这个是一个git上面的对应的监控模板,好处是这个有主机模板,我也没有用过,不知道怎么样,我们来一起用下。
      2. 按照说明文档进行安装:

    将snmp_informant_standard_*.xml 放到/cacat/resource/snmp_queries,然后导入hostxml文件,再添加device就可以了。下图是画出的图像

    clip_image013

     

    clip_image014

    还有一个问题就是他网络流量里面没有写接口名称,只写了mac地址,后期需要自己一个一个对起来。

    1. 监控linux 主机的模板也一样,到网上找相应的模板,在被监控机上安装snmp,配置snmp的信息。然后利用相应的模板监控对应的资源即可。
    1. 自己利用上面的snmp获取的信息,自己写监控的模板。就以内存为例。将上面获取的内存大小,swap总量,内存总量,内存已使用量,内存未使用量,内存Buffter量,内存cached量。数据进行保存,且绘制成图片。
      1. 先进行数据查询:参考上面的代码,编写获取数据的脚本。

    #!/bin/bash

    Host=$1

    Community=$2

    #!/bin/bash

    #Host=localhost

    #Community=public

    /usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.4 > /tmp/cacit-get-mem-tmpfile.txt

    Ramtotal=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.4 | grep memTotalReal.0 |sed -r 's@^.*INTEGER:[[:space:]]@@g' | cut -d" " -f1`

    Swaptotal=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.4 | grep TotalSwap.0 |sed -r 's@^.*INTEGER:[[:space:]]@@g' | cut -d" " -f1`

    Ramfree=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.4 | grep AvailReal.0 |sed -r 's@^.*INTEGER:[[:space:]]@@g' | cut -d" " -f1`

    Swapfree=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.4 | grep AvailSwap.0 |sed -r 's@^.*INTEGER:[[:space:]]@@g' | cut -d" " -f1`

    Buffer=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.4 | grep Buffer.0 |sed -r 's@^.*INTEGER:[[:space:]]@@g' | cut -d" " -f1`

    Cached=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.4 | grep Cached.0 |sed -r 's@^.*INTEGER:[[:space:]]@@g' | cut -d" " -f1`

    echo -n "Ramtotal:$Ramtotal Ramfree:$Ramfree Swaptotal:$Swaptotal Swapfree:$Swapfree Buffer:$Buffer Cached:$Cached"

    #-n为了避免输出的时候自动换行。

    将脚本命名为cacti-mem-get.sh 然后赋予执行权限。最后丢到 cacti安装目录下的scripts目录下,更改下属组和属主权限。

    1. cacti中添加date input methods。具体的配置如下,先添加input typescript/command的类型,然后输入input string 然后配置input fileds output fields.

    inputfiles的配置。一定要注意画红框框的地方,可以用来继承hosttemplates里面的hostname 的值,这样就不用自己手动输入了。

    clip_image015

    community也是,可以用来继承主机上面的snmp_community的值。

    clip_image016

    outputfiled的设置。画红线的名字,要跟脚本输出一致。就可以了。

    clip_image017

    完整的配置如下图。

    clip_image018

    .

    1. 接着配置date templates ,date input method选刚才我们新建的那个。注意date source item中的internal data source name一定要跟脚本输出的名字一样,且跟output field一一对应,这样才不会错。

    clip_image019

    1. 然后配置graph templates : 我为这个数据源,配置了两个图形模板,一个是 ram的,一个是swap的。

    红框里面的纵轴的标签,这个根据实际的值填,由于我的脚本获取的数据的单位是kbyte , 所以我填的是kbyte .如果想进行换算,最好能在脚本里面就换算好,这样比较方便。

    1.  

     

    clip_image020

    1. 然后添加数据源,添加主机图形,就可以看到了。

    clip_image021

     

posted @ 2016-08-02 21:16  Lkad  阅读(2323)  评论(0编辑  收藏  举报