/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
|