2011년 10월 21일 금요일

Bat 파일로 동시실행하기

bat 파일에

 

notepad.exe

notepad.exe

로 실행  할 경우 notepad.exe 파일이 종료되야 실행된다.

start /b notepad.exe

start /b notepad.exe

를 하면 동시에 실행된다.

2011년 10월 10일 월요일

mrtg 관련

http://www.superuser.co.kr/mrtg/mrtg_020910/menu13.htm

 

1. 다양한 자원분석 사용량분석 개론

MRTG로 분석가능한 자원은 많이 있다.

그중 가장 대표적인 것이 네트웍트래픽분석이다.

앞장에서 설명드린 내용은 이런 트래픽을 웹화면에서 모니터링하는 방법에 대한 것을 다루었다.

이번장에서는 네트웍장비의다양한 자원의 사용량을 분석하는 방법을 CPU사용량을 웹에서 모니터링하는 방법에 대해서 설명할 것이다.

먼저, mrtg로 트래픽뿐아니라 cpu, memory, disk등의 다양한 자원에 대한 분석을 하려면 ucd-snmp를 업그레이드해야한다.

사용중인 ucd-snmp의 버전이 4.1대라면 4.2대로 업그레이드하기 바란다.

CPU사용량 모니터링을 하는 방법또한 앞장과 많이 유사하다.

단지, cfg파일(Configuration file)이 조금 다를 뿐이다.

따라서 이장과 다음장에 나오는 MEMORY사용량분석에서는 앞장에서 설명한 트래픽분석부분과의 중복되는 부분은 생략하고 주로 cfg파일을 위주로 설명이 될 것이다.

우선, ucd-snmp에 대해서 좀 알아보자.

현재 필자가 MRTG서버로 구축하는 서버는 레드햇리눅스이다.

아마도 최신버전의 리눅스라면 ucd-snmp 4.2.X가 깔려 있을 것이다.

여러분의 서버에 설치되어 있는 ucd-snmp가 4.1.X라면 4.2.X로 업그레이드하기를 권한다.

우선 현재 사용중인 snmp의 버전을 확인해 보자.

확인하는 방법은 "snmpd -v"를 하면 다음과 같이 현재 사용중인 snmp의 버전을 확인할 수 있다.

확인한 바와 같이 현재 snmp의 버전은 ucd-snmp 4.1.2이다.

ucd-snmp의 최신버전은 4.2.1로서 다운을 받으려면 net-snmp.sourceforge.net에 방문해 보기 바란다.

잠깐만 언급한다면 ucd-snmp는 현재 그 이름이 net-snmp로 불리우고 있다.

최신번전은 2001년 4월달에 발표된 것으로 현재 트래픽분석뿐아니라 다양한 자원분석을 위해 많이 사용되고 있는 프로토콜이다.

4.2.X로 버전업 하는 구체적인 방법에 대해서는 "UCD-SNMP 버전업하기"편에 자세히 설명이 되어있다. 을 참조하기 바란다.

이를 참조하여 버전을 하였다면 다음과 같이 snmp의 버전을 다시한번 확인해 보도록 할 것이다.

2. 관련 MIB 확인하기

우선 트래픽외의 다양한 자원을 분석하기위해서는 대상 MIB정보를 확인해야한다.

ucd-snmp 4.2.1버전의 SNMP를 정상적으로 설치하였다면 이런 MIB값에 대한 정보를 제공하는 파일들이 /usr/local/share/snmp/mibs/디렉토리에 txt파일로 존재한다.

분석코자하는 대상자원의 MIB정보를 가진 txt 파일을 이 디렉토리에서 확인하여 cfg파일내에 LoadMIBs라는 옵션으로 참조하게만 하면된다.

이 디렉토리에 존재하는 파일들중에 CPU라는 자원을 MRTG로 분석하기 위해서는 UCD-SNMP-MIB.txt라는 파일이 필요하다.

따라서 다음절에 나올 cfg파일분석편에 보시면 LoadMIBs로 이 파일을 읽어들이는 것을 확인할 수 있을 것이다.

자, cpu라는 자원에 대한 MIB정보는 어떤 것들이 있을까?

UCD-SNMP-MIB.txt파일내에 cpu와 관련된 MIB정보를 확인해 보자.

다음표는 UCD-SNMP-MIB.txt파일내용중 CPU와 관련된 MIB값들이다.

표. CPU관련 MIB값

객체

구문

접근권한

Status

설명

비고

ssCpuUser

Integer32

read-only

Current

사용자 CPU time 퍼센트

