본문 바로가기
IT이야기/리눅스

vmstat 명령어 정리

by somick 2020. 7. 30.

참고 사이트

vmstat명령의 출력결과

# vmstat 1 60
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 1798272 219212 2574524    0    0     0   108 4206 3587  18  2 81  0  0
 0  0      0 1793808 219212 2574516    0    0    24     0 5670 4096  18  2 79  0  0
 0  0      0 1746812 219212 2574544    0    0     0    96 6385 4475  29  3 69  0  0
 0  0      0 1783056 219212 2574544    0    0     0     0 4009 3536  11  2 87  0  0
 0  0      0 1785412 219212 2574576    0    0     0     0 4693 3654  32  2 66  0  0
 4  0      0 1810764 219212 2574636    0    0     0    88 6750 4793  35  3 62  0  0
 2  0      0 1834048 219212 2574644    0    0     0     0 5463 3910  36  2 62  0  0
 4  0      0 1792416 219212 2574668    0    0     0    48 6227 4308  39  2 60  0  0
 0  0      0 1809588 219212 2574660    0    0     0     0 6096 4225  36  3 61  0  0
 1  0      0 1826868 219212 2574672    0    0     0    88 5866 4182  23  2 75  0  0
 2  0      0 1769316 219212 2574680    0    0     0   156 5078 4353  22  1 76  0  0
 2  0      0 1789736 219212 2574688    0    0     0     0 4298 3666  17  2 82  0  0
 1  0      0 1857880 219212 2574692    0    0     0     0 3906 3404  17  2 81  0  0
 1  0      0 1801368 219212 2574696    0    0     0     0 4716 3654  25  2 73  0  0
 1  0      0 1862964 219212 2574708    0    0     0     0 4681 3656  20  1 79  0  0
 0  0      0 1827968 219212 2574712    0    0     0   204 4672 3740  21  1 78  1  0
 1  0      0 1781652 219212 2574876    0    0     0     0 4520 3681  17  2 81  0  0
 1  0      0 1782796 219212 2574912    0    0     0     0 3663 3274  14  1 85  0  0
 0  0      0 1842504 219212 2574932    0    0     0    72 5797 4339  18  1 80  0  0
 0  0      0 1812392 219212 2574932    0    0     0     0 3821 3369  11  1 87  0  0
 1  0      0 1817764 219212 2574936    0    0     0     0 4100 3432  13  2 85  0  0
 2  0      0 1788996 219212 2574944    0    0     0     0 4565 3737  14  2 84  0  0
 1  0      0 1806572 219212 2574972    0    0     0   100 5402 4074  26  2 72  0  0
 0  0      0 1804592 219212 2575008    0    0     0   128 5134 4168  14  2 84  0  0

실제로는 칼럼구분이 보기 힘들게 표시 되기 때문에 여기서는 알기 쉽도록 수정을 했다.

 

Field

Process

  • r : run queue에 쌓인 실행대기 프로세스 수. 이 값이 높다는 것은 CPU에 부하(load)가 발생하고 있다는 의미.
  • b : 메모리 페이징과 같은 I/O자원에 대해 프로세스를 할당받지 못해 대기하고 있는 프로세스 수.

시스템 부하 발생시 r에서 프로세스를 할당 받아 메모리나 디스크에 쓰려고 하는데 자원할당을 받지 못하여 대기하고 있는 경우 b가 발생한다. 디스크의 IO성능이 전체 시스템 성능에 큰 영향을 끼치는 이유 중의 하나다. 즉 r이 발생한다고 하여 CPU 업그레이드가 필요하다는 것은 아니다.

Memory

free메모리가 서버의 물리 memory사이즈의 6%보다 적은 상태가 계속 유지된다면 가용메모리 부족이 의심되며 전체 시스템병목(bottleneck)가 발생할 가능성이 높다는 것을 의미한다.

  • swpd : 현재 사용중인 가상 메모리 사이즈
  • free : 현재 사용가능한 유휴 메모리 사이즈
  • buff : buffer로 할당된 메모리 사이즈
  • cache : cache로 할당된 메모리 사이즈
  • inact : the amount of inactive memory (-a 옵션 사용시 표시)
  • active : the amount of active memory (-a 옵션 사용시 표시)

Linux에서 메모리 상황은 free, buff, cache를 같이 살펴봐야 한다. linux에서는 유휴 메모리를 활요하기 위한 방편으로 buffer와 cache로 할당하고 메모리의 요청이 들어오면 메모리를 해제하여 free 메모리로 반환 한다.

  • buffer는 파일시스템의 메타데이터(inode등)가 저장된다.  이로 인하여 디스크의 seek 타임을 최소화 하여 성능향상을 꾀할 수 있다. 메타데이터는 용량이 적기 때문에 메모리 할당량도 적은 편이다.
  • cache는 파일의 실제 데이터를 caching하고 있는 공간으로서 빠른 응답과 read time의 성능이 향상된다. cache의 경우에는 cache hit ratio가 중요한데 아무리 많은 데이터를 caching하고 있어도 cache에 없는 데이터가 요구 된다면 매번 디스크로부터 읽어들어야 하기 때문이다.

cachestat같은 툴을 이용하여 hit ratio를 체크할 수 있으니 cache가 여유가 있는데 si,so가 매번 발생한다면 cache를 조정하는 것도 검토할 만 하다.

