리눅스에서 여러가지 테스트를 하다보면 memory를 full 시켜야할 상황이 오기도 합니다. 사실 제가 이런 테스트가 필요하기보단 필요한 분 도와드리다보니 아무래도 정리해놓는게 좋을 것 같아 가볍게 작성합니다.
오늘은 memory full test에서 swap 부분에 대해서 쉽게 사용하기 위해서 malloc과 vm.swappiness를 이용해서 테스트하는 방법에 대해 적어볼까 합니다.
Swap memory
Linux의 메모리 관리 기술 중 하나인 Swap 은 메모리가 부족할 때 보조기억장치를 활용해서 메모리 대용으로 사용하는 기법입니다. 음.. linux os 설치해주시면 자동으로 swap을 잡거나 직접 지정하게 되는데, 그 swap이 이 swap입니다.
물론 속도는 엄청 느리지요. 그래서 대체로 안쓰는걸 권장한다지요. (아예 빼라는건 아니고.. 그냥 여기까지 메로리를 안쓰는게 좋다 이정도.)
swap memory는 free 명령을 통해 쉽게 확인할 수 있습니다.
#> free total used free shared buffers cached Mem: 8105636 7898312 207324 210960 95684 884824 -/+ buffers/cache: 6917804 1187832 Swap: 8317948 125396 8192552
vm.swappiness
리눅스 커널 속성 중 하나로 스왑 메모리의 활용수준 및 사용 적극성에 관련하는 값입니다. vm.swappiness 를 높게 줄수록 적극적으로 스왑 메모리를 사용하죠.
같은 0 ~ 100까지 줄 수 있고 Default 60으로 설정되어 있습니다. 각각 수치는 아래와 같습니다.
Swappiness | Value | Description |
---|---|---|
vm.swappiness | 0 | 스왑 끄기 |
vm.swappiness | 1 | 스왑 최소화 |
vm.swappiness | 60 | Default |
vm.swappiness | 100 | 적극적 스왑 사용 |
#> sysctl vm.swappiness=100 #> cat /proc/sys/vm/swappiness 100
wm.swappiness 최대치로 malloc 테스트하기
메모리 풀을 만들기 위해선 간단한 코드로 테스트가 가능합니다. (처음 해킹 관심 가지게 한 이 malloc 함수가 모든일의 시초였죠)
반복하면서 malloc를 해주면 됩니다. 직접 작성하는것도 금방이지만 stackexchange에 좋은 코드 있어서 그걸로 대체할게요.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv) {
int max = -1;
int mb = 0;
char* buffer;
if(argc > 1)
max = atoi(argv[1]);
while((buffer=malloc(1024*1024)) != NULL && mb != max) {
memset(buffer, 0, 1024*1024);
mb++;
printf("Allocated %d MB\n", mb);
sleep(1);
}
return 0;
}
(http://unix.stackexchange.com/questions/1367/how-to-test-swap-partition)
-> Steven D 작성 코드
컴파일 해주시고. #> gcc -o swapmem_test swapmem_test.c
swappiness 를 최대치로 설정 후 돌려주시면..
#> sysctl vm.swappiness=100;./swapmemtest
메모리를 할당하며 swap을 최대한 쓰려고 하겠네요.
#> ./swapmeme_test Allocated 1 MB Allocated 2 MB Allocated 3 MB Allocated 4 MB Allocated 5 MB Allocated 6 MB
Reference
http://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_swappiness
http://unix.stackexchange.com/questions/1367/how-to-test-swap-partition (style=undefined)