Unix Linux

솔라리스 메모리 관리

_침묵_ 2007. 6. 27. 20:28

출처 :http://superkkt.com/21?TSSESSION=34642278462d6fb17b9095d9568b2d13

솔라리스는 리얼 메모리와 스왑 디바이스를 합친 크기를 메모리로 사용합니다. 예를들어 리얼 메모리가 1기가이고 스왑 디바이스 크기가 1기가라면 전체 메모리는 2기가 입니다.

메모리 할당이 어떻게 이루어지는 보기위해 아래 소스를 컴파일 해서 테스트를 해보겠습니다. 이 코드는 메모리 20메가를 할당 받고아무키나 누르면 할당 받은 메모리를 0으로 초기화 시킵니다. 다시 아무키나 누르면 할당받은 메모리를 반환하고 종료합니다.

# cat test.c
main()
{
    char *a;

    a = malloc(20485760); // 20메가 할당
    getchar(); // 키입력 기다림
    memset(a, "0", 20485760); // 할당받은 메모리 0으로 초기화
    getchar(); // 키입력 기다림
    free(a); // 메모리 반환
}

# gcc -o test test.c


그리고 다른 창을 하나 띄우고 vmstat 1을 실행하세요..

# vmstat 1
kthr memory page disk faults cpu
r b w swap free re mf pi po fr de sr s2 s3 s4 s5 in sy cs us sy id
0 0 0 5846976 1870760 0 0 0 0 0 0 0 0 0 0 0 727 39 65 0 0 100
0 0 0 5846976 1870760 0 65 0 0 0 0 0 0 0 0 0 733 166 103 0 0 100
0 0 0 5846976 1870760 0 0 0 0 0 0 0 0 0 0 0 726 64 78 0 0 100
0 0 0 5846976 1870760 8 80 0 0 0 0 0 0 0 0 0 742 271 145 0 0 100
0 0 0 5846976 1870760 6 70 0 0 0 0 0 0 0 0 0 727 170 104 0 0 100


.
.
.


위에 결과를 보면 free size가 스왑은 5846메가, 리얼 메모리는 1870메가 입니다. 이제 다시 원래 창으로 돌아가서 방금 컴파일한 test 를 실행합니다.

# ./test


다시 vmstat 창을 보면 리얼 메모리에는 변화가 없고 스왑 사이즈만 20메가 줄어들었습니다.

0 0 0 5826864 1870648 0 0 0 0 0 0 0 0 0 0 0 719 39 72 0 0 100
0 0 0 5826864 1870648 0 0 0 0 0 0 0 0 0 0 0 724 41 68 0 0 100
0 0 0 5826864 1870648 0 0 0 0 0 0 0 0 0 0 0 727 49 80 0 0 100
0 0 0 5826864 1870648 0 0 0 0 0 0 0 0 0 0 0 726 39 69 0 0 100
0 0 0 5826864 1870648 0 0 0 0 0 0 0 0 0 0 0 719 39 71 0 0 100


다시 원래 창에서 엔터를 한번 치면..

0 0 0 5826480 1850112 0 1818 0 0 0 0 0 0 0 0 0 731 42 92 2 2 96
0 0 0 5826480 1850112 0 0 0 0 0 0 0 0 0 0 0 727 74 71 0 0 100
0 0 0 5826480 1850112 0 0 0 0 0 0 0 0 0 0 0 725 50 72 0 0 100
0 0 0 5826480 1850112 0 0 0 0 0 0 0 0 0 0 0 721 39 67 0 0 100

 

리얼 메모리도 20메가 줄어듭니다. 원래 창에서 엔터를 한번 더 쳐서 메모리를 반환하고 프로그램을 종료하면 스왑과 리얼 메모리 사이즈는 원래대로 돌아옵니다.

프로그램이 메모리를 할당 받으면 우선 스왑이 줄어들고 실제로 메모리를 사용할때 리얼 메모리가 줄어드는걸 위에서 확인했습니다.그럼 스왑이 20메가 줄어들때 실제로 스왑 디바이스를 20메가 사용한걸까요? 아닙니다. 실제로 스왑 디바이스를 사용하지않았습니다.

지금 테스트를 하고 있는 시스템은 리얼 메모리 2기가, 스왑 4기가인 시스템 입니다. 합치면 6기가죠.. 위에 vmstat의swap 부분의 수치를 보세요.. free가 5826메가로 나오죠.. 이건 swap이 스왑 디바이스만을 나타내는게 아니라 리얼메모리와 스왑을 합친 크기를 나타내는걸 보여줍니다.


그럼 이제 프로그램이 메모리를 20메가 할당할때 실제로 스왑 디바이스가 사용되지 않았다는걸 확인해 보겠습니다.

test 프로그램을 실행시키기 전에 swap -l을 실행해 보세요..

# swap -l
swapfile dev swaplo blocks free
/dev/dsk/c0t0d0s1 118,25 16 8392048 8392048

결과를 보면 스왑 디바이스의 크기가 8392048 블럭(1블럭=512byte)인데 free도 같은 값을 가지는걸 보면 하나도사용을 안한걸 알 수 있습니다. 이제 다른 창에서 test 프로그램을 실행시키고 다시 swap -l을 해보세요..