/proc/sys/vm/vfs_cache_pressure에서 buff와 cache비율을 설정할 수 있으며 기본값은 100이다. 숫자를 높게 설정하면 buffer 비율을 높이게 되고 낮게 설정하면 cahce 비율을 높게 한다. 파일의 개수가 많고 랜덤한 read seek time이 중요한 시스템이라면 숫자를 높게 설정하여 buffer에 대한 비율을 높게 해주는게 좋고, cache hit ratio가 높고 cache가 중요한 시스템이라면 숫자를 낮게 설정하여 cache 비율을 높게 해주는 좋다.

 

Kernel은 유휴 메모리를 최대한 cache에 사용하려고 하기 때문에 cache hit ratio가 낮은 시스템이라면 /proc/sys/vm/min_free_kbytes(최소 free 메모리 사이즈)를 높게 설정하여 cache 비율을 낮추게 하는 방법도 있다.

Swap

메모리 고갈현상으로 인해 발생하는 경우가 대부분으로 메모리 튜닝이나 증설의 검토가 필요하다.

  • si : CPU에서 사용하기 위해 데이터를 디스크에서 메모리로 읽어들이는(swap in)  초당 사이즈
  • so : 메모리 확보를 위해 데이터를 디스크로 출력하는(swap out) 초당 사이즈

메모리가 모자랄 경우 디스크를 이용한 가상메모리를 이용하게 되는데 이때 성능저하가 발생하므로 메모리가 충분하다면 swap은 발생하지 않도록 조정한다. 커널 2.6 부터 /proc/sys/vm/swappiness를 이용하여 cache/swaping을 조정할 수 있다. 메모리가 가득 차면 cache된 데이터를 swap 시키는데 /proc/sys/vm/swappiness의 값을 디폴트인 60보다 높게 설정하면 cache삭제 보다 swaping 하는 비율이 높아지고, 낮게 설정하면 swaping 시키는 것보다 삭제하는 비율이 높아진다.

즉 값을 0으로 설정하면 disk와 memory간의 데이터 전송이 발생하지 않는다. 그러므로 실제 메모리가 적어서 swap이 자주 발생하는 시스템에서는 0으로 설정하지 않도록 한다. 실제 메모리 사용량은 적은데 swpd가 발생하거나 si/so가 늘어난다면 메모리 누수를 의심하는게 좋겠다.

 

최근에는 메모리와 디스크 가격이 하락했기 때문에 swap용량에 대해 여러가지 의견이 있지만 swap/memory를 1:1로 설정하고 메모리 사용량을 체크하여 swappines 값을 조절하는게 좋을 것 같다.

IO

  • bi : 블록 디바이스로부터 전송받은 초당 블록 수(read)
  • bo : 블록 디바이스에 전송한 초당 블록 수(write)

여기서 블록 디바이스란 디스크를 의미하며 표시되는 수치는 각 디스크의 logical sector size를 의미한다.  이 sector size는 이전엔 512byte였으나 최근들어 4kbyte로 계산된다. 이 sector size는 저장되는 데이터가 ‘사이즈가 작고 많은 수의 파일’ 인지 ‘사이즈가 크고 적은 수의 파일’인가에 따라 적정값이 바뀌니 각 시스템에 맞는 sector size를 적용시키는 게 좋다. 이 값은 단순히 디스크의 I/O 부하에 대한 지표로서 활용하면 큰 문제는 없을 듯 하다.

System

  • in : 초당 인터럽트 수
  • cs : 초당 컨텍스트 스위치 수

인터럽트란 irq(간단하게 말해 주변장치, 마우스/키보드/사운드카드/디스크/인터페이스 등등)로부터의 CPU 자원요청을 말한다. 서버에서는 인터페이스와 디스크의 인터럽트가 대부분을 차지 않을까 싶다.

context switch에 대해 말하자면 먼저 context를 알아야 겠다. context란 하나의 쓰레드가 사용하는 CPU의 레지스터 세트를 의미한다. 간단하게 말해 쓰레드가 예약한 CPU 자원블록이라 하겠다. Multi thread를 구현하기 위해서는 하나의 쓰레드를 완료될때까지 계속 실행해서는 안되고 여러 쓰레드를 돌려가며(switch) 실행할 필요가 있다. 이때 쓰레드간의 이동을 context switch라고 하고 cs는 그 초당 횟수를 표시하여 준다.

 

이렇게 프로세서를 효율적으로 이용하기 위한 방식으로 시분할방식/우선순위처리방식/하이퍼쓰레딩 등이 있다. 많은 쓰레드로부터 많은 처리요청이 있다면 context switch도 대량으로 발생하겠다.

CPU

  • us : user가 사용한 CPU의 시간비율, nice time포함(non-kernel code)
  • sy : system이 사용한 CPU의 시간비율(kernel code)
  • id : idle 시간비율, IO-wait time을 포함
  • wa : IO wating 시간비율, idle에 합쳐서 표시됨
  • st : Time stolen from a virtual machine

us가 높다면 software적 요소를, sy가 높다면 hardwea적 요소를 확인할 필요가 있다. id는 코어의 통합된 값을 표시하여 주기 때문에 sar -P ALL이나 top에서 1을 입력하여 각 코어별 idle을 확인할 필요가 있다. 특정 코어만 idle이 낮거나 하다면 software의 수정이 필요할 수도 있겠다. 만약 전체적으로 idle이 항상 부족한 상황이라면 CPU의 파워의 증설이나 다른 요인을 검토해 보는것이 좋다.

응용편

서버부하 발생시

  • b : CPU 코어보다 높은 수치일 경우, disk write의 병합이 원인일 가능성이 높다.
  • wa : 이 필드값이 높아질 경우 disk read의 병합이 원인일 가능성이 높다.
  • si,so : 위의 b발생에 의한 메모리 고갈이 발생한 상태다.

 

 

 

 

 

댓글