출처 : http://blog.naver.com/PostView.nhn?blogId=bumsukoh&logNo=110114643995
안녕하세요! 이번에는 IBM AIX의 내부적인 Memory 관리 방법(Not human but machine doing that)과
모니터링 방법(Not machine but human doing that)에 대해 설명드리도록 하겠습니다.
저의 경우 매번 시스템 튜닝이나 모니터링하면서도 항상 헤갈리게 하는 Memory Management 부분입니다. 아마 모니터링 툴마다
보여주는 수치들의 의미때문에 그런것 같은데요.
전혀 모르것도 아닌것이 그렇다고 아는것도 아닌것이 아무 애매모호한 경우가 너무 많아서 이번에 쫑찍어 볼려고 합니다.
위에서 제가 설명드린 "모니터링 툴마다 보여주는 수치들의 의미가 다른부분"의 대표적인 예가 이런 경우일 것 같은데요.
vmstat의 page in, page out과 topas의 page in, page out 부분일텐데요. 잘 아실지 모르지만 이 두개가
의미하는 내용은 완전히 다릅니다. 모르셨던 분들은 황당하실텐데요.
vmstat의 page in, page out은 말그대로 paging space(swap이라 보시면 되겠네요)로의 page in,
page out 입니다. 즉 프로세스의 메모리 정보가 file system으로 내려가거나, 다시 메모리로 로딩하거나 하는 것이지요.
그런데 topas의 page in, page out은 file system과 매핑된 즉 file과 매핑된 page들에 대한 page in,
page out에 대한 부분입니다. 이 중에는 paging space로의 page in, page out은 제외됩니다.
즉 Memory segment중 Persistent segment와 Client segment에 대한 page들이 in, out 되는
것이죠.
이렇게 다른 내용을 같은 내용으로 이해 한다면 잘못된 판단을 할 수 있겠죠.
이러한 이유로 AIX 내부적으로 Memory를 관리하는 방법과 모니터링에 대한 정확한 방법을 한번 정리하는 것이 이번 포스트의
목적입니다.
자, 그럼 AIX 내부적인 Memory 관리 방법에 설명하도록 하겠습니다.
AIX 뿐 아니라 모든 Unix 시스템은 가용한 Physical memory 보다 더 많은 양의 메모리 address를 효율적으로 할당할
수 있도록 하기 위해 Virtual memory를 사용합니다. 이건 Unix 시스템에 대해 아시는 분들은 모두 아시는 부분입니다. 문제의 발단은
여기서 부터 시작됩니다.
Virtual Memory를 사용함으로써 이를 효과적으로 관리하기 위한 각종 효율적인 방법들이 필요하게 됩니다. 그러면서 굉장히 복잡한
Memory management mechanism이 생겨나게 됩니다.
AIX 내부적인 Memory를 관리하는 방법을 알기 위해서는 다음의 기능들에 대해 숙지하고 있어야 합니다.
- Paging space 란 ?
paging space는 현재 Virtual memory상에는 존재하지만 현재 access
되고 있지 않는 데이터를 저장하기 위해 disk 공간으로 할당된 logical volume입니다.
이러한 logical volume을 일반적으로 우리는 paging space또는 swap
space라고 부릅니다.
paging space라는 용어의 개념을 잘 알고 있어야 뒤에 나오는 각종 내용들에 대해
혼란이 없게됩니다.
System의 Physical memory(RAM)의 여유공간의 양이 적으면, 현재 사용하고
있지 않은 프로그램(프로세스)이나 데이터는 다른 activity 작업에게 메모리를 할당하기 위해 paging space로 이동되게 됩니다.
뭐.. 이 내용은 우리가 잘 알고 있는 swap에 대한 내용이라 할 수 있습니다. 그래서 paging space가 작게되면 프로세스들이 유실되게
되고, 이렇게 되면 paging space가 고갈되게 되면 System panic이 발생할 수 있습니다.
이러한 문제를 감지하게 되면 새로운 volume을 생성하여 paging space로
할당하거나 기존의 volume의 크기를 증가시켜 문제를 해결 할 수 있습니다.
이러한 paging space에는 paging space를 할당하기 위한 다양한
정책(Late, Early, Deferred등)과 paging space의 부족 시 paging space회수를 위한 다양한
방법(npswarn, npskill,nokilluid등)등이 있습니다. 해당 부분들은 필요 시 설명하도록 하겠습니다.
예전에는 작은 Physical memory 시스템에 과중한 업무들을 구동하다 보니
paging space에 대한 page in, page out이 지속적으로 발생하여 성능상의 문제가 빈번히 있었지만,
요즘은 Physical memory의 가격보다 안정적인 시스템 운영을 위해 충분한
Physical memory를 처음부터 확보하고 시스템을 운영하기 때문에 Paging space가 부족하여 System에 크게 문제되는 경우는
별로 없는것 같습니다.
- Memory Segments 란 ?
AIX는 다양한 memory segment간에 기능들이 구분됩니다.
AIX의 VMM을 이해하기 위해 persistent,working 그리고 client
segment들간의 차이점을 이해하는 것이 중요합니다.
Persistent segment는 disk상의 permanent storage
location을 가집니다. Data나 execution programe의 file은 persistent segment에 매핑됩니다.
Working segment는 프로세스가 사용하는 동알 존재하는 일시적인 것입니다. 따라서
permanent disk storage에 위치를 가지지 않습니다.
프로세스 stack, data 영역이 working segment와 shared
library text segment에 매핑됩니다.
Client segment는 remote file system에 위치한 permanent
location을 네트워크를 통해 저장됩니다. CD-ROM과 JFS2 page들은 client segment 입니다.
Memory segment는 private으로 유지되거나 processor간 공유될 수
있습니다.
- VMM(Virtual memory manager) 란 ?
VMM은 System과 application에서 요청하는 메모리를 할당하는 역할을
담당합니다.
VMM을 통해 할당되는 segment들의 단위를 page라고 부릅니다. 이러한 page는
Physical memory나 필요 시까지 disk(paging space)에 위치됩니다.
이렇게 Physical memory와 disk(paging space)에 저장된 page들을
VMM이 관리하게 됩니다. 그래서 virtual memory의 양은 system의 실제 physical 메모리의 크기를 넘어 사용될 수
있습니다.
VMM의 기능 측면에서는 다음과 같은 성능 향상을 위한 기능을 가지고 있습니다.
- paging으로 인한 processor의 사용과 disk bandwidth를
최소화함
- 프로세스의 paging으로 인한 응답속도 저하를 최소화홤
AIX에서는 virtual memory segment는 4kb(4096byte) 단위로
page로 나뉘어집니다.
VMM은 이러한 page들에 대해 사용가능한 free list를 유지 관리합니다.
VMM은 현재 Physical memory상의 page들에 대해 free list로
재할당해야 할 page들을 찾기 위해 page-replacement algorithm을 사용합니다.
이 page-replacement algorithm은 virtual memory
segment인 working segment와 비교하여 persistent 존재 비율 및 repaging등을 고려해야 합니다.
VMM은 할당되지 않은 page들의 최소양을 유지하기 위해 free 공간을 늘리고 이 공간을
free list에 할당하기 위한 page out과 page steal을 사용합니다.
- Paging mechanism 에 대해
Paging mechanism은 VMM이 page들의 free list를 관리하기 위한
방법입니다. 위에서 VMM이 page-replacement algorithm을 사용한다고 말씀드렸는데요. 이러한 것들이 Paging
mechanism에 대한 하나의 방법입니다.
VMM은 안정적인 page fault를 가능하게 하기 위해 free memory page
frame의 리스트를 유지합니다. 이러한 list가 바로 우리가 알고 있는 free list입니다.
여기서 page fault는 virtual memory address는 가지고 있으나 현재
physical memory에 해당 page가 없을 경우 발생합니다.
이러한 page fault는 보통 다음과 같이 두가지 유형이 있습니다.
new page fault로써 가장 처음 참조되어 physical memory가 없는 경우와
이미 page out된 page인 경우입니다. 즉 page fault가 발생하면 free list가 있는 경우 자동으로 해당 page에 대한
메모리를 바로 할당하게 됩니다.
메모리의 free list page의 수가 작게되면 page stealer가 발생하게
됩니다.
이 page stealer는 steal 대상 page들을 찾기 위해 Page Frame
Table(이하 PFT) entry들을 평가하는 mechanism입니다.
PFT는 참고되고 있는 page와 수정된 page들을 표시하는 flag들을 가지고
있습니다.
Page stealer가 참고되고 있는 PFT내의 page를 찾게되면 해당 page를
steal하지 않습니다.
오히려 참조 flag를 reset 하게 됩니다. 다음번에 page stealer가 PFT에서
해당 page를 검사할때 해당 page가 참조되고 있지 않다면 해당 page는 steal 됩니다.
그리고 page stealer가 처음부터 참조되지 않은 page들 만나게 되면 바로 해당
page들을 steal됩니다.
PFT의 page가 참조되지 않고 modify flag가 설정되어있으면 해당 page가
memory에 위치한 후 변경되었다는것을 page stealer에게 표시하게 됩니다. 이러한 경우는 page steal 전에 page out이
호출됩니다. Page들이 working segment의 부분이라면 pageing space에 기록될것이며, 반면에 persistent
segment의 부분이라면 disk의 permanent 위치에 기록될것입니다.
프로세스가 종료하게 되면 해당 프로세스의 working storage는 해제되며 메모리의
page들도 free가 되어 free list로 반환됩니다. 반면 프로세스에 의해 open된 file들은 메모리에 남아 있을수
있습니다.
- Memory load control mechanism 에 대해
Active virtual memory page들의 수가 Physical memory
page들을 초과할 경우, Physical memory page내에 위치할 수 없는 page들을 위해 paging space를 사용하게
됩니다.
Application이 page out된 page들에 접근하게 되면 VMM은 paging
space로 부터 해당 page들을 physical memory page로 로드하게 됩니다.
이때, free physical memory page의 수가 작게되면 paging
space에서 page로 로딩하기 전에 physical memory내의 다른 또 다른 free page가 필요하게 됩니다.
VMM이 free 대상의 page를 찾게되면, 강제로 해당 page들은 paging
space로 page out됩니다.
심각한 경우 VMM은 paging space로 부터 physical
memory로 다른 page를 로딩하기 전에 항상 paging space로 page를 page out 해야 할 필요가 생길 수 있습니다.
이러한 경우는 thrashing이라 부릅니다. 이러한 thrashing
상황에서는 프로세스들은 dispatche(run queue에서 cpu 할당받음)되자 마자 page fault에 직면하게 됩니다. 그러면
프로세스들은 어떠한 중요 절차도 수행하지 못하게 될뿐 아니라 system의 성능은 떨어지게 됩니다.
OS들은 이러한 thrashing 상황이 시작되는지에 대한 감지하기 위한 memory
load control mechanism을 가지고 있습니다.
thrashing이 감지되면 system은 active process들을 suspend
시키기 시작하고 새로운 process의 시작을 지연시키게 되며 이러한 작용이 thrashing으로 빠지는 것을 방지합니다.
- Page replacement algorithm 에 대해
free list 상의 page 수가 설정한 값(minfree)보다 낮을 경우 page
replacement algorithm은 physical memory page를 free 시키기를 시도하게 됩니다. 이러한 page
replacement algorithm은 free list상의 page수의 최대값(maxfree+8)보다 free list의 page가
확보될때까지 지속됩니다.
이러한 page replacement algorithm 수행의 기준이 되는 minfree,
maxfree값을 적정하게 설정하는 것을 중요한 부분입니다.
보통 minfree값의 기본은 maxfree보다 8 작은 값이거나 memory pool(보통
CPU당 메모리 SUBPOOL이 있음)만큼 작은 값입니다.
maxfree는 VMM의 page steal을 중지시키게 하는 기준을 결정합니다.
maxfree값은 다음과 같이 결정될 수 있습니다.
maxfree = lesser of (number of memory pages / 128)
--> IBM 가이드 문서 내용입니다.
이러한 값들은 system의 memory를 모니터링하여 필요 시 재설정을 통해 성능을 튜닝할
필요가 있습니다.
그럼 AIX 내부적인 Memory 관리 방법이 이해되었다면, 이제는 모니터링 하는 방법에 대해 알아보겠습니다.
주요하게 사용하는 Memory 모니터링 툴에 대해 설명하겠습니다.
- vmstat
가장 효과적으로 사용할 수 있는 툴입니다.
vmstat에 나오는 메모리 항목을 위주로 설명드리도록 하겠습니다.
vmstat은 크게 kthr, memory, page, faults, cpu 이렇게 5개
대항목으로 정보를 출력합니다.
이 중 Memory 관리와 관련된 부분은 memory, page 부분이 되겠습니다.
각 항목에 대해 알아보겠습니다.
- avm
Active Virtual Memory를 말하며, access되는 virtual page의
수를 표시합니다. 때로 이것을 available memory로 잘못알고 있는 경우가 있습니다.
- fre
free list의 크기를 표시합니다. 실제 physical memory의 많은 영역이
file system data를 cache로 활용되기도 합니다. 따라서 해당 크기가 작다고 해서 꼭 비정상적인 것은 아닙니다.
- re
초당 reclaime한 page수입니다. 해당 page가 free list에 있고,
재할당되지 않았을때 해당 page에 page fault는 초기화를 위한 신규 I/O request가 없으므로 reclaim이 고려됩니다.
- pi
page in request의 수입니다. page fault에 의해 paging space에
paging되어 있는 page가 physical memory로 page되는 수입니다.
초당 지속적으로 5 page 보다 많은 값이 보이면 문제가 있는 것으로 볼 수
있습니다.
- po
page out 처리된 page 수입니다. 초당 paging space로 이동한 page들의
수를 말합니다. 해당 page는 더 많은 memory가 요청될때 VMM에 의해 paging space로 page out됩니다. page out된
page는 필요 시 page in 될 수 있습니다.
page out이 높으면 minfree와 maxfree 값과 paging
allocation policy값인 PSALLOC값을 확인할 필요가 있습니다.
- fr
free 된 page의 수입니다. VMM이 메모리를 필요로 할때 VMM의
page-replacement algorithm이 steal 대상 page들을 결정하기 위해 PFT(Page Frame Table)을
scan하도록 합니다. page들이 마지막 scan이후에 참조되지 않았다면 해당 page는 steal될 수 있습니다.
- sr
page-replacement algorithm에 의해 scan이 이루어진 page를
표시합니다. page steal이 발생하면 physical memory내의 page들은 page steal 대상인지를 확인하기 위해
scan됩니다.
메모리의 과대사용을 확인하기 위해 fr에 비해 sr의 비율이 높은지 확인해야함 높은 비율은
page stealer가 steal하기 위한 메모리를 찾기위해 작업 부하가 발생하는 것을 의미합니다.
- cy
page-replacement algorithm이 steal할 page를 찾기위해
PFT(Page Frame Table) 전체를 scan한 횟수를 나타냅니다.
이 값이 0 보다 크면 심각한 memory부족을 의미합니다.
page-replacement algorithm은 maxfree+8 값 만큼 free
list page를 확보하기 위해 PFT를 scan하게 되는데 이때 PFT를 한번 모두 scan한 후에도 free list page의 수가
maxfree+8 보다 작으면 계속적으로 page steal을 위한 scan이 발생하며 이미 scan한 page들을 만나게 되면 cy값은 1씩
증가하게 됩니다.
이렇게 scan하다 maxfree+8 값만큼 steal이 발생하여 free list가
증가하면 그때 비로서 cy값이 0으로 설정됩니다.
- topas
topas도 시스템 모니터링을 위해 유용한 툴입니다. 처음에 말씀드렸듯이 memory에
관련해서는 그 항목이 vmstat과 조금 달라 확실히 의미하는 바를 알고 있어야 혼선이 없습니다.
항목 중 paging, memory, paging space 부분이 memory와 관련된
항목입니다.
- Faults
faults 수입니다.
- Steals
초당 VMM에 의해 steal된 page수입니다.
- PgspIn
Paging space로 부터 읽어들인 page 수입니다. (일반적인 page in
입니다.)
- PgspOut
Paging space로 write된 page 수입니다. (일반적인 page out
입니다.)
- PageIn
초당 읽어들인 page 수입니다. (paging space로부터의 page in을 제외한
모든 page in, persistent segment에 대한 page in이 포함됩니다.)
- PageOut
초당 write 된 page 수입니다. (paging space로 page out을 제외한
모든 page out, ㅔpersistent segment에 대한 page out이 포함됩니다.)
- Sios
VMM에 의해 발생된(page stealer) 초당 input/output page의 요청
수입니다.
- Real
Megabyte 단위의 실제 physical memory의 크기를 보여줍니다.
- %Comp
Computational page에 할당된 real memory 량입니다.
- %Noncomp
Non-computational page에 할당된 real memory 량입니다.
- %Client
Remotely mounted file들에 대해 cache로 사용되는 메모리의
량입니다.
- svmon
svmon은 현재 시스템의 메모리 사용량에 대한 정보를 상세하게 확인할 수 있습니다.
위와 같이 전체 시스템의 memory 사용율이 나오게 됩니다.
- memory
real memory의 사용율에 대한 정보
출력됩니다.
- size : real memory frame의 수입니다.
- inuse : page들을 포함하고
있는 frame의 수입니다.
- free : 모든 memory pool의 free frame의 수입니다.
- pin
: pinned page를 포함하고 있는 frame의 수입니다.
- virtual : working segment를 위한
system virtual space에 할당된 page 수입니다.
- pg space
쉽게 swap 대한 정보
출력합니다.
- size : 전체 paging 공간 크기입니다.
- inuse : 사용중인 paging
공간입니다.
- pin
고정 영역에 대한 상세 정보입니다.
- work : 작업 세그먼트 페이지를
포함하는 page 수입니다.
- pers : 영구 세그먼트 페이지를 포함하는 page 수입니다.
- clnt :
클라이언트 세그먼트 페이지를 포함하는 page 수입니다.
- vmo
vmo는 memory관련된 튜닝을 위해 VMM setting을 위한 툴입니다.
vmo 에는 다양한 tuning parameter가 있으며, 이러한 parameter를
활용하여 시스템에서 메모리 관리에 관련된 효과적인 방법을 제시할 수 있습니다.
굉장히 다양한 parameter들이 있습니다. 흔히 접하게 되는 값들로는
maxclient%, maxfree, maxperm%, maxpin%, minfree, minperm%등이 있습니다.
vmo의 값 parameter에 대해서는 따로 포스팅하기로 하겠습니다.
이렇게 기본적으로 AIX에서 내부적인 memory관리를 이해하기 위한 내용과 모니터링 부분에
대해 알아보았습니다.
위의 내용을 기본으로 좀더 세부적인 메카니즘을 알아가 보시는 것도 재미있을것 같습니다.