강좌

HOME > 강좌 >
강좌| 리눅스 및 오픈소스에 관련된 강좌를 보실 수 있습니다.
 
SNMP를 이용한 MRTG
조회 : 4,689  


MRTG 2
이전에 mrtg를 설치하고 이를 이용해 network traffic만을 모니터링하는 예를 들었다.
이번엔 앞서 다룬 snmp와 mrtg를 결합해서 시스템모니터링까지 할 수 있는 방법을 설명한다.
다음번엔 snmp, mrtg, netsaint를 이용한 좀더 진보적고 통합적인 모니터링(?)을 다루려한다.

일단 MRTG의 설치와 네트웍 모니터링과 SNMP의 설치는 이전에 설명한 부분을 참조하라.
지금부터는 이같은 상황이 다 갖춰졌다고 생각하고 설명하겠다.

mrtg만을 설치하면 기본적으로 네트웍트래픽만을 파악할 수 있다.
물론 snmp(정확하게 말하면 snmp agent)가 실행된 상태여야 한다.
네트웍 트래픽은 mrtg설치시 기본적으로 쉽게 할 수 있고, 이전에 설명했다.

시스템자원(CPU, 메모리, 디스크, 프로세스...)를 모니터링하려면 snmp의 mib를 이용해 할 수도 있고,
스크립트로 할 수도 있다.

일단 mrtg.cfg를 보자
이것은 실제 dbakorea사이트에서 적용되고 있고, mrtg.dbakorea.pe.kr에서 볼 수 있다.

[dbakorea@ns cfg]$ cat mrtg.cfg
# Created by 
# /usr/local/mrtg/bin/cfgmaker --global 'WorkDir: /webhosting/mrtg/' --global 'Language: korean' --global
 'Options[_]: bits,growright' --output /webhosting/mrtg/mrtg.cfg public@dbakorea.pe.kr

WorkDir: /webhosting/mrtg/
Language: korean
Options[_]: bits,growright

######################################################################
# System: ns.dbakorea.pe.kr
# Description: Linux ns.dbakorea.pe.kr 2.4.4 #2 Wed May 2 11:52:31 KST 2001 i586
# Contact: "kang myung gyu, kang@dbakorea.pe.kr"
# Location: "Seoul Korea"
######################################################################


### Interface 2 >> Descr: 'eth0' | Name: '' | Ip: '211.104.51.102' | Eth: '00-50-bf-4d-51-ec' ###

Target[dbakorea.pe.kr_2]: 2:public@dbakorea.pe.kr:
SetEnv[dbakorea.pe.kr_2]: MRTG_INT_IP="211.104.51.102" MRTG_INT_DESCR="eth0"
MaxBytes[dbakorea.pe.kr_2]: 1250000
Title[dbakorea.pe.kr_2]: DBAKOREA 트래픽분석
PageTop[dbakorea.pe.kr_2]: <H1>DBAKOREA 트래픽분석</H1>
 <TABLE>
   <TR><TD>System:</TD>     <TD>ns.dbakorea.pe.kr in "Seoul Korea"</TD></TR>
   <TR><TD>Maintainer:</TD> <TD>"kang myung gyu, kang@dbakorea.pe.kr"</TD></TR>
   <TR><TD>Description:</TD><TD>eth0  </TD></TR>
   <TR><TD>ifType:</TD>     <TD>ethernetCsmacd (6)</TD></TR>
   <TR><TD>ifName:</TD>     <TD></TD></TR>
   <TR><TD>Max Speed:</TD>  <TD>100.0 Mbits/s</TD></TR>
   <TR><TD>Ip:</TD>         <TD>211.104.51.102 (ns.dbakorea.pe.kr)</TD></TR>
 </TABLE>
 

이 부분은 ucd-snmp의 MIB값을 로드하는 역활을 한다.
ucd-snmp는 private트리의 하위에 있으므로 ucd-snmp에만 적용되는 mib값을 사용한다.
다른 snmp프로그램을 사용한다면 mib가 다르므로 무용지물(-_-)이다.

LoadMIBs: /usr/local/share/snmp/mibs/UCD-SNMP-MIB.txt


