[DEBIAN] malloc() 시 sysctl vm.swappiness를 이용하여 Swap 적극 활용하기

리눅스에서 여러가지 테스트를 하다보면 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)