::= { systemStats 9 }

ssCpuSystem

Integer32

read-only

Current

시스템 CPU time 퍼센트

::= { systemStats 10 }

ssCpuIdle

Integer32

read-only

Current

CPU idle time 퍼센트

::= { systemStats 11 }

ssCpuRawUser

Counter32

read-only

Current

사용자 CPU 시간

::= { systemStats 50 }

ssCpuRawNice

Counter32

read-only

Current

nice CPU 시간

::= { systemStats 51 }

ssCpuRawSystem

Counter32

read-only

Current

시스템 CPU 시간

::= { systemStats 52 }

ssCpuRawIdle

Counter32

read-only

Current

idle CPU 시간

::= { systemStats 53 }

ssCpuRawWait

Counter32

read-only

Current

iowait CPU 시간

::= { systemStats 54 }

ssCpuRawKernel

Counter32

read-only

Current

커널 CPU 시간

::= { systemStats 55 }

ssCpuRawInterrupt

Counter32

read-only

Current

interruptlevel CPU 시간

::= { systemStats 56 }

위의 표를 보면 대충 어떤 MIB값을 사용해야하는 가를 알 수 있을 것이다.

위의 표 "설명"부분을 참조하여 CPU의 어떤사용률에 대한 분석을 하거픈가를 확인하면 된다.

참고로 이책에서 실습대상으로 하는 MIB값은 위의 표중에서 "ssCpuRawUser"와 ssCpuRawIdle"이다.

즉, 사용자 프로세스가 사용한 CPU사용시간과 CPU가 한가하게 놀았던 시간(idle time)에 대한 분석이될 것이다.

다음표는 UCD-SNMP-MIB.txt파일내용중 MEMORY와 관련된 MIB값들이다.

표. MEMORY관련 MIB값

객체

구문

접근권한

Status

설명

비고

memIndex

Integer32

read-only

current

Bogus Index, 항상 0 리턴

::= { memory 1 }

memErrorName

DisplayString

read-only

current

Bogus Name, 항상 'swap'문자리턴

::= { memory 2 }

memTotalSwap

Integer32

read-only

current

전체 swap공간

::= { memory 3 }

memAvailSwap

Integer32

read-only

current

사용가능한 swap 공간

::= { memory 4 }

memTotalReal

Integer32

read-only

current

전체 물리적인(RAM) 공간

::= { memory 5 }

memAvailReal

Integer32

read-only

current

사용가능한 물리적인 공간

::= { memory 6 }

memTotalSwapTXT

Integer32

read-only

current

사용된 가상메모리공간

::= { memory 7 }

memAvailSwapTXT

Integer32

read-only

current

사용중인 가상메모리공간

::= { memory 8 }

memTotalRealTXT

Integer32

read-only

current

사용된 전체 물리적인 메모리공간

::= { memory 9 }

memAvailRealTXT

Integer32

read-only

current

사용중인 실제메모리공간

::= { memory 10 }

memTotalFree

Integer32

read-only

current

전체사용가능한 메모리

::= { memory 11 }

memMinimumSwap

Integer32

read-only

current

비워질 수 있는 swap공간의 최소크기를 리턴하거나 memErrorSwap이 1로 셋팅되어 있을 경우 memSwapErrorMsg에 에러문자리턴

::= { memory 12 }

memShared

Integer32

read-only

current

전체공유메모리 크기

::= { memory 13 }

memBuffer

Integer32

read-only

current

버퍼링된 메모리크기

::= { memory 14 }

memCached

Integer32

read-only

current

캐싱된 메모리크기

::= { memory 15 }

memSwapError

Integer32

read-only

current

Error Flag 리턴. Flag가 1일 경우 여유swap공간이 거의 없음을 의미함.

::= { memory 100 }

memSwapErrorMsg

DisplayString

read-only

current

Error Flag상태를 알리는 에러메시지리턴

::= { memory 101 }

다음표는 UCD-SNMP-MIB.txt파일내용중 DISK와 관련된 MIB값들이다.

표. DISK관련 MIB값

객체

구문

접근권한

Status

설명

비고

dskTable

SEQUENCE OF DskEntry

not-accessible

current

SNMP Agent의 snmpd.conf에 의해 설정되어 watching된 부분. 디스크의 watching정보.

::= { ucdavis 9 }

dskEntry

DskEntry

not-accessible

current

디스크나 디스크 통계치를 포함한 엔트리(Entry)

::= { dskTable 1 }

dskIndex

Integer32 (0..65535)

