반응형
출처 : http://nicejoo.blogspot.kr/2012/02/memory-leak.html
출처 : http://stormaa.tistory.com/5
출처 : http://ysoftman.blogspot.kr/2012/05/linux-valgrind.html
출처 : http://www.solanara.net/solanara/memoryleak ( 다양한 릭 디텍팅 방식 가이드)
출처 : http://h21007.www2.hp.com/portal/download/files/unprot/devresource/Tools/wdb/doc/011310/memdebug-updated.pdf (WDB)
-----------------------------------------------------------------------------------------------

1. Valgrind 설치

wget http://www.valgrind.org/downloads/valgrind-3.3.0.tar.bz2(새 창으로 열기)
tar xvfj valgrind-3.3.0.tar.bz2
cd valgrind-3.3.0
./configure
make
make install

2. Valgrind 테스트
valgrind --leak-check=yes main

3. 간단 실행법
valgrind --tool=memcheck --leak-check=full --show-reachable=yes --log-file=memcheck.txt [프로그램] [실행인자들...]
valgrind --leak-check=full --log-file=memcheck.txt -v --error-limit=no [프로그램경로] [인자]


--leak-check=full : 메모릭에러가 날 경우 소스파일명과 라인위치 출력

               이 옵션을 사용할려면 디버깅컴파일을 해야합니다. (컴파일시 -g 옵션)
--log-file : 체크결과를 저장할 로그파일명


// 항목별 메모리 블럭 누수를 확인 할 수 있다.
definitely lost: 블럭 해제(free) 코드를 사용하지 않은 명백한 메모리 누수가 있음을 나타낸다.
indirectly lost: 블럭을 가르키는 포인터를 상실한 경우로 예를들어 이진트리의 루트노드를 잃어버리면 자식 노드 블럭 포인터를 간접적으로 잃어버리는 경우를 나타낸다.
possibly lost: 내부 포인터가 해제 되지 않은 경우로, 자신이 모르는 내부 포인터인 경우 신경 쓰지 않아도 된다.
still reachable: 메모리 블럭을 아직까지 사용하고 있는 경우, 프로그램 종료되기전에 해제해야될 메모리 블럭을 나타낸다.


반응형

'UTIL > Leak Detect' 카테고리의 다른 글

Monitoring and Tuning Memory Use  (0) 2015.08.17
반응형

출처 : http://community.snu.ac.kr/blog/blog.log.view.screen.do?blogId=145&logId=333


시스템의 메모리는 항상 거의 다 채워진 상태로 사용된다. 현재 실행되는 프로그램이 모든 메모리를 사용하고 있지 않을지라도 운영체제는 이전에 실행된 프로그램의 텍스트나 파일들을 메모리에 보관하고 있다. 이렇게 보관하는 것으로 인한 시스템 부하는 없다. 왜냐하면, 어쨌든 메모리가 사용되고 있는 것이 아니기 때문이다. 메모리에 보관되고 있는 프로그램이나 파일들이 다시 사용되게 될 때, 추가적인 디스크 I/O를 줄일 수 있는 장점이 있다.


ꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏ

Determining How Much Memory Is Being Used


vmstat

  현재 시스템의 모든 프로세스가 사용하고 있는 가상 메모리(active virtual memeory)와 free list에 등록된 실 메모리의 여유공간을 보여준다.

  시스템의 메모리가 부족한지 튜닝이 필요한지는 vmstat 명령을 여러번 일정한 간격으로 실행하여 pi, po 필드의 값을 검사하여 지속적으로 1이상의 값이 나오면, 메모리가 성능의 제약이 되고 있다고 볼 수 있다. 가끔씩 1 이상의 값이 나오는 것은 무시해도 된다.

  높은 wa와 b 필드값이 동시에 표시되는 경우는 페이징 스페이스에 대한 I/O 때문인 경우가 대부분이다.

kthr     memory             page              faults        cpu

----- ----------- ------------------------ ------------ -----------

 r  b   avm   fre  re  pi  po  fr   sr  cy  in   sy  cs us sy id wa

 1  1 37636  1757   0   0   0   2    9   0 468  320 348  0  0 99  0

 0  0 37642  1751   0   0   0   0    0   0 454 1354 357  0  0 99  0

 0  0 37642  1751   0   0   0   0    0   0 452 1301 345  0  0 99  0

 0  0 37643  1750   0   0   0   0    0   0 453 1302 349  0  0 99  0

 0  0 37643  1750   0   0   0   0    0   0 452 1298 345  0  0 99  0

 0  0 37643  1750   0   0   0   0    0   0 453 1299 343  0  0 99  0


VMM과 관련된 성능 문제를 확인하기 위해서는 memory, page 부분을 검사한다.

․ memory

  - avm(active virtual memory)

