rrdtool을 이용하는 경우 5분평균,30분평균값들이 저장되는 기간을 마음대로 정해줄 수 있다. RRA에서 rows를 원하는 대로 바꾸면 된다. 5분평균 일주일 - 12 * 24 * 7 = 2016 line 30분평균 한달 - 30 * 2 * 24 * 31 = 1488 line 2시간평균 100일 - 2h * 12 * 100 = 1200 line 하루평균 2년 - 1d * 730 = 730 line
---------------------------------- DB 테이블 구조 ----------------------------------
기존의 monitor 테이블 구조와 최대한 호환되게 만든다.
기존의 monitor 테이블 구조 --------------------------
CREATE TABLE monitor ( serial int(10) unsigned NOT NULL auto_increment, csn smallint(4) unsigned zerofill NOT NULL default '0000', ssn smallint(5) unsigned zerofill, c_name varchar(25) NOT NULL default '', t_ip varchar(21) NOT NULL default '', t_community varchar(20) NOT NULL default '', t_ver int(11) unsigned NOT NULL default '1', oid1 varchar(50) NOT NULL default '', oid2 varchar(50) NOT NULL default '', bound int(11) NOT NULL default '0', center tinyint(2) NOT NULL default '0', floor tinyint(2) NOT NULL default '0', bandwidth int(11) default NULL, description varchar(128) NOT NULL default '', dgm_idx int(11) NOT NULL default '1', status tinyint(1) default NULL, UNIQUE KEY serial (serial), KEY t_community (t_community) ) TYPE=MyISAM;
rrdtool system monitor 테이블 구조 ----------------------------------
CREATE TABLE monitor ( serial int(10) unsigned NOT NULL auto_increment, csn smallint(4) unsigned zerofill NOT NULL default '0000', ssn smallint(5) unsigned zerofill default NULL, c_name varchar(25) NOT NULL default '', hostname varchar(128) default NULL, t_ip varchar(21) NOT NULL default '', t_community varchar(20) NOT NULL default '', t_ver int(11) unsigned NOT NULL default '1', oid1 varchar(50) NOT NULL default '', oid2 varchar(50) NOT NULL default '', datatype enum('Counter','Guage') NOT NULL default 'Counter', bound int(11) NOT NULL default '0', center tinyint(2) NOT NULL default '0', floor tinyint(2) NOT NULL default '0', bandwidth int(11) default NULL, description varchar(128) NOT NULL default '', ylegend varchar(32) default NULL, dgm_idx int(11) NOT NULL default '1', status tinyint(1) default NULL, UNIQUE KEY serial (serial), KEY t_community (t_community) ) TYPE=MyISAM;
c_name은 csn에서 알 수 있다. hostname은 sysName에서 알 수 있다. t_ver은 Giga NIC이 설치되어 있는 호스트가 아니라면 1 로만 해도 무방할 것이다. datatype은 oid로부터 유추할 수 있다. bound, bandwidth가 필요한가? center,floor은 ssn으로부터 알 수 있다. ylegend는 oid로부터 유추할 수 있다.
rrdtool system monitor 테이블 Draft -----------------------------------
CREATE TABLE monitor ( serial int(10) unsigned NOT NULL auto_increment, csn smallint(4) unsigned zerofill NOT NULL default '0000', ssn smallint(5) unsigned zerofill default NULL, t_ip varchar(21) NOT NULL default '', t_community varchar(20) NOT NULL default '', t_ver int(11) unsigned NOT NULL default '1', oid1 varchar(50) NOT NULL default '', oid2 varchar(50) NOT NULL default '', description varchar(128) NOT NULL default '', dgm_idx int(11) NOT NULL default '1', status tinyint(1) default NULL, UNIQUE KEY serial (serial), ) TYPE=MyISAM;
---------------------------------- SNMP Version ----------------------------------
Windows NT는 SNMP v1, Windows 2000은 SNMP v2, Net-SNMP는 v3을 지원한다. SNMP v1 으로만 쿼리를 하든지, SNMP v1으로 쿼리해서 OS를 알아낸 후 v1 또는 v2로 쿼리할 필요가 있다. SNMP v3는 다른 인증 방식으로 동작하므로 (Community 이름만 알아서는 쿼리할 수 없다.) 사용하지 않는다.
SNMP v2 에서는 get_bulk를 쓸 수 있다. Gathering시 로드를 줄일 수 있을 것 같은데 get_bulk를 제대로 써먹기 위해서는 DB구조를 변경해야 할 것이다.
-------------------------------- 중요 OID --------------------------------
SYSTEM -------- .1.3.6.1.2.1.1.1.0 = SNMPv2-MIB::sysDescr.0 Linux jjumi.com 2.4.18-14 #1 Wed Sep 4 ... .1.3.6.1.2.1.1.5.0 = SNMPv2-MIB::sysName.0 STRING: www.jjumi.com or IWEBNT
Network Interface ------------------- .1.3.6.1.2.1.2.1.0 = IF-MIB::ifNumber.0 Network Interface의 갯수를 알기 위해 ifNumber를 사용할 수 있으나, Windows 2000의 경우 Network Interface Instance가 1,2,3,.. 이렇게 할당되는 것이 아니라 임의의 숫자가 할당되므로 ifNumber만으로 Instance를 알 수가 없다. 쓰바. .1.3.6.1.2.1.2.2.1.1.* = IF-MIB::ifIndex.* .1.3.6.1.2.1.2.2.1.2.* = IF-MIB::ifDescr.* (lo0, eth0) .1.3.6.1.2.1.2.2.1.7.* = IF-MIB::ifAdminStatus.* ifAdminStatus를 조사해서 실제로 쓰는 Network Interface인지 조사할 필요가 있을까?? .1.3.6.1.2.1.2.2.1.10.* = IF-MiB::InOctets.* .1.3.6.1.2.1.2.2.1.16.* = IF-MIB::OutOctets.*
Unix ------
아래의 OID값을 얻기 위해서는 Net-SNMP 패키지를 설치하여 CPU, Memory, Disk에 서비스를 하도록 설정되어 있어야 한다.
Unix CPU (CPU 사용량 = CpuUser + CpuSystem) .1.3.6.1.4.1.2021.11.9.0 = UCD-SNMP-MIB::ssCpuUser.0 .1.3.6.1.4.1.2021.11.10.0 = UCD-SNMP-MIB::ssCpuSystem.0 ssCpuUser, ssCpuSystem 값을 로그에 저장하고 그래프를 그릴 때 2개의 값을 합쳐서 그리자.
Unix DISK .1.3.6.1.4.1.2021.9.1.1.* = UCD-SNMP-MIB::dskIndex.* .1.3.6.1.4.1.2021.9.1.2.* = UCD-SNMP-MIB::dskPath.* (/data) .1.3.6.1.4.1.2021.9.1.6.* = UCD-SNMP-MIB::dskTotal.* (76922968) .1.3.6.1.4.1.2021.9.1.7.* = UCD-SNMP-MIB::dskAvail.* (5448884) .1.3.6.1.4.1.2021.9.1.8.* = UCD-SNMP-MIB::dskUsed.* (67574296) 디스크는 Network Interface와 마찬가지로 Instance 갯수를 알 수 없으므로 dskIndex을 조사하여 Instance갯수를 알아낸다. dskPath는 description에 사용된다. dskTotal, dskUsed값을 로그에 저장하고 그래프를 그린다. dskAvail은 중복되는 값이므로 사용하지 않는다.
LOAD .1.3.6.1.4.1.2021.10.* = Load Average 관련 LOAD를 넣는 것이 좋지 않나??
Windows 2000 -------------
Windows 2000에서는 기본적으로 설치되는 HOST-RESOURCES-MIB을 통해 Process갯수, LOAD, 디스크 사용량을 알 수 있으나 메모리 총 사용량은 알 수 없다. HOST-RESOURCES-MIB (hostmib.mib) 은 .1.3.6.1.2.1.25 로 시작한다.
Windwos 2000 Disk
.1.3.6.1.2.1.25.2.3.1.1.* = hrStorageIndex.* .1.3.6.1.2.1.25.2.3.1.2.* = hrStorageType.* hrStorageType의 값이 .1.3.6.1.2.1.25.2.1.4 (fixed type) 인 것을 가려낸다. .1.3.6.1.2.1.25.2.3.1.3.* = hrStorageDescr.* hrStorageDescr 값에 약간의 문제가 있다.
Whatsup PC 에서는... SNMPv2-SMI::mib-2.25.2.3.1.3.1 = STRING: "A:\\" SNMPv2-SMI::mib-2.25.2.3.1.3.2 = STRING: "C:\\ Label: Serial Number 68373169" SNMPv2-SMI::mib-2.25.2.3.1.3.3 = STRING: "D:\\ Label: Serial Number b8a5e59a" SNMPv2-SMI::mib-2.25.2.3.1.3.4 = STRING: "E:\\" SNMPv2-SMI::mib-2.25.2.3.1.3.5 = STRING: "Virtual Memory" 이렇게 A,C,D,E 로 나온다.
그러나 다른 PC에서는... SNMPv2-SMI::mib-2.25.2.3.1.3.1 = STRING: "A:\\" SNMPv2-SMI::mib-2.25.2.3.1.3.2 = Hex-STRING: 43 3A 5C 20 4C 61 62 65 6C 3A B7 CE C4 C3 20 B5 F0 BD BA C5 A9 20 20 53 65 72 69 61 6C 20 4E 75 6D 62 65 72 20 36 34 37 31 32 36 36 63 SNMPv2-SMI::mib-2.25.2.3.1.3.3 = Hex-STRING: 44 3A 5C 20 4C 61 62 65 6C 3A B7 CE C4 C3 20 B5 F0 BD BA C5 A9 20 20 53 65 72 69 61 6C 20 4E 75 6D 62 65 72 20 34 30 35 33 31 64 30 61 SNMPv2-SMI::mib-2.25.2.3.1.3.4 = STRING: "E:\\ Label: Serial Number 949b08bb" SNMPv2-SMI::mib-2.25.2.3.1.3.5 = STRING: "F:\\" SNMPv2-SMI::mib-2.25.2.3.1.3.6 = STRING: "G:\\" SNMPv2-SMI::mib-2.25.2.3.1.3.7 = STRING: "Virtual Memory" 이렇게 나온다. 쓰바. C: D: 로 안나오고 왜 일케 나오는거야
.1.3.6.1.2.1.25.2.3.1.4.* = hrStorageAllocationUnits Disk 크기에 따라 2048, 4096, 16384, 65536 등으로 Block 크기가 틀리다. 쓰바. Gathering시 hrStorageAllocationUnits까지 받아와서 곱하든지 DB에 넣어넣고 그래프 그릴 때 고려해야 한다. .1.3.6.1.2.1.25.2.3.1.5.* = hrStorageSize (총용량, hrStorageAllocationUnits와 곱하기 필요) .1.3.6.1.2.1.25.2.3.1.6.* = hrStorageUsed (사용량, hrStorageAllocationUnits와 곱하기 필요)
Windows 2000 CPU
.1.3.6.1.2.1.25.3.3.1.2 = hrProcessorLoad .1.3.6.1.2.1.25.3.3.1.2.1 = hrProcessorLoad (Whatsup PC) .1.3.6.1.2.1.25.3.3.1.2.4 = hrProcessorLoad (다른 Windows 2000 PC) hrProcessorLoad에도 문제가 있다. 시스템마다 Instance가 다르다. 쓰바. .1.3.6.1.2.1.25.1.6 = hrSystemProcesses (# of running process) .1.3.6.1.2.1.25.1.6.0 = hrSystemProcesses.0
Windows 2000 Memory
.1.3.6.1.2.1.25.2.2 = hrMemorySize (총 메모리양) .1.3.6.1.2.1.25.2.2.0 = 261616 (KB) HOST MIB에는 Memory 관련된 사항은 이것밖에 없다. 메모리 사용량을 알기 위해서는 다른 확장 Agent가 필요하다. snmpboy.msft.net에서 제공하는 perfmib에는 버그가 있다. NT의 경우 Resource Kit에서 제공하는 MIB을 쓰면 될 거 같은데 W2k는??
SNMP4W2K-WINDOWS-2000-PERFORMANCE (perfmib.mib) 에서 알 수 있는 값
GETting a few Windows NT OIDs: Gets Current Anon. HTTP Users: - Won't work unless you had SNMP installed before you added IIS. snmputil get 127.0.0.1 public .1.3.6.1.4.1.311.1.7.3.1.6.0
Gets Total Anon. HTTP Users: - Won't work unless you had SNMP installed before you added IIS. snmputil get 127.0.0.1 public .1.3.6.1.4.1.311.1.7.3.1.8.0
Gets Maximum Anon. HTTP Users: - Won't work unless you had SNMP installed before you added IIS. snmputil get 127.0.0.1 public .1.3.6.1.4.1.311.1.7.3.1.10.0
Gets NT CPU % Usage: snmputil get 127.0.0.1 public .1.3.6.1.4.1.311.1.1.3.1.1.2.1.3.0
Gets C: Space remaining (MB): snmputil get 127.0.0.1 public .1.3.6.1.4.1.311.1.1.3.1.1.5.1.4.0
Gets RAM free (Bytes): (see snmputil image above) snmputil get 127.0.0.1 public .1.3.6.1.4.1.311.1.1.3.1.1.1.1.0
Walking the Windows NT OID trees:
Lists all memory and processor OIDs: snmputil walk 127.0.0.1 public .1.3.6.1.4.1.311.1.1.3.1.1.1
Lists all processor OIDs: snmputil walk 127.0.0.1 public .1.3.6.1.4.1.311.1.1.3.1.1.2
Lists all network interface OIDs: snmputil walk 127.0.0.1 public .1.3.6.1.4.1.311.1.1.3.1.1.3
Lists all physicaldisk OIDs: snmputil walk 127.0.0.1 public .1.3.6.1.4.1.311.1.1.3.1.1.4
Lists all logicaldisk OID: snmputil walk 127.0.0.1 public .1.3.6.1.4.1.311.1.1.3.1.1.5
Lists all process OIDs: snmputil walk 127.0.0.1 public .1.3.6.1.4.1.311.1.1.3.1.1.7
Lists all paging file OIDs: snmputil walk 127.0.0.1 public .1.3.6.1.4.1.311.1.1.3.1.1.9
Lists all the HTTP Server OIDs: - Won't work unless you had SNMP installed before you added IIS. snmputil walk 127.0.0.1 public .1.3.6.1.4.1.311.1.7.3.1
You can then "drill down" to the OID you need to access! Try it!
---------------------------------- snmpwalk 옵션 ---------------------------------- -O OUTOPTS Toggle various defaults controlling output display: b: do not break OID indexes down e: print enums numerically E: escape quotes in string indices * f: print full OIDs on output * n: print OIDs numerically * q: quick print for easier parsing Q: quick print with equal-signs s: print only last symbolic element of OID S: print MIB module-id plus last element t: print timeticks unparsed as numeric integers T: print human-readable text along with hex strings u: print OIDs using UCD-style prefix suppression * v: print values only (not OID = value) X: extended index format