read-only

current

디스크 mib를 참조한 (행)수

::= { dskEntry 1 }

dskPath

DisplayString

read-only

current

마운트된 디스크의 패스정보

::= { dskEntry 2 }

dskDevice

DisplayString

read-only

current

파티션된 디바이스 패스정보

::= { dskEntry 3 }

dskMinimum

Integer32

read-only

current

에러발생전의 최소디스크요구공간의 크기(단위 : kBytes)

::= { dskEntry 4 }

dskMinPercent

Integer32

read-only

current

에러발생전의 최소디스크요구공간의 퍼센티지

::= { dskEntry 5 }

dskTotal

Integer32

read-only

current

디스크파티션의 총크기
(단위 : kBytes)

::= { dskEntry 6 }

dskAvail

Integer32

read-only

current

사용가능한 디스크공간크기

::= { dskEntry 7 }

dskUsed

Integer32

read-only

current

사용중인 디스크공간의 크기

::= { dskEntry 8 }

dskPercent

Integer32

read-only

current

사용중인디스크공간의 퍼센티지

::= { dskEntry 9 }

dskPercentNode

Integer32

read-only

current

사용중인 inode의 퍼센티지

::= { dskEntry 10 }

dskErrorFlag

Integer32

read-only

current

에러를 위해 설정된 최소공간의 디스크(파티션) 에러 Flag 시그널

::= { dskEntry 100 }

dskErrorMsg

DisplayString

read-only

current

여유공간과 경고(warning) 메시지

::= { dskEntry 101 }

이제 이들 MIB값들을 이용하면 MRTG를 통해서 이와 관련된 정보를 모니터링해볼 수 있다.

다음장에서는 이런 MIB값을 가지고 MRTG의 트래픽분석을 위한 Configuration File을 만들어 보도록 할 것이다.

3. Configuration file 만들기

아래와 같은 cfg파일을 만들어 보았다.

분석하려는 구체적인 객체를 /usr/local/share/snmp/mibs/UCD-SNMP-MIB.txt 파일에서 확인한 다음 Target에 아래 예와 같이 설정해 주면 된다.

물론, LoadMIBs 옵션에 UCD-SNMP-MIB.txt 파일의 위치를 지정해 주는 것도 잊지 말아야 할 것이다.

  • CPU 모니터링을 위한 Configuration file

물론 아래와 같은 cfg파일이 아니더라도 cpu분석은 가능하다.

  • MEMORY 모니터링을 위한 Configuration file

  • DISK 모니터링을 위한 Configuration file

다른 Configuration File들과는 조금 다른 것이라면 디스크의 사용량분석을 위해 대상파티션을 지정해줘야한다는 것이다.

즉, dskPercent.1 과 dskPercent.2는 각각 루트파티션(/) 과 usr파티션(/usr)에 해당하며, 이들의 설정을 Legend1과 Legend2, 그리고 LegendI와 LegendO에 각각 설정하였다.

그리고, 무엇보다 중요한 것은 디스크의 모니터링을 위한 대상 파티션의 설정을 /usr/local/share/snmp/snmpd.con 파일내에서 다음과 같은 설정을 해야한다.

즉, 모니터링의 대상이 되는 파티션의 설정을 위와 같이 한후에 snmpd를 다시 띄워야한다.

이 cfg 파일에서 설정한 각 options들에 대한 설명은 다음장에서 설명된다.

참고로, 이런 cfg파일 작성 및 구성에 대한 예제파일들은 아래의 URL에서 찾아볼 수 있으려 이를 그대로 적용하기보다는 좀더 다양한 방법으로 수정해서 사용해보는 것이 발전이 지름길이 될 것이다.

http://net-snmp.sourceforge.net/tutorial/mrtg/index.html

4. cfg파일 분석

여기서 설명되는 옵션들은 앞장에서 설명된 것과 "MRTG Configuration File Format"편에 자세히 설명되었으므로 여기서는 CPU사용량분석이라는 초점에 맞추어서 설명됨을 유의하기바란다.

Language

웹페이지에 한글을 사용하기위한 설정.

WorkDir

mrtg의 실행결과 생성되는 웹페이지들이 저장될 디렉토리경로 설정

LoadMIBs

CPU과련 MIB값을 저장하고 있는 파일 Include 설정

Target