디폴트 정책인 deferred page space policy를 사용하는 경우에는 이 값이 사용되는 페이징 공간의 크기보다 클 수 있다. 이 값에 file page를 포함되지 않는다.

  - fre

4KB 단위의 사용가능한 실 메모리 페이지 수. free list의 최소유지 값은 vmtune의 minfree 파라미터에 의해서 결정된다. 응용 프로그램이 실행 종료되면, 모든 working page는 즉시 free list에 등록되지만, file page는 메모리에 남게 된다. 만일, 해당 파일이 지워지게 되면, file page도 free list에 등록된다. 이와 같은 이유 때문에 fre 필드의 값이 실제로 시스템의 가용 메모리를 나타낸다고 할 수 없는 것이다.

․ page

  - re

4 버전 이상에서는 더 이상 의미가 없다.

  - pi

페이징 공간에서부터 메모리로 읽혀진 페이지 수. 페이징 공간은 디스크에 존재하며, 메모리에 여유 공간이 없을 경우, 사용된다. pi 필드 값이 존재한다면, 이전에 po 필드에 해당하는 페이지가 out된 기록이 있게 된다. 초당 5이상의 값이 일반적인 기준으로 사용되며, 환경에 따라 달라진다. 절대적인 기준이란 있을 수 없다.

  - po

메모리 부족으로 인해 페이징 공간으로 out된 페이지 수.

  - fr/sr

vmtune의 minfree 파라미터 값 이하로 fr 컬럼의 페이지 수가 감소하게 되면, 페이지 교체 알고리즘이 적용된다. 따라서, VMM은 필요한 메모리를 확보하기 위해서 PFT(page frame table)을 검사하여 할당 해제할 페이지를 찾는다. maxfree 값까지 free 메모리 페이지를 확보할 때까지 페이지를 검사하는데, 이 때 검사한 페이지 수를 sr 필드에 표시하며, 결과적으로 할당 해제된 페이지 수를 fr 필드에 표시하게 된다. 메모리에 사용되지 않는 file page가 많다면, 할당 해제할 페이지를 쉽게 찾을 수 있을 것이며, 이때, sr값이 fr보다 별로 크지 않을 것이다. fr:sr의 비가 높을수록 메모리가 부족하다는 의미다. 1:4(fr:sr) 이라면, 하나의 여유 메모리를 확보하기 위해서  4개의 페이지를 검사해야만 한다는 뜻이다.

  - cy

페이지 교체를 위해서 PFT를 scan한 초당 횟수. 보통, PFT를 다 검사하는 경우는 없으므로 이 필드 값은 보통 0으로 표시된다. 만약, 이 필드 값이 0이 아니다면, 페이지 교체를 위해서 PFT를 검사하는데, 다 검사하도록 원하는 페이지를 얻을 수 없었다는 의미로 시스템의 메모리가 거의 모두 사용되고 있다는 의미다.


  시스템의 RAM이 어느 정도가 필요하나를 대략적으로 추정하는 방법은 vmstat의 avm의 최대값이 얼마인가를 보는 것이다. 이상적으로는 avm 값이 메모리보다 작아야 한다. 이 2값의 차이만큼 페이징이 발생했다는 것을 의미한다. avm이 RAM양 보다 적은데도 페이징 공간에 대한 페이징이 발생한다면, 실 메모리가 file page로 많이 사용되기 때문이다. 이러한 경우에는 minperm/maxperm 파라미터 값을 조절할 수 있다.


vmstat -I

  kthr      memory             page              faults        cpu

-------- -----------   ------------------------ ------------ -----------

 r  b  p   avm    fre    fi  fo  pi  po  fr  sr   in   sy     cs  us sy id wa

 2  1  0 1490301  1396   3   2   0   0   1    4 2719 141591 49393 10 12 78  1

 p 필드는 raw device에 대한 I/O를 기다리는 쓰레드로 파일 시스템에 대한 것은 포함되지 않는다. fi/fo는 file page에 대한 페이징이다.


vmstat -s

  시스템이 부팅된 이후부터의 누적된 통계치를 보여준다. 메모리 사용에 대한 정보를 얻기 위해서는 이 명령을 주기적으로 수행하여 결과치의 차이를 보아야 한다.


ps

  ps v PID 명령을 통해서 각 프로세스마다의 메모리 사용을 알 수 있다.

# ps v 52930

   PID    TTY STAT  TIME PGIN  SIZE   RSS   LIM  TSIZ   TRS %CPU %MEM COMMAND

 52930      - A     7:17  484  2424   208    xx   370    24  0.0  0.0 ./ns-admi

PGIN

    페이지 폴트로 인해 발생한 page in 수

    모든 페이지 폴트는 I/O 유발하므로 I/O 규모 측정에 사용될 수 있다.

