vmstat 필드 설명

 

# vmstat 1
 procs     memory            page            disk          faults      cpu
 r b w   swap  free  re  mf pi po fr de sr s0 s1 s2 s6   in   sy   cs us sy id
 0 0 0 301576 36864   0  71 96  8 15  0 15  0  0 11  0  168  456  106  8  3 89
 0 0 0 276936  1896   0   7  8 128 160 0 9  0  0  2  0  125  270   91  2  0 98
 0 0 0 276936  1896   0   0  0  0  0  0  0  0  0  0  0  141  273   88  0  0 100
 0 0 0 276936  1896   0   0  0  0  0  0  0  0  0  0  0  161  309   99  1  0 99
 0 0 0 276936  1896   0   0  0  0  0  0  0  0  0  0  0  153  291   97  0  0 100

필드 설명
proc

r   b   w

r:  the number of threads in run queue
b:  the number of threads blocked for resources (I/O, paging, and so forth)
w:  the number of threads swapped out

Solaris에서는 멀티 쓰레드 기능을 제공하며, 커널의 스케쥴링도 쓰레드 단위로 한다. 멀티 쓰레딩 방식으로 프로그래밍되어 있지 않은 프로세스는 하나의 쓰레드가 프로세스에 있다. 각 프로세스에 몇 개의 쓰레드가 있는지는 psinfo 명령어의 결과에서 NLWP 항목에 있는 값으로 확인할 수 있다.

# /opt/JSparm/bin/psinfo -f
Date.time 0507.23:09:34 proc 70 zombie 0 runnable 0 lwp 144 cpu 6.11%
avgload  0.07  0.02  0.02 hp+stk 52.75M
  PID  USERNAME HP+STK S NLWP   WCPU%   CPU%  ELAPSED        TIME CMD
  499  root     0.117M O    1   0.29%  0.29%      0d0       00.06 psinfo
  170  root     0.188M S    8   0.25%  0.25%  0d11147       00.63 syslogd
  463  guest    9.383M S    1   0.15%  0.15%   0d8594    01:03.88 netscape
  287  root     0.148M S   12   0.02%  0.02%  0d10724       02.81 mibiisa
  495  guest    0.031M S    1   0.01%  0.01%   0d5498       00.16 vi