oid를 알파벳으로 설정하면 안되는 경우가 있어서, 숫자oid를 사용했다.
snmp application에 대한 내용도 주석으로 같이 실었으니 좀만 보면 어떻게 되는 것인지
쉽게 파악할 수 있을 것이다. CPU로드는 보통 user, system, idle로 구성된다.
idle의 경우, user, system을 제외한 것이므로 같이 표시할 필요가 없다.
참고로, user는 사용자 프로그램의 cpu사용률이라고 보면 되고, system은 kernel이 사용한 cpu사용률
이라고 보면 되겠다.

##############################################################
##  CPU LOAD0
###############################################################  
# [kang@ns mrtg]$ snmpwalk localhost private systemStats
# enterprises.ucdavis.systemStats.ssIndex.0 = 1
# enterprises.ucdavis.systemStats.ssErrorName.0 = systemStats
# enterprises.ucdavis.systemStats.ssSwapIn.0 = 0
# enterprises.ucdavis.systemStats.ssSwapOut.0 = 0
# enterprises.ucdavis.systemStats.ssIOSent.0 = 2
# enterprises.ucdavis.systemStats.ssIOReceive.0 = 1
# enterprises.ucdavis.systemStats.ssSysInterrupts.0 = 108
# enterprises.ucdavis.systemStats.ssSysContext.0 = 11
# enterprises.ucdavis.systemStats.ssCpuUser.0 = 2
# enterprises.ucdavis.systemStats.ssCpuSystem.0 = 0
# enterprises.ucdavis.systemStats.ssCpuIdle.0 = 96
# enterprises.ucdavis.systemStats.ssCpuRawUser.0 = Counter32: 810246
# enterprises.ucdavis.systemStats.ssCpuRawNice.0 = Counter32: 0
# enterprises.ucdavis.systemStats.ssCpuRawSystem.0 = Counter32: 90483
# enterprises.ucdavis.systemStats.ssCpuRawIdle.0 = Counter32: 27684033
# [kang@ns mrtg]$ snmpwalk -On localhost private systemStats      
# .1.3.6.1.4.1.2021.11.1.0 = 1
# .1.3.6.1.4.1.2021.11.2.0 = systemStats
# .1.3.6.1.4.1.2021.11.3.0 = 0
# .1.3.6.1.4.1.2021.11.4.0 = 0
# .1.3.6.1.4.1.2021.11.5.0 = 2
# .1.3.6.1.4.1.2021.11.6.0 = 1
# .1.3.6.1.4.1.2021.11.7.0 = 108
# .1.3.6.1.4.1.2021.11.8.0 = 11
# .1.3.6.1.4.1.2021.11.9.0 = 2
# .1.3.6.1.4.1.2021.11.10.0 = 0
# .1.3.6.1.4.1.2021.11.11.0 = 96
# .1.3.6.1.4.1.2021.11.50.0 = Counter32: 810285
# .1.3.6.1.4.1.2021.11.51.0 = Counter32: 0
# .1.3.6.1.4.1.2021.11.52.0 = Counter32: 90493
# .1.3.6.1.4.1.2021.11.53.0 = Counter32: 27684863

Target[usrsys]:.1.3.6.1.4.1.2021.11.50.0&.1.3.6.1.4.1.2021.11.52.0:public@dbakorea.pe.kr
MaxBytes[usrsys]: 100
Title[usrsys]: CPU LOAD
Unscaled[usrsys]: ymwd
ShortLegend[usrsys]: %
YLegend[usrsys]: CPU Utilization
Legend1[usrsys]: User CPU in % (Load)
Legend2[usrsys]: System CPU in % (Load)
Legend3[usrsys]:
Legend4[usrsys]:
LegendI[usrsys]:  User
LegendO[usrsys]:  System 
Options[usrsys]: growright,nopercent
PageTop[usrsys]: <H1>CPU (user and system) Load %</H1>
   <TABLE>
   <TR><TD>CPU: </TD><TD>Intel pentium 200</TD></TR>
   </TABLE>


별다른 설명이 필요없겠다.
위와 마찬가지로 ucd-snmp agent에게 질의하여 모니터링한다.