SIZE

    프로세스의 데이터 부분의 가상 크기(페이징 공간), KB 단위

    프로세스의 working segment pages 수와 동일하다.

    다른 플래그의 SZ 필드와 동일하다.

    일부 페이지가 page-out 된 경우에는 사용하고 있는 실 메모리 양보다 크게 표시됨

    private segment, shared-library data segment를 포함하고 있다.

RSS

    프로세스의 실 메모리 크기, KB 단위

    working segment + code segment

    code segment는 프로그램의 모든 인스턴스에 의해서 공유된다.

TSIZ

    프로그램의 text section 크기.

    프로그램의 text section은 touch 될 경우에만 메모리로 로드된다.

    이 값은 active memory 사용량에는 영향을 주지 않는다.

    dump -ov 명령을 통해서 알아낼 수 있다.

TRS

    resident set of text size, number of code segment pages

    인스턴스가 많은 프로그램의 경우, 메모리 사용량을 과장해서 보여준다.

    TSIZ 보다 크게 나오는데, 그 이유는 다른 헤더 정보 등이 추가되기 때문이다.

%MEM

    프로그램이 사용하는 메모리를 전체 메모리로 나눈 것.

    RSS처럼 메모리 사용이 과장되게 나올 수 있다.


※ ps 명령은 shared memory segment나 memory-mapped segment에 의해서 사용되는 메모리는 포함하고 있지 않다. 따라서, 보다 정확한 정보를 보기 위해서는 svmon 명령을 사용해야 한다.

# dump -ov /usr/bin/ksh

/usr/bin/ksh:

                        ***Object Module Header***

# Sections      Symbol Ptr      # Symbols       Opt Hdr Len     Flags

         4      0x00000000              0                72     0x1007

Flags=( RELFLG EXEC LNNO DYNLOAD )

Timestamp = "Apr 04 06:19:10 2003"

Magic = 0x1df  (32-bit XCOFF)

                        ***Optional Header***

Tsize        Dsize       Bsize       Tstart      Dstart

0x0002ed30  0x00005858  0x000073b8  0x10000100  0x20000e30

SNloader     SNentry     SNtext      SNtoc       SNdata

0x0004      0x0002      0x0001      0x0002      0x0002

TXTalign     DATAalign   TOC         vstamp      entry

0x0005      0x0003      0x200061d0  0x0001      0x20005ee0

maxSTACK     maxDATA     SNbss       magic       modtype

0x00000000  0x00000000  0x0003      0x010b        1L

ftp:/home/admin> ps v 14596

   PID    TTY STAT  TIME PGIN  SIZE   RSS   LIM  TSIZ   TRS %CPU %MEM COMMAND

 14596  pts/0 A     0:00   76   568   788 32768   188   224  0.0  0.0 /usr/bin/


svmon


  현재 메모리에 대한 snapshot을 잡은 것이지만, 사용자 인터럽트를 사용하는 것이므로 진정한 의미의  snapshot이라 할 수 없다.


How Much Memory is in Use

# svmon -G

               size      inuse       free        pin    virtual

memory      2359296    2357650       1646     398806    1492391

pg space    1589248     163665

               work       pers       clnt      lpage

pin          398806          0          0          0

in use      1402168          0     955482          0

․ memory

    size : total size of memory(4KB)

    inuse = size - free

    free : free list 의 페이지 수

    pin : RAM에 pinned된 페이지 수

․ in use / pin

    work : working pages

    pers : persistent pages

    clnt : client pages(remote file pages)


Who is Using Memory?

# svmon -Put 10

-------------------------------------------------------------------------------

     Pid Command          Inuse      Pin     Pgsp  Virtual 64-bit Mthrd LPage

   16952 atmsvcd           7482     2485     2011     9152      N     N     N

    Vsid      Esid Type Description              LPage  Inuse   Pin Pgsp Virtual

       0         0 work kernel seg                   -   3901  2483 1593  4576

    f01e         d work shared library text          -   2723     0   34  3573

    9d33         2 work process private              -    611     2  381   992

    2084         - pers /dev/hd2:10282               -    126     0    -     -

    c999         - pers /dev/hd2:10303               -     40     0    -     -

     1a0         1 pers code,/dev/hd2:5656           -     31     0    -     -

    508a         - pers /dev/hd2:10287               -     17     0    -     -

    708e         - pers /dev/hd2:10288               -      9     0    -     -

    60cc         - pers /dev/hd4:4120                -      6     0    -     -

    dd3b         f work shared library data          -      4     0    3    11

    50ca         - pers /dev/hd4:4123                -      4     0    -     -

    606c         - pers /dev/hd2:10283               -      3     0    -     -

    21c4         - pers /dev/hd2:10304               -      3     0    -     -

    . . . .

  결과는 요약부분과 상세 설명 부분으로 나뉘며, 메모리 사용량이 많은 프로세스부터 상위 10개를 보여준다.

  segment는 여러 프로세스에 의해서 공유될 수 있는데, 그런 세스먼트에 속하는 페이지는 여러 프로세스에 중복되어 나타날 수 있다. 따라서, inuse 필드 값을 다 더하면, 실 메모리 양보다 많아지게 된다.

  segment id=2084 는 persistent segment이며, /dev/hd2, 즉, /usr 파일시스템에 속하는 파일이며, 126페이지가 실 메모리에 있으며, 페이징 공간에 페이징 되지는 않은 상태이다.

  segment id=60cc는 / 파일시스템에 속하며, 해당 파일의 inode 값은 4120이다.

