一、實際需求
服務器運行了lighttpd,主要為了統計當前連接數,然後cacti來畫出當前連接數的統計圖:這裡說一下有幾個方法來實現這個功能:
1、snmpget直接取值,經常發生取值不准確的問題:
# snmpget -c public -v 2c 127.0.0.1 .1.3.6.1.2.1.6.9.0
TCP-MIB::tcpCurrEstab.0 = Gauge32: 0
2、用snmp抓取所有鏈接後統計行數,雖然信息比較准確,但效率低下,如果監控點超過千台,那幾乎數據都是timeout收場:
# snmpget -c public -v 2c 127.0.0.1 .1.3.6.1.2.1.6.13.1.3 |wc -l
725
3、在本機上寫腳本統計後用snmp發送信息,cacti收集後畫圖,具體方法;
二、解決方案
snmp提供了發送自定義信息的功能。查看snmpd.conf會看到有一個小節是關於外部腳本的,Executables/scripts。這個小節裡面也舉了例子,告訴你怎麼通過snmp發送信息。
在snmpd.conf任意位置添加一行:
exec .1.3.6.1.4.1.2021.18 tcpCurrEstab /etc/tcpconn.sh
其中tcpCurrEstab是命令的名稱,後面是命令以及參數。命令的名稱可以隨便起。腳本執行的結果類似下面:
# /etc/tcpconn.sh
80
腳本內容如下:
$ cat tcpconn.sh
#!/bin/sh
conn=`netstat -s -t | grep connections\ established |awk '{print $1}'`
echo $conn
重啟snmpd,然後遠程通過snmpwalk接收一下數據看看:
# snmpwalk -c public -v 2c 127.0.0.1 .1.3.6.1.4.1.2021.18
UCD-SNMP-MIB::ucdavis.18.1.1 = INTEGER: 1
UCD-SNMP-MIB::ucdavis.18.2.1 = STRING: "tcpCurrEstab"
UCD-SNMP-MIB::ucdavis.18.3.1 = STRING: "/etc/tcpconn_total.sh"
UCD-SNMP-MIB::ucdavis.18.100.1 = INTEGER: 0
UCD-SNMP-MIB::ucdavis.18.101.1 = STRING: "488"
UCD-SNMP-MIB::ucdavis.18.102.1 = INTEGER: 0
UCD-SNMP-MIB::ucdavis.18.103.1 = ""
其中我們需要的是UCD-SNMP-MIB::ucdavis.18.101.1 = STRING: “488″這一行:
# snmpwalk -v 1 192.168.1.201 -c public .1.3.6.1.4.1.2021.18.101.1
UCD-SNMP-MIB::ucdavis.18.101.1 = STRING: "488"
能采集到數據之後,就可以配置cacti來接收了。在cacti界面中console->Templates->Data Templates,然後點擊右上角的Add,Data Templates中的name是給這個數據模板的命名,Data Source中的name將來顯示在Data Sources中,我這裡添加“|host_description| - Tcp Conn. - ESTBLISHED”,選get snmp data,Internal Data Source Name也可以隨便添,這個用來給rrd文件命名。設置完後就可以save了,save之後會發現下面多了一些選項,在最下面那個添上我們需要的數據的 OID“.1.3.6.1.4.1.2021.18.101.1”,可以保存了。
此後需要創建一個Graph Templates,好讓cacti生成圖片。在cacti界面中console->Templates->Graph Templates,然後點擊右上角的Add,Templates中的name是給這個數據模板的命名,Graph Template中的name是將來顯示在圖片上面中間的內容,我這裡添加“|host_description| - Tcp Conn. - ESTBLISHED”,其他保持默認,保存之後上面會出來一些選項。
在Graph Template Items中添加一個item,Data Source選之前添加的,color選擇一個圖片的顏色,Graph Item Type選AREA,也就是區域,也可以選其他的線條,Text Format設置說明。然後再添加一個,Graph Item Type選GPRINT,Consolidation Function選LAST,也就是當前的值,Text Format輸入current。你還可以添加一些Graph Item Type為COMMENT的注釋說明等。
現在只要為host添加這個畫圖模板就可以看到畫出來的圖了。
附:CUP使用率腳本
#!/bin/sh
idle=`sar -u 1 3 | grep Average | awk '{print $8}'`
used=`echo "100 - $idle" | bc -l -s`
echo $used
echo $idle
內存使用率腳本
#!/bin/sh
used=`/usr/bin/free -m | grep Mem |awk '{print $3}'`
total=`/usr/bin/free -m | grep Mem |awk '{print $2}'`
echo $used
echo $total
轉自:http://www.hiadmin.com/cacti%E8%BF%9B%E9%98%B6%E5%BC%95%E7%94%A8%E4%BA%8C%EF%BC%9A%E4%BD%BF%E7%94%A8cacti%E8%8E%B7%E5%8F%96snmp%E5%8F%91%E9%80%81%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89%E4%BF%A1%E6%81%AF%E5%90%8E%E4%BD%9C/
獲取 squid 內存緩存命中率為例。
在 /etc/snmp/snmpd.conf 可以看到這樣的樣例:
# exec .1.3.6.1.4.1.2021.50 shelltest /bin/sh /tmp/shtest
可以使用自己編寫的腳本,比如:
exec .1.3.6.1.4.1.2021.50 squidmemhits /usr/local/bin/squidmemhits.sh
vi /usr/local/bin/squidmemhits.sh
#!/bin/sh
PATH=$PATH:/usr/local/squid/bin
export PATH
squidclient -t 1 -h localhost -p 3128 mgr:info | grep "Memory hits" | cut -d "%" -f 2 | awk '{print $5}'
squidclient -t 1 -h localhost -p 3128 mgr:info | grep "Memory hits" | cut -d "%" -f 3 | awk '{print $3}'
/etc/init.d/snmpd restart
檢查一下能否讀取到數據:
snmpwalk -v 2c 192.168.0.200 -c public .1.3.6.1.4.1.2021.50
UCD-SNMP-MIB::ucdavis.50.1.1 = INTEGER: 1
UCD-SNMP-MIB::ucdavis.50.2.1 = STRING: "squidmemhits"
UCD-SNMP-MIB::ucdavis.50.3.1 = STRING: "/usr/local/bin/squidmemhits.sh"