CPU자원을 분석하기위한 MIB값의 설정.

  • kebia_2_cpu : 대상자원의 이름이며, 생성되는 웹파일들의 이름또한 여기서 설정된 이름이 사용된다.
  • ssCpuRawUser.0 : 사용자프로세스가 차지하는 CPU사용량의 MIB객체지정.
  • ssCpuRawIdle.0 : CPU의 idle time 값의 MIB객체 지정.
  • public : SNMP로 통신하기위한 community name.
  • 192.168.0.5 : 대상객체의 IP Address 또는 도메인명

위의 표를 참조하여 CPU관련된 다른 MIB값들을 참조하여 다양한 분석이 가능하다는 것을 인지하기 바란다.

Options

growright : 오른쪽에서부터 그래프가 생성이됨.

nopercent : 결과로 생성되는 웹페이지내의 그래프에서 퍼센트표시를 나타내지않음.

MaxBytes

CPU의 전체사용량을 100으로 설정.

Title

생성되는 웹(html)파일에 <title>제목</title>에 들어갈 제목부분 설정.

웹브라우즈로 결과를 보았을 때 웹브라우즈의 최상단 바(bar)에 나타나는 제목으로 확인하거나 "소스보기"등으로 확인가능.

RouterUptime

이설정은 동일한 라우터를 사용하여 동일한 분석을 여러개 동시에 분석할 경우에 community name과 address를 여러번 반복하여 사용하지 않도록 하기위한 설정이다.

Unscaled

4개의 그래프 즉, day, week, month, year 그래프에서 Y축그래프가 MaxBytes에서 지정한 수치에 미치지 못하는 부분을 축약(생략)하여 표현하기위한 설정이다.

즉, 불필요한 부분을 보지 않기위한 설정이라는 것을 의미한다.

YLegend

Y축 그래프에 대한 설명표를 "CPU Utilization"이라고 나타낸다.

Legend1

결과 웹페이지의 하단에 표시되는 그래프의 색깔에 대한 설명을 붙인 것이다

즉, 첫 번째 그래프(여기서는 녹색)색깔에 대한 설명을 "User CPU in % (Load)"로 하겠다라는 설정임.

Legend2

Legend1과 마찬가지로 그래프(여기서는 청색)색깔에 대한 설명을 "Idel CPU in % (Load)"로 하겠다라는 설정임.

LegendI

4개의 그래프(일,주,월,년) 각각의 하단에 INPUT표시의 설명을 "User"로 하겠다라는 설정임.

즉, 각각의 그래프에서 INPUT에 해당하는 것이 무엇을 뜻하는 것인가를 설명하기 위한 것이며, 여기서는 사용자프로세스에 대한 그래프의 색깔이므로 "User"로 설정한 것임.

LegendO

LegendI와 마찬가지로 OUTPUT에 해당하는 그래프의 색깔 설명을 "Idle"로 설정한 것임.

PageTop

mrtg 실행결과 생성되는 웹페이지의 최상단에 나타낼 내용임.

5. mrtg 초기실행과 웹페이지 생성확인

이제 cfg파일의 생성과 이에대한 설명까지 끝났다.

이제 남은 것은 이 cfg파일로 mrtg를 실행하고 그 결과 지정한 디렉토리에 웹페이지들이 생성이 되는가를 확인한 다음 웹브라우즈로 확인을 해보도록 할 것이다.

아래와 같이 mrtg를 실행시켜보자.

mrtg를 처음실행시킬 때에는 mrtg 실행파일의 경로를 절대경로로 해서 실행하는 것이 습관이 되면 좋을 것이다.

mrtg를 처음실행시키면 트래픽분석에서 보았던 것 처럼 동일한 에러가 발생한다.

동일한 실행은 몇회 계속하게되면 이런 에러는 발생하지 않는다.

이제 cfg파일의 WorkDir에서 지정한 디렉토리로 가서 웹파일들이 생성이 되었는가를 확인해 보자.

앞에서는 볼 수 없었던 파일종류가 하나 있을 것이다

*.png, *.html, *.log, *.old 파일들은 트래픽분석에서도 볼 수 있었던 것이나 *.txt파일은 여기서 처음 생성된 것이다.

이것은 cfg파일에서 LoadMIBs를 사용하였기 때문에 생성된 파일로서 LoadMIBs에서 지정한 UCD-SNMP-MIB.txt파일내의 모든 MIB값들이 필요한 것이 아니기 때문에 다음에 실행할 때에 사용하기위한 것으로 필요한 MIB값을 oid형태의 파일로 보관한 것이다.

아래는 이 파일의 내용이다.

보시는 바와 같이 UCD-SNMP-MIB.txt내의 많은 MIB값들중 두 개(ssCpuRawUser, ssCpuRawIdle)만을 사용했으므로 이 두 개의 oid값만이 들어가 있는 것이다.