# ncheck -i 4120 /

4120    /etc/objrepos/CuAt

# find / -xdev -inum 4120 -print

/etc/objrepos/CuAt

Vsid는 virtual segment ID, Esid는 effective segment ID이고 해당 페이지에 접근하는데 사용되는 segment register를 반영한다.


Detailed Information on a Specific Segment ID

# svmon -D 9d33 -b

Segid: 9d33

Type:  working

LPage: N

Address Range: 0..995 : 65312..65535

Size of page space allocation: 381 pages (  1.5 MB)

Virtual: 992 frames ( 3.9 MB)

Inuse: 611 frames ( 2.4 MB)

           Page      Frame    Pin        Ref        Mod  ExtSegid    ExtPage

          65339      80707     Y          Y          Y         -          -

          65340      80708     Y          Y          Y         -          -

          65314      80374     N          Y          Y         -          -

             26      80413     N          Y          Y         -          -

          65338      78852     N          Y          Y         -          -

          65341      81922     N          Y          Y         -          -

          65337      82007     N          Y          Y         -          -

             25      80174     N          Y          Y         -          -

  2개 페이지가 메모리에 pinned 되어 있으며, 대부분의 페이지가 현재 참조되고 있고 변경되어 있다는 것을 알 수 있다. 이는 working segment 이기 때문이다.

※ -D 옵션을 사용하면, 성능에 영향을 주므로 주의해서 사용해야 한다.


List of Top Memory Usage of Segments

# svmon -Sut 10


    Vsid      Esid Type Description              LPage  Inuse   Pin Pgsp Virtual

    4e00         - pers /dev/backup:17               -  71465     0    -     -

    780f         - work kernel heap                  -   7214  3787  329  7245

    8c38         - pers /dev/backup:27               -   6025     0    -     -

    700e         - work misc kernel tables           -   4886     0  673  4886

       0         - work kernel seg                   -   3901  2483 1593  4576

    f01e         - work                              -   2718     0   34  3573

    19ea         - pers large file /dev/hd9var:247   -   2237     0    -     -

    8010         - work page frame table             -   1899  1899    0  1899

    fa56         - pers /dev/backup:24               -   1766     0    -     -

    8831         - work                              -   1665  1665    0  1665


svmon and vmstat

  vmstat free 필드 = svmon memory free 필드

  vmstat avm 필드 = svmon memory virtual 필드


svmon and ps

# svmon -P 9088


-------------------------------------------------------------------------------

     Pid Command          Inuse      Pin     Pgsp  Virtual 64-bit Mthrd LPage

    9088 bash              6882     2485     1627     8277      N     N     N


    Vsid      Esid Type Description              LPage  Inuse   Pin Pgsp Virtual

       0         0 work kernel seg                   -   3901  2483 1593  4576

    f01e         d work shared library text          -   2718     0   34  3573

    748e         1 pers code,/dev/hd10opt:2421       -    135     0    -     -

    4a80         2 work process private              -     91     2    0    91

    5a82         f work shared library data          -     37     0    0    37

    6de5         - pers /dev/hd2:12307               -      0     0    -     -

# ps v 9088

   PID    TTY STAT  TIME PGIN  SIZE   RSS   LIM  TSIZ   TRS %CPU %MEM COMMAND

  9088  pts/0 A     0:00    2   512  1052 32768   498   540  0.0  0.0 bash


SIZE = virtual size in KB of data section of the process in paging space

      = number of working segment pages of the process have been touched

      = svmon의 private, lib data에서 Virtual 필드 값

      = 91 + 37 pages = 128 × 4 KB = 512

RSS = real memory size in KB of the process

     = sum of the number of working and code segment pages in memory

     = 91 + 37 + 135 pages = 263 × 4 KB = 1052

TRS = size of real memory of text

     = number of code segment pages(not include the shared text of the process)

     = 135 pages = 135 × 4 KB = 540


Calculating Minimum Memory Requirement of a Program


  total memory = T + ( N × ( PD + LD ) ) + F

    T : Number of pages for text(shared by all users)

    N : Number of instance of program

    PD : working segment pages in process private segment

    LD : shared library data pages used by the process

    F : file pages (shared by all users)

예) # svmon -P 8956

