toprc 사용

.toprc for RHEL 6

RCfile for "top with windows"		# shameless braggin'
Id:a, Mode_altscr=0, Mode_irixps=1, Delay_time=3.000, Curwin=0
Def	fieldscur=AEHIOQTWKLNMbcdfgJrpsuvyzX
	winflags=97144, sortindx=10, maxtasks=0
	summclr=3, msgsclr=1, headclr=3, taskclr=2
Job	fieldscur=ABcefgjlrstuvyzMKNHIWOPQDX
	winflags=62777, sortindx=0, maxtasks=0
	summclr=6, msgsclr=6, headclr=7, taskclr=6
Mem	fieldscur=ANOPQRSTUVbcdefgjlmyzWHIKX
	winflags=62777, sortindx=13, maxtasks=0
	summclr=5, msgsclr=5, headclr=4, taskclr=5
Usr	fieldscur=ABDECGfhijlopqrstuvyzMKNWX
	winflags=62777, sortindx=4, maxtasks=0
	summclr=3, msgsclr=3, headclr=2, taskclr=3

.toprc 라는 파일을 위와 같이 유저의 홈디렉토리에 생성을 하고 실행을 하면 아래처럼 출력이 된다.

 

만약 .toprc를 /tmp 디렉토리에 위치 시키고 사용하고자 한다면 아래와 같이 계정 홈디렉토리를 임시로 변경 후 top 실행

# declare -x HOME=/tmp

해당 터미널 쉘에 대해서만 임식 적용됨.

 

top 유틸리티에 대한 설명

top 명령과 awk 명령을 조합해서 어느 프로세스가 자원을 많이 점유하고 있는지 확인해 볼 수 있다. 아무런 옵션 지정 없이 top 명령을 실행하면 현재 프로세스 상황을 실시간으로 보여주는데, 스크립트에서 다른 명령들과 조합하기 위해서는 실행 시점에서 상황을 한번만 표시하도록 아래와 같이 옵션을 주자.

# 결과를 한번만 표시하고 종료
top -bn 1

만약 CPU 점유율이 90% 이상인 프로세스만 골라내고 싶다면 아래와 같이 awk 명령을 조합할 수 있다. 아래의 예시를 보자. awk 명령으로 CPU 점유율과 프로세스 이름만 골라낸 후, grep 명령의 정규표현(regular expression)을 이용해서 90~99 또는 100이 포함된 부분만 추려냈다.

 

# CPU 점유율 90% 이상인 프로세스 출력
# top 출력에서 CPU 점유율은 9번째 항목이고 프로세스 이름은 12번째 항목에 있음
top -bn 1 | awk '{ print $9 " " $12 }' | grep "^9[0-9]\|^100"

grep 명령을 이용한 다중 문자열 검색은 이전 게시물을 참조하자. 여기로

메모리 점유율이 높은 프로세스를 찾는 것도 같은 방식으로 하면 되겠다. 아래의 예시를 보자.

 

# 메모리 점유율 50% 이상인 프로세스 출력
# top 출력에서 메모리 점유율은 10번째 항목에 있음
top -bn 1 | awk '{ print $10 " " $12 }' | grep "^[5-9][0-9]\|^100"

CPU 또는 메모리를 유난히 많이 점유하고 있는 프로세스가 있는지 확인을 하거나, 특정 작업을 실행하기 전에 자원이 충분한지 점검해야 할 경우에 스크립트 형태로 작성해서 유용하게 쓸 수 있다.

예를 들어 전체 CPU 코어의 수와 점유율 90% 이상인 프로세스의 수가 같다면 모든 코어에 상당한 부하가 걸려 있는 셈이므로 경고문을 출력해 준다거나 할 수 있을 것이다. CPU 코어 개수 파악은 nproc 명령을 이용하면 된다. 아래의 예시를 보자.

 

# nproc 명령으로 전체 CPU 코어 개수 파악
total_cores=`nproc`

 