6. 웹브라우즈로 결과확인

자 이제 모든 실행이 끝나고 그 결과를 웹브라우즈로 확인해 보도록 하자.

cfg파일 설명부분에서 설명했던 것을 참조하여 결과 웹페이지가 어떻게 나타났는지 확인하기 바란다.

cfg파일을 수정함으로써 원하는 결과를 다르게 나타내는 것을 각자 해보기바란다.

  • CPU 사용량 모니터링 분석 결과확인

  • MEMORY 사용량 모니터링 분석 결과확인

  • DISK 사용량 모니터링 분석 결과확인

7. 마무리 작업

웹브라우즈로 결과까지 확인을 했다.

이제 트래픽분석의 마지막에 했던 것과 마찬가지로 결과 웹페이지를 로딩할 때에 ID와 패스워드를 입력받도록 하기위한 설정과 주기적인 mrtg실행을 위하여 cron파일에 등록하는 것을 잊지 말자.

[Linux] vmstat

vmstat 명령어
시스템의 리소스 상황(CPU, I/O, 메모리)을 모니터링 할 수 있는 명령어이다

사용법

vmstat

 

를 치면 아래와 같이 나오고

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
2  0      0 160436  15840  48616    0    0     0     3   19    9 22 50 28  0  0

 5초간 3번 Data를 수집 하고자 할때는

vmstat 5 3

 

와 같이 입력하면 된다.

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
0  0      0 160588  15840  48616    0    0     0     3   19    9 22 50 28  0  0
2  0      0 160640  15840  48616    0    0     0     0 3954 8133 17 17 66  0  0
0  0      0 161108  15840  48616    0    0     0     0 4028 7987 16 19 65  0  0

첫번째 값은 의미 없는 값 일듯(항상 높게나옴) 2번째 값부터 보면 된다.

각 필드가 나타내는 의미는 다음과 같다.

proc 항목
r: 현재 실행중인 프로세스의 수
b: 인터럽트가 불가능한 sleep 상태에 있는 프로세스의 수 (I/O 처리를 하는 동안 블럭 처리된 프로세스)
w: 강제로 스왑아웃된 프로세스

memory 항목
swpd: 사용하고 있는 swap 메모리 양
free: 사용가능한 메모리 양
buff: 버퍼로 사용되고 있는 메모리 양
cache: 캐시로 사용되고 있는 메모리 양

swap 항목
si : swap in
so: swap out

io 항목
bi: 초당 블럭 디바이스로 보내는 블럭 수
bo: 초당 블럭 디바이스로부터 받은 블럭 수

system 항목
in: 초당 인터럽트 되는 양
cs: 초당 context switch되는 양

cpu 항목
us: 커널이 아닌 프로세스의 시간 (user time, including nice time)
sy: 커널의 사용시간 (system time)
id: 아무런 일을 하지 않는 시간
wa: 입출력 대기 시간
st: 가상머신이 사용하는 시간

sy필드의 값이 지나치게 높으면 디스크 I/O에 문제가 있을 가능성이 크다.
그리고 시스템 전체의 부하가 높은데 id필드의 값이 일반적으로 10%를 넘는다면 I/O나 메모리에 문제가 있을 가능성이 있다. I/O에 문제점이 있다는 것을 발견하면 iostat 등의 명령어를 추가로 사용하여 세부사항을 분석할 수 있다.

id필드의 값이 항상 0이라면 CPU를 100% 사용하고 있다는 것을 의미한다. 그러나 항상 100%로 사용하고 있다면 어떤 작업이 계속 축적되고 있으며 CPU가 과부하를 가진다는 것을 의미한다. 이 때는 top, ps, sar등의 명령어를 사용하여 CPU를 계속 사용하고 있는 프로세스를 찾아 적절하게 대응해야 한다.

CPU 전체사용률은

100-(user+sys+iowait) 로 보면 된다.

vmstat 에 날짜와 시간을 출력하고 싶으면

vmstat -n 5 | awk '{now=strftime("%F %T"); print now, " ", $0}'

와 같이 하면

2011-10-10 10:15:39   procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
2011-10-10 10:15:39    r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
2011-10-10 10:15:39    0  0      0 160868  15840  48616    0    0     0     3   20   10 22 50 28  0  0
2011-10-10 10:15:44    1  0      0 160892  15840  48616    0    0     0     0 3984 8005 17 16 66  0  0

와 같은 형식으로 출력된다.