-------------------------------------------------------------------------------

     Pid Command          Inuse      Pin     Pgsp  Virtual 64-bit Mthrd LPage

    8956 cron              6796     2485     1627     8260      N     N     N

    Vsid      Esid Type Description              LPage  Inuse   Pin Pgsp Virtual

       0         0 work kernel seg                   -   3901  2483 1593  4576

    f01e         d work shared library text          -   2718     0   34  3573

    91d2         2 work process private              -     65     2    0    65

    92d2         f work shared library data          -     46     0    0    46

    3ac7         - pers large file /dev/hd9var:21    -     46     0    -     -

    7acf         1 pers code,/dev/hd2:4256           -      8     0    -     -

    88b1         - pers /dev/hd2:6144                -      5     0    -     -

    70ae         - pers /dev/hd2:4099                -      3     0    -     -

    80b0         - pers /dev/hd2:2                   -      1     0    -     -

    18e3         - pers /dev/hd9var:17               -      1     0    -     -

      a0         - pers /dev/hd4:4103                -      1     0    -     -

    4088         - pers /dev/hd3:2                   -      1     0    -     -

    52ca         - pers /dev/hd2:78282               -      0     0    -     -

   T : 7acf = 8

   PD : 91d2 = 65

   LD : 92d2 = 46

   F : 88b1, 70ae, 80b0, 18e3, a0, 4088, 52ca = 12


ꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏ

Finding Memory-Leaking Programs


  memory leak은 프로그램 에러로 인해 메모리 해제를 하지 않고 계속 할당해서 사용함으로써 메모리가 부족하게 되는 현상이다. svmon 명령을 반복적으로 실행해서 프로세스의 working segment 영역이 계속해서 증가하는가를 검사한다. kernel segment의 leak은 mbuf leak이나 device driver, kernel extention, kernel 등에 의해서 발생할 수 있다.

  문제가 되는 서브루틴이나 코드의 줄을 구분하는 것은 매우 어려운 일이다. realloc()은 실제로 에러가 아닌 경우에도 memory leak과 같은 현상을 발생시키게 된다. realloc을 자주 사용하게 되면, 프로세스의 working segment가 점점 증가하게 된다.

  private working segment의 Inuse, Pgspace, Address Range 필드 값이 계속해서 증가할 경우, memory leak을 의심해야 한다.


ꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏ

RMSS simulation


  rmss(Reduced-Memory System Simulator)는 시스템의 메모리 보드를 교체하지 않고도 시스템의 메모리를 감소시킨 상황을 시뮬레이션할 수 있는 도구이다. 시스템의 메모리를 감소시키면서 시스템의 상황 변화를 모니터링 할 수 있다. rmss는 다음과 같은 질문에 답을 얻을 수 있는 자료를 제공한다.

  “일정한 성능을 얻기 위해 필요한 시스템의 메모리는 몇 MB인가?”

  “특정 메모리 양을 가지고 동시에 몇 명의 사용자에게 서비스를 할 수 있는가?”

  rmss는 capacity plan tool로 부하를 감당하기 위해 필요한 메모리 양을 산출하는데 이용되며, problem determination tool로도 사용될 수 있다.


2 Sytles of Using rmss

  - to change the memory size and exit

주어진 메모리 크기에서 응용 프로그램의 실행 상황을 살핀다. 응용 프로그램이 복잡하여 하나의 명령으로 실행할 수 없을 경우 또는 프로그램이 다수의 인스턴스로 실행되는 환경에서 사용한다.

  - as a driver program

응용 프로그램을 메모리 크기를 변화시켜 가면서 실행한다.

※ rmss 명령을 실행하기 전에, memory load control을 off로 설정해야 한다.

        /usr/samples/kernel/schedtune -h 0


to change the memory size and exit

  단위는 MB이며, 8MB에서 시스템 메모리 사이의 값을 줄 수 있다. 시스템의 환경에 따라서 어느 값이하로는 설정할 수 없을 수 있다. 그런 경우에는 에러 메시지를 보여준다.

  rmss는 free page frame의 페이지들을 unusable frame pool에 보관하는 방식으로 메모리를 줄이며, 메모리 크기를 원상태로 하면, pool에서 페이지들을 free list에 추가한다. 또한, rmss는 메모리 크기에 따라 자동적으로 시스템 환경변수와 데이터 구조를 변경한다. 변경하는데 걸리는 시간은 줄이는 메모리 크기에 비례한다.

  # rmss -c 128      memory size = 128 MB

  # rmss -p           current memory size

  # rmss -r           reset to total system memory size

※ rmss 명령은 실제로 사용 가능한 메모리 크기를 보여준다. 따라서, 메모리에 불량 부분이 있으면, 원래 값보다 적게 나온다. 성능에 대한 정보를 따로 제공하지 않기 때문에 다른 도구를 이용하여 성능을 측정하여야 한다.


