BBUWOO'S [ LIKE UNIX ] WORLD Home > Lecture > Kernel > Kernel-4  

HOME
WHAT's BBUWOO?
LInux AnNyung
Open Source
    GitHUB
    GitHUB (for PHP)
LECTURE
MINI LECTURE
QnA BOARD
ENGLISH POEM


WARNNING

강좌의 모든 권리는 본인 김정균에게 있으며 이 강좌를 상업적 목적 으로 이용
하거나 다른 곳으로 옮길시에는 본인의 허락이 있어야 한다. 이글의 가장 최신글은
http://oops.org 에서 확인할수 있다.



4. Sysctl for Virtaul Memory in Kernel

/proc/sys/vm/* 을 위한 문서 kernel version 2.2.10 (c) 1998, 1999, Rik van Riel <riel@nl.linux.org> 번역 2001.3.28 김정균 <http://oops.org> * 역주) 역자가 VM에 관한 지식이 모자르다 보니 번역이 아주 억지식으로 되었다. 될수 있으면 영문 원서를 보는 것을 권장한다. 한글 번역 문서는 대충 이런 것이 있다 정도로 만족 을 하고 실제 여기의 문서들을 적용해 보고 싶다면 영문 원서를 정독하여 하기를 원한 다. 다시 말하지만 이 문서의 번역은 억지로 되어 있다는 것을 말한다. 이 페이지를 읽기 전에 아주 강력하게 주의를 요할 것은 sysctl을 이용하여 이 값들을 변경할 경우나 직접적으로 변경을 할 경우 시스템이 crash 되어질 위험요소가 많이 있 다는 것을 명심해 야 한다. 즉, 자기의 시스템에 무리한 값을 넣었을 경우 그 즉시 시 스템이 멈출수도 있기 때문에 충분한 테스트와 시스템이 crash가 될 수 있음을 명심하 고 책임을 질수 있을 경우에만 만지기를 권장한다. 일반적인 정보와 법적인 짧은 문구는 README 를 보기 바란다. ================================================================================ 이 파일은 /proc/sys/vm 에서 sysctl file 들을 위한 문서들을 포함하고 있으며 Linux Kernel 2.2 이상에서 유효하다. /proc/sys/vm에 있는 파일들은 리눅스 커널의 가상메모리(VM) 서브시스템의 작동을 설 정하기 위해 사용되며, (bdflush) 파일들의 어떤 것들은 디스크 사용에 조금의 영향을 미칠수도 있다. 이 파일들의 기본값과 초기화 방법은 mm/swap.c 에서 확인할수 있다. 현재, 이 파일들은 /proc/sys/vm 에 있다. - bdflush - buffermem - freepages - kswapd - overcommit_memory - page-cluster - pagecache - pagetable_cache ================================================================================ bdflush: 이 파일은 bdflush kernel daemon 의 작동을 조절한다. 이 파일의 구성과 기본값은 /linux/mm/buffer.c 에서 확인을 할수가 있으며 아래의 소스와 같이 dbflush 는 9개의 정수값을 가지고 있으며 이중 커널에서 실제로 적용이 되는 것은 6개의 값이 된다. From linux/fs/buffer.c: -------------------------------------------------------------------------------- union bdflush_param { struct { int nfract; /* Percentage of buffer cache dirty to activate bdflush */ int dummy1; /* old "ndirty" */ int dummy2; /* old "nrefill" */ int dummy3; /* unused */ int interval; /* jiffies delay between kupdate flushes */ int age_buffer; /* Time for normal buffer to age */ int nfract_sync;/* Percentage of buffer cache dirty to activate bdflush synchronously */ int dummy4; /* unused */ int dummy5; /* unused */ } b_un; unsigned int data[N_PARAM]; } bdf_prm = {{30, 64, 64, 256, 5*HZ, 30*HZ, 60, 0, 0}}; -------------------------------------------------------------------------------- int nfract: 첫번째 필드 nfract 값은 buffer cache 에 있는 dirty buffer 들의 퍼센테이지를 결정 한다. Dirty 의 뜻은 디스크에 쓰여지기 위한 buffer 들의 목록을 의미하며, 이는 곧 buffer 에서 지워질 내용을 의미하게 된다. 이 값은 높게 셋팅 하는 것은 디스크에 쓰 여질 내용들을 오래 기다리게 하며 이는 곧 메로리가 꽉 차게 되었을때 I/O에 많은 양 의 정보를 기록하게 한다. 값이 너무 작을 경우에는 I/O로의 접근이 빈번하게 되어 수 행 능력을 떨어뜨릴수 가 있다. int dummy1: 두번째 필드 dummy1 은 예전의 ndirty 로서, 한번에 bdflush 가 디스크에 적을수 있는 dirty buffer 의 최대값을 제공한다. 500으로 설정돼 있으므로 한번 하드 디스크에 기 록을 할 때 500개 의 더티 버퍼가 사라진다. 이 값 또한 작을수록 하드 디스크로의 접 근이 빈번하게 일어난다. int dummy2: 3 번째 필드 dummy2 는 예전의 nrefill 로서 refill_freelist() 함수가 호출 되었을때 bdflush 가 추가 할 free buffer 의 list 수를 설정한다. 이것은 buffer 들이 memory page 들과 어떤 기록 할것이 미리 작성될 필요가 있는것과는 다른 크기을 가지는 동안 미리 free buffer 를 위치시킬 필요가 있다. 높은값은 더많은 메모리를 낭비할수 있으 나 refill_freelist() 함수를 더 적게 실행을 하기 때문에 효율적으로 관리를 할 수도 있다. int dummy3: 사용하지 않음 int interval: 5 번째 필드 interval 은 kupdate 가 wake 하고 flush 를 할 최소 비율이다. 이 값은 jiffies (clockticks) 를 나타내며, giffies 의 수는 초당 보통 100 이다. (알파는 보 통 1024 이다.) 그러므로 x*HZ 는 x초 이다. 기본값은 5초 이며 최소 0초 최대 600 초 이다. int age_buffer: 6 번째 필드 age_buffer 는 dirty buffers 를 디스크에 쓰기 전 Linux 가 기다릴 최대 시간을 지정한다. 즉 여기 에 지정된 시간이 흐르면 disk 에 쓰게 된다는 것을 의미한 다. 값은 jiffies 에 지정 되어 있으며 기본값은 30 초, 최소 1 초, 최대 6,000 초 이 다. int nfract_sync: 7 번째 필드 nfract_sync 는 bdflush 가 동시에 발생하기 전의 dirty buffer의 캐쉬의 퍼센테이지를 지정한다. bdflush 가 디스크에 buffer 들을 기록하기 전의 hard limit 로 보일 수 있다. 기본값은 60% 이며, 최소 0%, 최대 100% 까지 지정을 할 수 있다. int dummy4: 사용하지 않음 int dummy5: 사용하지 않음 역자주) 필자가 번역을 하고도 이 분야에 대한 지식이 모자른 관계로 무슨 소리인지 하나도 모 르겠다. 그래서 다른 분이 이 부분에 대해 적은 글을 첨부 한다. 아래의 글은 현재 커 널 버젼(2.4.17) 과 약간 변경이 있었지만 그래도 어느정도 참고는 될 것이다. [출처] http://maso.zdnet.co.kr/maso/2000/09/07/014004,968307791,178.html bdflush 는 9개의 필드를 가지며 실제로 6개의 값만 사용 nfract 9개의 필드로 구성된 bdflush의 설정값 중 가장 앞에 나오는 40은 전체 버퍼 캐시의 더티 버퍼(dirty buffer) 비율을 나타낸다. 여기서 '더티' 는 주로 버퍼에서 비워질 내용을 말하는데, 즉 프로세스에서 모디파이돼 하드 디스크에 쓰여질 데이터를 의미 한다. 버퍼에서 하드 디스크에 쓸 내용이 담긴 버퍼를 더티 버퍼라 한다. 쉽게 말해 하드 디스크에 쓰여질 데이터를 저장한 버퍼다. 40 으로 설정됐다면 전체 버퍼 캐시 의 더티 버퍼 크기가 40% 이하가 되게 한다. 40% 가 되면 더티 버퍼의 내용을 하드 디스크에 기록하고 버퍼를 비우기 위한 시도를 한다. 값이 클수록 하드 디스크에 쓰 여질 데이터는 오래 기다리며, 값이 작을 경우 하드 디스크로의 접근이 빈번해 전체 시스템의 수행 속도가 느려질 수 있다. ndirty 두 번째 값인 500은 하드 디스크에 한번에 기록하는 버퍼의 크기를 나타낸다. 500으 로 설정돼 있으므로 한번 하드 디스크에 기록을 할 때 500 개의 더티 버퍼가 사라진 다. 이 값 또한 작을수록 하드 디스크로의 접근이 빈번하게 일어난다. nrefill 세 번째 값은 사용하지 않는 버퍼들의 리스트 작성에 사용한다. 64 로 돼 있는데 이 는 한번에 64 개의 빈 버퍼를 만들라는 것이다. 이 값은 클수록 전체 메모리 낭비를 가져오지만 입출력 버퍼가 증가해 하드 디스크 접근 속도를 높일 수 있다. 기타 bdflush 설정 항목 nref_dirt : bdflush 가 동작하는 경계를 나타낸다. 기본값이 256인데 더티 버퍼가 256 이상이면 bdflush가 동작한다. dummy1 : 사용하지 않는 값이다. age_buffer : 더티 버퍼의 수명을 말한다. 각 더티 버퍼는 생성 후 최대 age_buffer 에 나타난 시간이 지나기 전에 디스크에 기록된다는 의미다. age_super : supper block의 수명을 나타낸다. dummy2 : 사용되지 않는 값 dummy3 : 사용되지 않는 값 ================================================================================ buffermem: 이 파일에는 buffer_mem구조의 값에 대응하는 3개의 값이 있다. 이것은 buffer memory 에 사용이 되는 memory 를 얼마나 지정할 것인지를 조절한다. 전체 메모리의 퍼센트지 처럼 퍼센테이지로 계산이 되어진다. The values are: min_percent -- buffer memory 로 사용될 memory 의 최소 퍼센테이지 borrow_percent -- 사용안함 max_percent -- 사용안함 ================================================================================ freepages: 이 파일은 freepage 구조의 값을 포함 하고 있다. 이 구조는 min, low, high 의 3개의 값을 포함한다. 설정 값의 뜻은 다음과 같다: freepages.min system 의 free page 의 수가 이 숫자에 도달할 때, kernel 은 더 많 은 메모리를 위치 시킨다. freepages.low free page 의 숫자가 이 값보다 낮을 경우 kernel 은 swapping 을 시 작한다. freepages.high kernel 은 이 값이 지정된 만큼의 양을 남겨 놓게 된다. 메로리가 이 값이 도달을 하게 되면, kernel은 실제로 적극적인 swapping 을 행하 는 것은 아니고 할수 있으면 자연스럽게 swapping 을 시작하게 된다. ================================================================================ kswapd: Kswapd 는 kernel swapout daemon 이다. kwaptd 는 kernel 의 전제 또는 조각을 얻게 되었을때 남아 있는 메모리 조각을 의미 한다. 모든 시스템이 다르며, 이 시스템의 조 각으로서 원하는 조정을 할수가 있을 것이다. 이 page의 수들은 tries_base, tries_min, swap_cluster 와 같은 struct pager_daemon 의 수들에 일치한다. tries_base 와 swap_cluster는 아마 system 성능에 큰 영향을 미 칠 것이다. tries_base kswapd 가 한번에 시도하기 위한 free page 의 최대값은 이 값으로부 터 계산되어 진다. 보통 이값은 4또는 8로 나누어 지며 (mm/vmscan.c 를 참조하라), 이것은 보이는 만큼 크지는 않다. swap 으로 또는 swap으로 부터의 대역폭을 증가할 필요가 있을때, 이 수를 증가 시킬수 있다. tries_min kswapd 가 매번 호출을 하기 위한 하나의 free page 의 최소값 이다. 기본적으로 kswapd 은 최소 순위로 호출이 되어 질때 어떤 page 들을 자유롭게 하는 것이 확인 되었다. swap_cluster 이것은 한번에 kswapd 가 쓸수 있는 page 의 값이다. kswapd 가 I/O 에 많은 양의 데이터를 넣고 disk를 자주 읽지 않게 하기 위해 이 값 을 크게 하기를 원할것이다. 하지만 이 값이 너무 크면 요청 queue가 넘치게 될지도 모른다. ================================================================================ overcommit_memory: 이 값은 memory overcommitment 를 가능하게 하는 falg 를 포함하고 있다. 이 flag 가 0 일 경우, kernel 은 각 malloc() 함수를 호출하기 전에 memory 가 얼마나 충분하게 남았는지를 체크를 하게 된다. 만약 flag 가 0 이 아니라면, system은 항상 충분한 메 모리를 확보 하려고 하게 된다. 이 요소는 수많은 프로그램이 malloc() 함수를 사용함으로 해서 메모리를 잠식하는 것 을 방지 하기 위해 아주 유용하게 사용을 할수가 있다. 더 많은 정보를 위해서는 mm/mmap.c::vm_enough_memory() 을 참조 하라 ================================================================================ page-cluster: Linux 가상 메모리 subsystem은 디스크 결함에 의한 다중 page 를 읽어 들임으로 인한 과도한 디스크 seek 를 회피한다. page 의 수는 기계의 메모리의 양에 따라 읽어 들이 게 된다. 커널이 한번에 읽을수 있는 page 의 수는 2 ^ page-cluster 와 같다. 2 ^ 5 이상의 값 은 32-page group 안에서만 swap date 를 cluster 할수 있기 때문에 사용할수 없다. ================================================================================ pagecache: 이 파일은 버퍼 메모리와 같이 정확하다. 이 파일은 오직 struct page_cache를 조절하 고 앞서 말한바와 같이 page cache 를 위해 사용되어지는 memory 의 양을 조절한다. 커널 2.2 에서, page cache 는 3 개의 주 목적에 사용이 되어 진다: - caching read() data from files - caching mmap()ed data and executable files - swap cache 시스템이 swap 과 cache 가 둘다 가중할 때, 아마도 swap 되어진 data 가 caching 이 되어서 일것이다. 이것은 커널 2.0 에서 가능한 효과적인 swapping 보다 더 많이 기록 을 할수 있기 때문이다. ================================================================================ pagetable_cache: 커널은 각 프로세서 캐쉬 에서 page table의 수를 지킨다. (이것은 SMP 시스템에서 도 움을 받는다) 각 프로세서를 위한 캐쉬 크기는 log 와 high 값 사이에서 지정된다. low-memory 에서, single CPU 시스템은 메모리 낭비 없이 이 값을 안전하게 0 으로 설 정할수 있다. 다중 CPU 시스템들에서는 kernel memory lock 이 요구되는 것 없이 fast pagetabel 할당을 하기 위해 사용하고는 한다. 대형 시스템들을 위해서, 설정값은 아마 OK 일것이다. 일반적인 시스템들을 위해서는 조각을 낼 필요는 없다. 소형 시스템들 (램의 용량이 16M 보다 작을 경우) 에서는 두 값을 모두 0 으로 하는 것이 더 낳을 것이다.



>> 이전 : Sysctl Configuration for Kernel parameters
>> 다음 : Sysctl for File System in Kernel



    



 Home > Lecture > Kernel > Kernel-4

Copyright 1997-2024 JoungKyun Kim 
LAST MODIFIED: 2017/01/18