Monitoring and Tuning Memory Use
출처 : 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