as a driver program

  # rmss -s 시작메모리 -f 최소메모리 -d 변화량 -n 반복횟수 -o 결과파일 프로그램

  예) rmss -s 16 -f 8 -d 1 -n 1 -o rmss.out foo

Hostname:  widgeon.austin.ibm.com

Real memory size:   16.00 Mb

Time of day:  Thu Jan  6 19:04:04 2000

Command:  foo

Simulated memory size initialized to  16.00 Mb.

Number of iterations per memory size = 1 warm-up + 1 measured = 2.


Memory size  Avg. Pageins  Avg. Response Time    Avg. Pagein Rate

(megabytes)                     (sec.)           (pageins / sec.)

-----------------------------------------------------------------

16.00            115.0           123.9                 0.9

15.00            112.0           125.1                 0.9

14.00            179.0           126.2                 1.4

13.00             81.0           125.7                 0.6

12.00            403.0           132.0                 3.1

11.00            855.0           141.5                 6.0

10.00           1161.0           146.8                 7.9

9.00            1529.0           161.3                 9.5

8.00            2931.0           202.5                 14.5

Avg. Pageins : 프로그램 실행 동안 발생한 모든 page in

Avg. Response Time : 프로그램 실행 시간

Avg. Pagein Rate : Pageins의 평균 비율

  위의 예에서는 14MB까지는 성능에 별다른 영향이 없으나, 13MB 부터는 성능이 점점 저하되는 것을 볼 수 있다. 현재 16MB에서의 성능치가 만족할 수 없다고 메모리를 추가하는 것은 성능에 이점이 없다는 것을 보여준다.


ꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏ

Tuning VMM Memory Load Control


h parameter

  memory load control에 의해서 프로세스가 suspend되는 시점을 정의한다. 임계값을 측정하는데는 po, fr 2가지 값이 사용된다.

        

  h = 0으로 설정되면, 사용하지 않겠다는 의미이다. 메모리가 128MB 이상이라면 디폴트 값은 0이고, 그렇지 않으며, 6이다. 메모리가 128MB 이상인 경우에는 보통 memory load control을 사용하지 않은 경우가 thrashing 상황을 더 잘 처리한다.

  시스템 설정에 관계없이 po/fr 값이 낮으면, thrashing 상태가 아니다.

        # /usr/samples/kernel/schedtune -h 4

        # /usr/sbin/schedo -o v_repage_hi=4


p parameter

  중지시킬 프로세스를 선택하는 기준으로 사용된다.

  r : number of repages         f : number of page faults

        

  디폴트 값은 4이다. 따라서, r/f 값이 0.25 이상이면 프로세스가 thrashing 현상을 발생시키고 있다고 볼 수 있다.

        # /usr/samples/kernel/schedtune -p 6

        # /usr/sbin/schedo -o v_repage_proc=6


m parameter

  멀티 프로그램의 최소 한계로, 이 값은 active process 수로 지정된다. 실행되고 있거나 페이지 I/O를 기다리는 프로세스는 active process 이고, 이벤트를 기다리거나 중지된 프로세스나 wait 프로세스는 제외된다.

  memory load control이 실행되더라도 m개의 active process가 실행되고 있도록 하는 것이다.


w parameter

  중지된 프로세스가 기다려야 할 시간.


e parameter

  한 번 중지된 프로세스는 지정한 시간 동안은 다시 중지되지 않는다.


ꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏ

Tunning with vmtune


minfree and maxfree

  free list를 관리하는 파라미터로 minfree 값이하로 free list가 감소하면, 페이지 스틸이 발생하여 maxfree 값이 될 때까지 페이지 스틸이 이루어진다. 미리 free memory page를 확보함으로써 메모리 할당 요청에 대비하며, 불필요한 I/O 발생을 제거한다.

  디폴트 값은 다음과 같다.

        

        minfree = maxfree - 8

        단, (maxfree - minfree) >= maxpgahead

  memory pool이 하나 이상인 경우에는 각각의 memory pool에 대해서 파라미터 값을 지정할 수 있으며, vmtune에 표시되는 값은 모든 풀의 값을 더한 값이다.

  minfree 페이지는 그 만큼 메모리를 낭비하는 것이다. minfree는 미래의 메모리 할당 요청에 대해 대비하는 것으로 응용 프로그램의 종류와 메모리 사용하는 방식에 대해서 알면, 효과적으로 대처할 수 있다. minfree 값을 설정할 때, 주요 프로그램이 사용하는 메모리를 svmon으로 확인하여 필요한 만큼의 메모리를 minfree로 지정할 수 있다. 이 때의 어려움은 프로그램이 한 번에 많은 메모리를 요구하지 않을 수 있기 때문에 불필요하게 메모리를 낭비하는 결과를 가져올 수도 있기 때문이다.

  minfree = 120 × # of CPUs

  maxfree = minfree + 8 × # of CPUs

  maxfree - minfree <= 100