# CPU 점유 90% 이상인 프로세스 개수 파악
busy_cores=`top -bn 1 | awk '{ print $9 }' | grep "^9[0-9]\|^100" | wc -l`
# 양쪽 개수가 같을 경우 경고문 출력
if [ $busy_cores -eq $total_cores ]
    then echo "모든 CPU 코어가 90% 이상 점유되어 있습니다"
fi

 

 

Top 의 CPU 에 표시되는 값들의 의미는? - ni, wa, hi, si

nice는 아시다시피 유닉스에서 프로세스의 우선순위를 의미합니다. top 표시 내용 중 ni(nice)는 "기본값보다 낮은 우선순위로 사용자 공간에서 실행된 시간"을 의미합니다. 따라서 us(user)는 정확하게는 "기본값으로, 혹은 그보다 높은 우선순위로 사용자 공간에서 실행된 시간"을 의미합니다.

hi(hard interrupt)는 "순수한(?) 인터럽트 핸들러에서 사용한 시간"을 의미합니다. 하지만 인터럽트 핸들러는 수행중 다른 인터럽트를 꺼버리기 때문에 가능하면 빨리 실행을 마쳐야 합니다. 그래서 시간이 걸릴 만한 작업은 잠시 미뤄뒀다가 실행합니다. (나중에 인터럽트 처리 작업을 마저 처리하는 부분을 "bottom halves"라고 부르더군요. 인터럽트 핸들러는 "top halves"라고 부르고요.) "잠시 미뤄둔 인터럽트 처리 작업에 사용한 시간"이 바로 si(soft interrupt) 항목입니다.

wa(I/O wait)은 I/O를 기다리는 시간이 맞습니다. 어떤 프로세스가 I/O 때문에 wait 상태로 들어갈 때 즉시 실행 가능한 다른 프로세스가 있으면 그 프로세스를 실행하지만 그렇지 않은 경우는 어쩔 수 없이 I/O 대기 작업 중 하나가 완료될 때까지 대기해야 합니다. 그 때 사용한 시간이 wa입니다. 모든 프로세스가 I/O 완료가 아닌 다른 이벤트를 기다리면서 쉬고 있으면 이는 id(idle) 항목에 해당합니다.

항목들 간의 관계를 좀 정리하자면…

•wa(I/O wait)과 id(idle)은 모두 대기 시간입니다. I/O를 기다리는 프로세스가 하나라도 있으면 wa에 카운트 되고 그렇지 않으면 id에 카운트 됩니다.
•hi(hard interrupt)와 si(soft interrupt)를 합치면 인터럽트 처리에 쓰인 시간이 됩니다. 인터럽트 핸들러 자체에서 잠깐 쓴 시간은 hi에, 미뤄둔 처리 작업에 쓰인 시간은 si에 카운트 됩니다.
•sy(system)는 wa,id,hi,si를 제외하고서 커널 내에서 쓰인 시간입니다. hi, si도 (그리고 더 정확하게는 wa와 id도) 커널 내의 시간이라고 할 수 있지만 sy 항목의 계산에서는 제외됩니다.
•us(user)와 ni(nice)를 합하면 사용자 공간에서 실행된 시간입니다. 기본 우선순위보다 낮은 우선순위로 실행되느냐의 여부로 us와 ni 중 하나로 카운트 됩니다.

뱀발로… top 프로그램의 실행 결과는 결국 /proc/stat 파일의 내용을 파싱해서 뿌려주는 것입니다. 그런데 /proc/stat 출력 결과를 보면 프로세스별로 7개가 아니라 8개의 항목이 있습니다. 마지막 항목은 "steal" 항목으로 "프로세스가 비자발적으로 대기하는 데에 사용한 시간"라고 합니다… 만 현재 커널에서는(2.6.15 기준) 카운트를 하지 않고 있습니다.

 

함께 보면 좋은 사이트 :

리눅스 서버 60초안에 상황파악하기

 

top

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다