쓰레드의 상태는 크기 세가지로 나눌 수 있다.

  • CPU를 사용하고 있는 쓰레드
  • CPU를 사용하기 위해 Run Queue에서 대기하고 있는 쓰레드
  • IO나 이벤트가 완료되기를 기다리며 sleep하는 쓰레드
  • r에 나타나는 값은 CPU를 사용하기 위하여 Run Queue에서 대기하는 쓰레드의 갯수 이고, b는 sleep하는 쓰레드 중에 I/O(Disk)가 완료되기를 기다리는 쓰레드의 갯수를 나타낸다.
    시스템의 메모리가 부족할 때 paging이 일어나는데, 페이징으로도 부족한 메모리를 보충하지 못하면 swapping이 일어난다. 이때 메모리로 부터 빠져나기 swap 디바이스에 보관된 쓰레드의 갯수를 w에 보여준다.
    한번 swapout된 쓰레드는 그 쓰레드가 다시 실행될 때 물리적 메모리로 들어온다.

    memory

    swap   free

    page


    re   mf   pi   po   fr   de   sr

    swap:  amount of swap space currently available (Kbytes)
    free:  size of the free list (Kbytes)
    re:  page reclaims
    mf:  minor faults
    pi:  kilobytes paged in
    po:  kilobytes paged out
    fr:  kilobytes freed
    de:  anticipated short-term memory shortfall (Kbytes)
    sr:  pages scanned by clock algorithm

    Solaris는 가상 메모리(Virtual Memory) 시스템을 사용한다. 가상 메모리 시스템이란 물리적 메모리(physical memory)와 하드 디스크(swap device)를 결합하여 하나의 큰 메모리처럼 사용하는 것을 말한다.
    즉. 물리적 메모리가 100M 이고 swap device가 100M이면 가상 메모리량은 약 180MB 정도 된다.

    physical memory + swap device - VM management overhead = swap(VM)
    
    간단히 생각하면
    
    (physical memory + swap device) * about 90% ~= swap(VM)
    
            (100M + 100M) * 0.9 ~= 180M
    

    Solaris는 이러한 가상 메모리를 관리하기 위하여 메모리를 페이지 단위로 나누어 관리한다.

    Solaris에서는 가상 메모리를 swap으로 명칭한다(swap partition과 구별해 주십시오). 이 swap(VM)은 운영체제가 사용할 수 있는 메모리이다. vmstat 명령어의 4번째 필드 swap은 사용 가능한 가상 메모리의 크기를 KB 단위로 나타내고 5번째 필드 free는 사용 가능한 물리적 메모리를 KB 단위로 나타낸다. 가상 메모리에 대한 자세한 사항은 다음과 같은 명령어로 알 수 있다.

    # swap -s total: 664720k bytes allocated + 53320k reserved = 718040k used, 485160k available

    응용 프로그램이 동작할 때, 필요한 메모리는 swap(VM)에서 가져온다. 물리적 메모리가 많든 적든 관계없이 swap 공간이 충분하면 프로그램이 실행되는 데에는 전혀 문제가 없다. 만일 물리적 메모리가 절대적으로 부족하다면, 실행속도가 늦어질 뿐, 메모리 부족으로 애플리케이션이 중단되는 일은 없다.

    swap partition에 대한 정보는 다음과 같이 확인할 수 있다.

    # swap -l swapfile dev swaplo blocks free /dev/dsk/c0t0d0s1 151,1 16 1638992 933104

    blocks은 전체 swap partition의 크기이며 512 바이트 단위의 블럭이고, free는 그 중에 사용 가능한 swap partition의 크기이며 512 바이트 단위의 블럭이다. 즉,

    (blocks - free) / 2 = 현재 스왑 아웃된 양(KB)

    위의 swap -l 명령어의 결과에서 보면, 352944KB의 메모리가 swapout 되었음을 알 수 있다.

    (1638992 - 933104) / 2 = 352944KB ~= 344.67MB

    Solaris의 메모리 관리 방법에서는 여유 있는 물리적 메모리를 화일 시스템의 캐쉬로 사용한다. 디폴트로 프리 메모리(free physical memory)가 전체 물리적 메모리 양의 1/64(lotsfree)보다 크면, 화일 시스템을 통한 디스크 I/O는 모두 메모리에 남겨두어 화일 시스템의 캐쉬로 사용한다. 프리 메모리가 물리적 메모리 양의 1/64보다 적으면, Solaris는 프리 메모리를 1/64로 채우기 위하여 시스템에 있는 페이지를 조사하여, 최근에 사용되지 않은 페이지를 찾아서 프리시킨다.
    이때 운영체제가 조사한 페이지의 갯수가 sr(scan rate)값이다. 프리시킨 페이지 수는 KB 단위로 환산되어 fr(free)에 보여준다. 페이지를 프리시킬 페이지의 내용이 변경되었을 경우, 그 페이지를 disk에 저장한다. (변경된 페이지가 프로그램의 데이타일 경우, 스왑 파티션에 저장되고, 화일 시스템의 케쉬이면 해당 디스크 파티션에 저장된다.) 이때, 디스크에 저장된 페이지를 KB 환산하여 po(page out)에 보여준다.
    Solaris에서 화일 시스템은 페이지 서브 시스템을 통하여 이루어 진다. 즉, 화일 시스템의 입출력은 모두 page I/O로 이루어 진다. 화일 시스템을 통하여 화일을 읽을 때, 읽은 양은 KB로 환산되어 pi(page in)에 보여준다.

    페이지의 크기는 pagesize 명령어로 확인할 수 있다.(sun4u 시스템은 8KB이고 sun4m은 4KB이다)

    # pagesize 8192

    특별히 메모리를 많이 사용하는 프로그램이 없는데도, 보통 Solaris 시스템의 프리 메모리의 크기가 아주 작게 보인다. 이것은 정상적이라고 말할 수 있다. 앞에서 설명한 바와 같이 화일 시스템의 캐쉬로 많은 부분이 사용되고 있기 때문이다.

    프로그램을 실행할 경우에 운영체제는 프로세스에 대한 어드레스 맵핑 테이블을 만들고, 프로세스를 실행한다. 프로세스가 실행되다가 필요한 페이지가 자신의 어드레스 맵핑 테이블에 연결되어 있지 않으면, 페이지 폴트가 발생하는데, 그 페이지가 메모리에 있으면(minor page fault라고 함), 그 페이지를 자신의 어드레스 맵핑 테이블에 등록한다. vmstat의 mf(minor fault)는 minor page fault 횟수를 나타낸다.

    프리 메모리가 부족할 경우, paging이 발생하여 최근에 사용되지 않은 페이지를 찾아서 프리시켜 부족한 메모리를 보충하게 되는데, 이렇게 프리되는 페이지의 내용은 훼손되지 않고 프리 메모리 영역에서 관리된다. 이렇게 프리된 페이지가 프로세스의 요청에 따라 다시 사용될 수 있다. 이렇게 다시 사용된 페이지 수를 re(reclaim)에 보여준다.

    de: Unknown

    disk

    s0   s1   s2   s3

    최대 4개의 디스크에 대하여 초당 read/write 횟수를 나타낸다. 디스크의 이름은 영문자 한 글자와 숫자 하나로 이루어진다.

    fault

    in   cy   cs

    in(interrupt): 초당 인터럽드 횟수(clock interrupt 제외)
    인터럽트는 주변 장치가 데이타의 입출력이 발생할 때, CPU에게 알려주는 방법으로 사용된다. 예를 들어, 사용자가 키보드의 키를 누르면 키보드를 관장하는 하드웨어가 인터럽트를 발생하여 키보드로 부터 입력이 있다는 것을 CPU에게 알리게 된다. 그러면, CPU는 이미 정의되어 있는 키보드 처리 루틴(인터럽트 핸들러)을 호출하여 입력을 처리한다. 이처럼 주변장치들은 대부분 인터럽트를 발생하는 기능을 가지고 있다. 시스템에는 클럭이라는 장치가 있는데 이것은 1초에 100번씩 일정하게 인터럽트를 발생한다. 그러나 in에는 일정하게 발생하는 클럭 인터럽트는 제외한다.

    sy(system call):  초당 시스템 콜 회수
    시스템 콜은 커널이 제공하는 기본적인 서비스 루틴이다. 프로세스의 실행부터 종료될 때까지 시스템 콜의 연속적인 호출이라고 할 수 있다. Solaris에는 200가지가 넘는 시스템 콜이 있으며, 가장 흔히 사용하는 시스템 콜에는 read(), write()가 있다.

    cs(context switching):  초당 컨텍스트 스위칭 횟수
    Solaris에서 스케줄링은 커널 쓰레드 단위로 한다. 하나의 쓰레드가 실행되다가 쓰레드에게 주어진 시간을 다 사용하거나, 자발적인 sleep하거나, 자원이 준비되기를 기다리거나, 우선순위가 높은 쓰레드가 CPU를 사용하기 위해 대기하고 있으면, 다른 쓰레드로 전환이 발생한다. 이것을 컨텍스트 스위칭이라고 한다.

    cpu

    us   sy   id

    us:  user time
    sy:  system time
    id:  idle time

    Solaris 운영체제는 1초에 100번씩 CPU가 어떤 일을 하는지 조사한다. 이때 CPU가 user mode에서 작업을 실행하면 user_tick에 1을 증가 시키고, system mode에서 작업을 실행하면 system_tick에 1을 증가시킨다.
    CPU가 실행할 작업이 없어서 쉬고 있는 경우, I/O(block device: hard disk)를 기다리는 작업이 있으면 wait_tick에 1을 증가시키고, 그렇지 않으면 idle_tick에 1을 증가시킨다.
    vmstat나 sar 명령어는 이러한 값을 시스템으로 부터 얻어서 주어진 시간간격(interval) 의 차이 값을 구하여 각각을 백분율(%)로 나타낸 것이 CPU 사용량이다.

              sar     vmstat              CPU
    ---------------------------------------------------
             %usr  =  us            run on user mode
             %sys  =  sy            run on system mode
    %wait + %idle  =  id            idle
    



    출처 : yeongnam.com

    'IT > Unix' 카테고리의 다른 글

    AIX Sar 설정  (0) 2009.04.27
    vi 특정 문자열 치환  (0) 2009.04.24
    Network 관련된 11개 파일  (0) 2009.02.26
    backup 관련 명령어 요약  (0) 2009.02.25
    DNS 설정  (0) 2009.02.05

    + Recent posts