memory pool

        # vmtune -m N

        # vmo -r -o mempools=N

  시스템 부팅시 메모리 풀 수를 변경하게 된다. 이 값은 커널 설정 파일에 기록된다. 디폴트로는 /usr/lib/boot/unix_mp 파일이며, vmtune은 변경 이전의 파일을 .sav 로 저장한다.


lrubucket

        # vmtune -l N

        # vmo -o lrubucket=N

  대량의 메모리를 가진 시스템에서 LRU 알고리즘에 따른 메모리 스캔의 부하를 감소시키기 위해서 lrubucket 파라미터를 조절할 필요가 있다.

  LRU 알고리즘에 따라 메모리를 스캔하면서 참조비트가 off인 페이지를 스틸하고 참조비트를 리셋한다. 이 과정에서 메모리가 큰 경우에는 많은 페이지를 스캔해야 한다. 따라서, 메모리 frame을 bucket으로 나누어서 관리한다. LRU 알고리즘은 하나의 bucket을 스캔하고 필요한 만큼의 메모리를 확보하지 못하면, 다른 bucket을 스캔하기 전에, 2번째 스캔을 하게 된다.

  디폴트 값은 131072 또는 512 MB 이다.


minperm / maxperm

        # vmtune -p n -P N

        # vmo -o minperm%=n

        # vmo -o maxperm%=N

  numperm : number of file pages in memory

        ․ numperm > maxperm,         steal only file pages

        ․ maxperm > numperm > minperm, repage 비율에 따라서 steal

        ․ numperm < minperm,          page 종류를 가리지 않고 아무거나 steal

  파일 I/O가 주요한 성능 제한 사항인지, computational page를 메모리에 유지하는 것이 중요한지 등에 따라서 설정 값을 변경할 수 있다. 특히, NFS를 사용하는 시스템에서는 보다 많은 file pages를 메모리에 보관할 수 있도록 하는 것이 성능향상에 도움이 된다.

w  File System으로 구성된 Oracle : minperm  10%, maxperm  30%

w  SAP R3(File System Oracle) : minperm  5%, maxperm  10%



strict_maxperm

        # vmtune -h 0|1

        # vmo -o strict_maxperm=0|1

  persistent file cache 에 대한 hard limit을 설정할 것인가? 1로 설정되면, maxperm 값이 hard limit으로 설정되며, 이 값 이상으로 file pages가 증가하게 되면, LRU 알고리즘에 따라 페이지 교체가 file pages 에 대해서 실행된다.

※ 사용할 때, 주의해서 사용하지 않으면, 예기치 않은 결과를 가져올 수 있다.


maxclient

        # vmtune -t N

        # vmo -o maxclient%=N

  JFS2 파일 시스템은 buffer cache로 client pages라는 메모리 페이지를 이용한다. 이 페이지들은 maxperm, minperm 임계값의 영향을 받지 않는다. 이 client pages에 대한 최대값을 지정하는 파라미터가 maxclient 이다.

  사용량이 maxclient 설정값에 도달하면, LRU는 client pages를 스틸한다. client pages를 스틸하고도 모자라면 다른 종류의 페이지도 스틸하게 된다. maxclient 값을 줄임으로써 LRU가 working segment pages를 스틸하지 못하도록 해야 할 필요가 있다. 또한, maxperm 이하로 값을 설정해야 한다.


ꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏ

Tuning Paging Space


´페이징 스페이스 부족과 관련된 에러 메시지는 다음과 같다.

"INIT: Paging space is low"

          "ksh: cannot fork no swap space"

      "Not enough memory"

          "Fork function failed"

          "fork () system call failed"

          "Unable to fork, too many processes"

          "Fork failure - not enough memory available"

          "Fork function not allowed. Not enough memory available."

          "Cannot fork: Not enough space"


npswarn

        # vmtune -w N

        # vmo -o npswarn=N

  페이징 공간의 가용한 페이지 수가 N이하로 줄어들면, OS는 프로세스에게 SIGDANGER 시그널을 보내게 된다. 프로세스는 이 시그널을 무시하거나, 종료하거나, disclaim()을 사용하여 메모리를 해제한다.

  디폴트 값은  max( 512, 4×npskill )


npskill

        # vmtune -k N

        # vmo -o npskill=N

  페이징 공간의 가용한 페이지 수가 N이하로 줄어들면, OS는 프로세스에게 SIGKILL 시그널을 보내고 강제로 종료시키기 시작한다. SIGDANGER 시그널에 응답한 프로세스나 early 할당 정책을 사용하는 프로세스는 영향을 받지 않는다.

  디폴트 값 = max(64, NumberOfPagingSpacePages/128)


nokilluid

        # vmtune -n N

        # vmo -o nokilluid=N

  uid가 N 이하인 사용자 프로세스는 npskill 파라미터의 영향을 받지 않는다.