##############################################################
##  DISK LOAD0
###############################################################  
# [kang@ns kang]$ snmpwalk localhost private dskEntry
# enterprises.ucdavis.dskTable.dskEntry.dskIndex.1 = 1
# enterprises.ucdavis.dskTable.dskEntry.dskPath.1 = /
# enterprises.ucdavis.dskTable.dskEntry.dskDevice.1 = /dev/hda2
# enterprises.ucdavis.dskTable.dskEntry.dskMinimum.1 = 10000
# enterprises.ucdavis.dskTable.dskEntry.dskMinPercent.1 = -1
# enterprises.ucdavis.dskTable.dskEntry.dskTotal.1 = 3935526
# enterprises.ucdavis.dskTable.dskEntry.dskAvail.1 = 2223270
# enterprises.ucdavis.dskTable.dskEntry.dskUsed.1 = 1508633
# enterprises.ucdavis.dskTable.dskEntry.dskPercent.1 = 40
# enterprises.ucdavis.dskTable.dskEntry.dskPercentNode.1 = 8
# enterprises.ucdavis.dskTable.dskEntry.dskErrorFlag.1 = 0
# enterprises.ucdavis.dskTable.dskEntry.dskErrorMsg.1 = 
# [kang@ns kang]$ snmpwalk -On localhost private dskEntry
# .1.3.6.1.4.1.2021.9.1.1.1 = 1
# .1.3.6.1.4.1.2021.9.1.2.1 = /
# .1.3.6.1.4.1.2021.9.1.3.1 = /dev/hda2
# .1.3.6.1.4.1.2021.9.1.4.1 = 10000
# .1.3.6.1.4.1.2021.9.1.5.1 = -1
# .1.3.6.1.4.1.2021.9.1.6.1 = 3935526
# .1.3.6.1.4.1.2021.9.1.7.1 = 2223270
# .1.3.6.1.4.1.2021.9.1.8.1 = 1508633
# .1.3.6.1.4.1.2021.9.1.9.1 = 40
# .1.3.6.1.4.1.2021.9.1.10.1 = 8
# .1.3.6.1.4.1.2021.9.1.100.1 = 0
# .1.3.6.1.4.1.2021.9.1.101.1 = 

# Target[root]:.1.3.6.1.4.1.2021.9.1.9.1&.1.3.6.1.4.1.2021.11.53.0:public@dbakorea.pe.kr
# MaxBytes[root]: 100
# Title[root]: DISK USAGE
# Unscaled[root]: ymwd
# ShortLegend[root]: %
# YLegend[root]: DISK Utilization
# Legend1[root]: / in % (Load)
# Legend2[root]: CPU Idle %
# Legend3[root]:
# Legend4[root]:
# LegendI[root]:  usage
# LegendO[root]:  CPU IDLE
# Options[root]: growright,gauge,nopercent
# PageTop[root]: <H1>DISK SPACE Usage</H1>
#    <TABLE>
#    <TR><TD>디스크용량: </TD><TD>4.3GB</TD></TR>
#    </TABLE>

Target[disk]:.1.3.6.1.4.1.2021.9.1.6.1&.1.3.6.1.4.1.2021.9.1.8.1:public@dbakorea.pe.kr
MaxBytes[disk]: 4300000
Title[disk]: DISK USAGE
PageTop[disk]: <H1>DISK USAGE</H1>
ShortLegend[disk]: B
kMG[disk]: k,M,G,T,P
kilo[disk]: 1024
YLegend[disk]: DISK / Utilization
Legend1[disk]: Root disk size
Legend2[disk]: Root disk usage
Legend3[disk]:
Legend4[disk]:
LegendI[disk]:  Root disk size
LegendO[disk]:  Root disk usage
Options[disk]: growright,gauge,nopercent


메모리의 경우, snmp로 질의하는 것이 좀 까다로워서 그냥 스크립트로 해버렸다.
밑에 나오는 mem_monitor.sh의 내용은 다음과 같다. 좀 보기가 좋지 않아 수정하려고 생각중이다.
#/bin/sh
grep ^Mem: /proc/meminfo|awk '{print $2"
"$3}' 

