레퍼런스 : 복사 http://blog.naver.com/ares2011/50023242845

사실 다른 사람이 쓴 것 퍼오는 이유 중 하나는 즐겨찾기를 했는데 나중에 해당 페이지가 삭제되서 못찾을 때의 난감함 때문이다.--;
이 아래부터 퍼온 것.



vmstat를 이용하여 cpu와 i/o 활동을 모니터링을 할 수가 있다.
첫번째 줄은 무시한다.(첫줄은 부팅 이후의 각 통계치에 대한 평균값을 보여준다.)

vmstat에서 중요한 것은 procs 영역의 b 필드이다. b의 수치가 높은 경우 i/o 작업을 위해 cpu가 계속 대기 상태로 있는 경우다.
이런 경우에는 디스크i/o 문제를 확인함.

스왑아웃(so)이 지속적으로 발생한다면 메모리가 부족한 것이다. 하지만 일정간격으로 스왑아웃이 발생되는 것은 정상적이다.
스왑아웃(so)필드는 항상 0에 가까워야 한다.

 # vmstat 1
 procs     memory                       page                disk              faults           cpu
 r b w   swap     free      re  mf    pi po fr de sr s6 s1 s1 s1   in    sy     cs  us  sy  id
 0 0 0 20719952 5846888 1235 9503 0  0   0  0   0  0   0   0   0  462 11337  1085 14  12  75
 0 0 0 20719864 5846792 1228 9315 0  0   0  0   0  0   0   0   0  250 10729  1029 13  13  74
 0 0 0 20720224 5847424 1261 9514 0  0   0  0   0  0   0   0   0  262 10909  1023 15  11  74

 

각 항목 설명
procs :  세가지 상태에 있는 프로세스들의 수

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 : In run queue - CPU를 사용하기 위해 Run Queue에서 대기하고 있는 쓰레드의 수 (2 이상이면 CPU busy)

    b : Blocked for resources(I/O, paging, etc.) - IO나 이벤트가 완료되기를 기다리며 sleep하는 쓰레드의 수

        CPU 성능과 관계가 없는 필드이다. Disk의 I/O가 느리기 때문에 b 필드의 수치가 발생한다.

       w : threads swapped out - swap out된 실행가능한 쓰레드의 수 (0 이상이면 메모리가 부족하여 메모리 증설을 고려 한다.)

        시스템의 메모리가 부족할 때 paging이 일어나는데, 페이징으로도 부족한 메모리를 보충하지 못하면 swapping이 일어난다. 이때 메모리로 부터 빠져나기 swap 디바이스에 보관된 쓰레드의 갯수를 w에 보여준다. 한번 swapout된 쓰레드는 그 쓰레드가 다시 실행될 때 물리적 메모리로 들어온다 

        paging이란... 즉 물리적인 메모리의 크기는 한정되어 있기 때문에 실제 메모리의 크기보다 더 큰 메모리가 있는 것처럼 속여서 메모리를 사용하는데 이러한 방법을 가상 메모리 기법이라고 한다. 물론 메모리상에 항상 올라가 있는 프로세스도 있지만 (즉, 커널과 같은 시스템 프로세스) 대부분의 사용자 프로세스들은 실행시에만 메모리에 올라가기 때문에 자주 사용되지 않는 프로세스들은 굳이 메모리상에 있을 필요가 없다. 그래서 이런 놈들은 스왑이라는 영역에 잠시 내려 놓았다가(스왑아웃) 필요할때 다시 메모리로 불러들인다.
        이렇게 메모리에서 스왑으로 왔다 갔다하는 것을 스왑핑(swaping)이라고 한다. 근데 왜 paging을 설명하면 swaping을 얘기했냐?  왜냐면 이 두놈은 같은 개념이다. page가 뭐냐면 앞에서 얘기한 가상 메모리 기법을 사용하기 위해서 메모리를 일정 크기로 나누어 놓거든. 이렇게 나눈 것을 page라고 부르지. 예를 들어 13K의 메모리를 차지하고 있는 프로세스를 스왑아웃하려 할때 실제 스왑아웃된 영역의 크기는 얼마를 차지하느냐? 페이지 단위로 스와핑이 일어나기 때문에 만약 시스템의 페이지 사이즈가 4k면 16k의 영역을 차지한다는 거지...  근데 이게 맞나 모르겠다.

     memory : virtual and real memory의 사용에 관한 정보(?)
    swap : amount of swap space currently available (Kbytes)

    사용 가능한 가상 메모리(physical memory + swap device)의 크기를 나타낸다.

     free : size of the free list(말안해도 뭔지 알겠지?) - size of the free list (Kbytes)

    사용 가능한 physical memory 의 크기를 나타낸다.

     disk - f0, s0,s1, s4

     최대 4개의 디스크에 대하여 초당 read/write 횟수를 나타낸다.

     

    page : page에 관한 정보(썰렁)
    re : page reclaims

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

     

    at : 주소 변환에 실패한 페이지?

    pi : page in 되는 페이지 수
    디스크로 paged out한 페이지를 다시 메모리에서 읽을 때, 읽은 페이지를 KB로 환산한 값이다.

    po : page out 되는 페이지 수
    프리 시킬 페이지의 내용이 파일 시스템의 캐쉬일 때 해당 디스크 파티션에 저장을 하는데, 이때 디스크에 저장된 페이지를 KB로 환산
    한 값이다.

    fr : pages freed per second

    sr 필드 값(스캔한 페이지의 개수)을 KB 단위로 환산한 값이다.

    de : Anticipated short term memory shortfail (어렵다, 어려워...)

    sr : Pages scanned by clock algorithm. per second

    free physical memory가 전체 physical memory 양의 1/64보다 크게 만들기 위해서 시스템에 있는 페이지를 스캔하여 최근에 사용되지
    않는 페이지를 찾아 프리 시킨다. 이때 스캔한 페이지의 개수

     

    faults 시간 간격 동안 페이지 폴트의 수
    in : Device interrupts per second - 초당 인터럽드 횟수(clock interrupt 제외)

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

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

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

     

    여기서 잠깐 페이지 폴트란? 일단 실제 메모리 보다 큰 가상의 메모리 주소를 사용한다고 앞에서 얘기했다. 이 가상메모리 주소는 실제 사

    용될시에는 실제 물리적 메모리 주소와 Mapping이 되야한다. 바로 이때 Mapping이 안되서 CPU가 trap요청하는데 이것이 바로 페이지 폴트다. 이렇게 페이지 폴트가 일어나면 아까 얘기한 것처럼 오래된 놈 하나를 스왑영역으로 page out시켜버려 가상메모리 주소가 물리적
    메모리 주소에 Mapping할 수 있도록 공간을 만들어 준다. 그리고 나서야 트랩된 명령어의 실행을 다시 시작한다.

     

    cpu

    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
    


    us : 사용자 프로세스가 사용하는 총 CPU시간의 비율
         (이건 시스템 프로세스보다 우선순위가 낮은 사용자 프로세스가 사용하는 CPU시간이고...)
    sy : 시스템 부하로 사용하는 총 CPU시간의 비율
        (시스템이 사용하는 CPU시간을 말하는 거겠지.)
    id : 놀고 있는 CPU시간의 비율

    '서버 이야기 > Linux 이야기' 카테고리의 다른 글

    Linux screen 사용하기  (0) 2010.11.30
    리눅스에서 FTP로 사용하기  (0) 2010.02.18
    Crontab 설정 하기  (0) 2010.02.02
    리눅스 명령어 모음  (0) 2009.08.05
    apache 재시작 문제  (0) 2009.07.31
    Posted by 서오석
    ,