fork() retry interval

  페이징 공간 부족으로 새로운 프로세스를 fork하지 못할 경우, 스케줄러는 5번 재시도한다. 이 때, 재시도 간격은 10clock tick이 디폴트이다.

        # schedtune -f N (clock tick)


ꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏ

Page Space Allocation Method


LPSA(Late Page Space Allocation)

  ․ allocated when actually touched(the page was modified somehow)

  ․ 페이지는 프로세스가 page-out 될 때, 할당된다.

  ․ 프로세스가 page-out될 가용한 공간을 항상 보장할 수 없다.

EPSA(Early Page Space Allocation)

  ․ paging space pages reserved when processes use malloc()

  ․ 프로세스가 페이징 공간 부족으로 kill되지 않는 것을 보장한다.

  ․ PSALLOC=early

DPSA(Deferred Page Space Allocation)

  ․ allocation delayed until necessary to page out the page

  ․ additional overcommitment of paging space

  ․ 한 번 page-out 페이지가 다시 RAM에 page-in 되더라도 그 공간은 reserved 됨.

  ․ 다음 경우에 할당된 페이지가 해제된다.

    - working segment로 page-in된 페이지

    - 쓰레드가 할당을 해제한 경우

    - thread exit

# vmtune -d 0|1      (DPSA=1)

# vmo -o deffps=0|1

  vmstat(avm), ps(SIZE, SZ) 등의 도구들은 DPSA 정책에 따라 실제로 access된 가상 메모리 크기를 보여준다. 반면에 svmon은 실제로 사용된 페이징 공간 크기를 보여주므로, 이 값은 vmstat의 avm 값보다 작게 출력된다.

  lsps -a는 실제로 사용되는 페이징 공간만을 보여준다, 그러나. lsps -s는 사용되지 않고 있지만, reserve된 페이징 공간도 고려해서 보여준다. 따라서, lsps -s 명령을 사용하는 것이 좀 더 정확하다고 할 수 있다.


ꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏ

Shared Memory


  shmat(), mmap()을 사용하여 파일들을 명시적으로 메모리에 매핑시킬 수 있다. 이렇게 함으로써 버퍼링과 시스템 콜로 인한 부하를 피할 수 있다. 이러한 메모리 영역을 shared segments라 한다. 4.2.1 버전 이후부터 32비트 응용 프로그램에만 적용된다. 11개의 shared memory segments 제공된다. 각 segment는 256MB 크기다. 응용 프로그램은 이러한 공유메모리 세그먼트에 read/write 함으로써 파일에 대한 read/write을 수행할 수 있다. 또한, 세그먼트에 대한 포인터를 사용하기 때문에 read/write system call로 인한 부하를 피할 수 있다.

  파일과 데이터는 다수의 프로세스에 의해서 공유될 수 있는데, 공기화 문제는 응용 프로그램에서 해결해야 한다. 전형적인 예로는 데이터베이스 프로그램이 공유 세그먼트를 데이터 베이스 버퍼 캐쉬로 사용한다.

  shared memory segments에 대한 페이징 공간도 할당된다.


EXTSHM(Extended Shared Memory)

  각 shared memory region은 크기에 관계없이 256MB 크기의 메모리 공간을 사용한다. 4.2.1 버전부터는 EXTSHM을 통해서 1바이트에서 256MB까지 크기를 지정할 수 있다.

  EXTSHM을 통해서 11개 세그먼트의 제한은 사라지게 되었다. EXTSHM을 사용하기 위해서는 프로그램의 환경 설정에 EXTSHM=ON으로 설정하면 사용할 수 있다. 프로세스가 사용할 수 있는 segment의 수에 대한 제한은 없으며, 사용하는 메모리 공간의 크기는 여전히 256MB 의 배수이다.


ꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏ

Memory Affinity Support


  POWER 기반의 SMP 장비들은 다수의 MCM을 포함하고 있다. 시스템 메모리는 이러한 MCM에 부착되어 있다. 모든 프로세서가 어떤 메모리에도 접근할 수 있지만, 자신의 MCM에 부착되어 있는 메모리에 접근하는 것이 제일 빠르다.

  따라서, page fault를 발생시킨 프로세서의 MCM에 부착된 메모리에서 page fault를 해결하도록 하는 것이 memory affinity support이다.

        # vmtune -y 0|1

        # vmo -r -o memory_affinity=0|1

    ※ bosboot, reboot를 반드시 해줘야만 효과가 있다.

  응용 프로그램에서 이 기능을 사용하기 위해서는 환경 변수를 설정해야 한다.

        # export MEMORY_AFFINITY=MCM

반응형

'UTIL > Leak Detect' 카테고리의 다른 글

Linux 메모리 릭 체킹 Valgrind  (0) 2015.08.17

+ Recent posts