# swap -l
swapfile dev swaplo blocks free
/dev/dsk/c0t0d0s1 118,25 16 8392048 8392048

보시다시피 아무 변화가 없습니다. 분명히 테스트 프로그램은 메모리 20메가를 할당 받았고 vmstat에서는 swap이 20메가 줄었는데.. 실제 스왑 디바이스의 크기에는 변화가 없습니다.

그럼 언제 스왑 디바이스를 쓸까요? 잘 아시겠지만 리얼 메모리가 모두 소진되기 직전에 사용이 됩니다. 이 시스템은 리얼 메모리가2기가니까 2기가만큼 메모리를 사용하면 그 다음부터 할당되는 메모리는 스왑 디바이스를 사용하겠죠.. 이걸 확인하기 위해서/tmp 디렉토리를 사용하겠습니다.

솔라리스에서 /tmp = 메모리 입니다. /tmp에 파일을 만들면 메모리에 파일을 만드는 겁니다. 그래서 df -k에서 /tmp의 available size가 vmstat의 swap과 거의 같은 값을 가집니다.

# pwd
/tmp

# df -k /tmp
Filesystem kbytes used avail capacity Mounted on
swap 5825016 0 5825016 0% /tmp

# vmstat 1
0 0 0 5818536 1888328 0 9 0 0 0 0 0 0 0 0 0 732 61 73 0 0 100
0 0 0 5818536 1888328 0 0 0 0 0 0 0 0 0 0 0 725 41 73 0 0 100


# mkfile 1g test.zip

# df -k /tmp
Filesystem kbytes used avail capacity Mounted on
swap 5817752 1048576 4769176 19% /tmp

# vmstat 1
0 0 0 4771072 840880 0 9 0 0 0 0 0 0 0 0 0 727 51 72 0 0 100
0 0 0 4771072 840880 0 0 0 0 0 0 0 0 0 0 0 726 50 77 0 0 100


/tmp에 test.zip이라는 1기가 사이즈의 파일을 만드니 메모리가 1기가 사용되었죠.. 그럼 스왑 디바이스의 상태를 보겠습니다.

# swap -l
swapfile dev swaplo blocks free
/dev/dsk/c0t0d0s1 118,25 16 8392048 8392048

아직 변화가 없습니다. 메모리 1기가를 사용해도 리얼 메모리의 여유가 840메가 정도 있기 때문이죠.. 그럼 1.5기가의 파일을더 만들어 보겠습니다. 예상대로라면 840메가의 리얼 메모리를 사용하고 모자라는 부분은 스왑 디바이스를 사용하겠죠..

# mkfile 1500m test2.zip

이제 시스템이 무지하게 느려집니다.. 왜냐면 리얼 메모리가 모두 소진되었으니 리얼 메모리 확보를 위해 사용하지 않는 부분은 모두스왑 디바이스로 페이지 아웃 시켜버리기 위해서죠.. 엄창난 페이징이 발생하기 때문에 거의 다운 상태에 가깝게 느려집니다.

그리고 다시 살아났을때 vmstat의 결과 입니다.

# vmstat 1
kthr memory page disk faults cpu
r b w swap free re mf pi po fr de sr s2 s3 s4 s5 in sy cs us sy id
0 0 34 3242368 1904616 7 11 0 0 0 0 0 0 0 0 0 721 60 83 0 0 100
0 0 34 3242368 1904616 0 0 0 0 0 0 0 0 0 0 0 722 41 69 0 0 100
0 0 34 3242368 1904616 0 0 0 0 0 0 0 0 0 0 0 727 49 75 0 0 100


swap은 정확하게 1.5기가 줄었는데 오히려 리얼 메모리는 많이 올라갔습니다. 이게 페이징의 결과 입니다. 메모리에서 사용되지않는 부분은 모두 스왑 디바이스로 보내버리고 리얼 메모리를 확보를 한거죠.. 이제 스왑 디바이스의 상태를 보겠습니다.

# swap -l
swapfile dev swaplo blocks free
/dev/dsk/c0t0d0s1 118,25 16 8392048 3173840

환산해보면 2.6기가 정도 스왑 디바이스를 사용 했습니다. 실제로는 test2.zip을 만들면서 700메가의 스왑만 필요했지만 메모리 페이징을 했기 때문에 많은 스왑 공간을 사용한겁니다.

 


엄청 기네요.. 두서 없이 적었는데.. 결론은..

 

프로그램이 메모리를 사용하면 swap을 사용한걸로 나오는데 이 swap이 실제 스왑 디바이스를 의미하는게 아니라 리얼 메모리 +스왑 디바이스를 의미하는 겁니다. 그래서 swap이 사용되었다고 해서 무조건 스왑 디바이스가 사용된거라고 볼 수는 없는겁니다.리얼 메모리가 모두 소진되었을때만 실제 스왑 디바이스가 사용되는 겁니다.


리눅스와의 차이점은 리눅스는 리얼 메모리와 스왑은 완전 별개의 것으로 보인다. 그러나 솔라리스는 이 두개를 하나의 개념으로 보여준다.

'Unix Linux' 카테고리의 다른 글

[Solaris] Memory and swapping  (0) 2007.06.28
GCC 파라메터와 친해지기  (0) 2007.06.02
Semaphores in Linux  (0) 2007.05.31