##############################################################
##  MEMORY LOAD
###############################################################  
# [kang@ns cfg]$ grep ^Mem: /proc/meminfo|awk '{print $2"
"$3"
"}' 
# 63811584
# 56545280
Target[memory]: `/webhosting/mrtg/cfg/mem_monitor.sh`
MaxBytes[memory]: 67108864
Title[memory]: MEMORY USAGE
kilo[memory]: 1024
Options[memory]: growright,gauge,nopercent
YLegend[memory]: Memory Usage
LegendI[memory]: Total:
LegendO[memory]: Use:
Legend1[memory]: Total Memory Size
Legend2[memory]: Using Memory Size
ShortLegend[memory]: B
PageTop[memory]: <H1>MEMORY USAGE</H1>


마찬가지로 스크립트로 모니터링을 한다.
[mrtg@ns cfg]$ cat http_count.sh 
#!/bin/sh
a=`ps auxw | grep http | grep -v grep | wc -l`
b=`netstat -an | grep :80 | grep -v "0.0.0.0" | wc -l` 

echo $a
echo $b

##############################################################
##  httpd daemon & httpd session
###############################################################  
Target[http]: `/webhosting/mrtg/cfg/http_count.sh`
WithPeak[http]: my
MaxBytes[http]: 100
Title[http]: httpd daemon & httpd session
Options[http]: gauge,integer,nopercent,growright
YLegend[http]: Number?
LegendI[http]: httpd daemon:
LegendO[http]: httpd session:
Legend1[http]: Number of httpd
Legend2[http]: Number of session
Legend3[http]: 5 Min Max Number of httpd
Legend4[http]: 5 Min Max Number of httpd session
ShortLegend[http]: 개
PageTop[http]: <H1>httpd daemon & session</H1>


역시 스크립트
[mrtg@ns cfg]$ cat mysql_count.sh 
#!/bin/sh
a=`ps auxw | grep mysqld | grep -v grep | wc -l`
b=`netstat -an | grep mysql.sock | wc -l`

echo $a
echo $b

##############################################################
##  MySQL
###############################################################  
Target[mysql]: `/webhosting/mrtg/cfg//mysql_count.sh`
WithPeak[mysql]: my
MaxBytes[mysql]: 100
Title[mysql]: mysql daemon & mysql session
Options[mysql]: gauge,integer,nopercent,growright
YLegend[mysql]: Number?
LegendI[mysql]: mysql daemon:
LegendO[mysql]: mysql session:
Legend1[mysql]: Number of mysql
Legend2[mysql]: Number of session
Legend3[mysql]: 5 Min Max Number of mysql
Legend4[mysql]: 5 Min Max Number of mysql session
ShortLegend[mysql]: 개
PageTop[mysql]: <H1>mysql daemon & session</H1>

설정하고 잘못되면 다시 mrtg.cfg수정하고를 반복하다보니 귀찮아져서
스크립트를 하나 만들었다. 이건 본인이 참조하는 거니까 다른 사람들은 알 필요 없겠다. ^^
[mrtg@ns cfg]$ cat run.sh 
#!/bin/sh
# ls |grep -v -e 'mrtg' -e 'run' | rm -f
#/usr/local/mrtg/bin/cfgmaker 
#--global 'WorkDir: /webhosting/mrtg/' 
#--global 'Language: korean' 
#--global 'Options[_]: bits,growright' 
#--output /webhosting/mrtg/mrtg.cfg 
#public@dbakorea.pe.kr

/bin/rm -f /webhosting/mrtg/*

/usr/local/mrtg/bin/mrtg mrtg.cfg
/usr/local/mrtg/bin/mrtg mrtg.cfg
/usr/local/mrtg/bin/mrtg mrtg.cfg

/usr/local/mrtg/bin/indexmaker -t 'DBAKOREA' -r . -o /webhosting/mrtg/index.html /webhosting/mrtg/cfg/mrtg.cfg

cp /usr/local/mrtg/lib/mrtg2/*.png /webhosting/mrtg/


참조한 MRTG Resource Monitoring 관련링크
http://www.mrtg.co.kr/
http://net-snmp.sourceforge.net/tutorial/mrtg/
http://tunelinux.pe.kr/bbs/read.php?table=linuxinfo&no=72
http://www.wowlinux.co.kr/download/specialview.html?id=55&view=1

[원글링크] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=764


이 글을 트위터로 보내기 이 글을 페이스북으로 보내기 이 글을 미투데이로 보내기

 
강명규
홈페이지 : http://dbakorea.pe.kr/

e-mail : myunggyu골뺑이orgio.net