2007년 6월 21일 목요일

/dev/shm과 swap

물리 메모리가 2기가인 시스템이 예쁘게 놓여 있다. 여기에 물리 메모리보다 큰 메모리 파일 시스템을 적용해보고 거기에 물리 메모리보다 큰 파일을 할당할 수 있는지, 할당한다면 Resident 상태로 잡히는지 Swap으로 잡히는지 테스트 해보자.
$ cat /proc/sys/vm/swappiness
0

$ uname -s -r
Linux 2.6.9-42.ELsmp

$ free -m
             total       used       free     shared    buffers     cached
Mem:          2026         35       1990          0          0          6
-/+ buffers/cache:         28       1997
Swap:         4102          0       4102

$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              63G  1.4G   59G   3% /
/dev/sda1             289M   16M  259M   6% /boot
none                  1.0G     0  1.0G   0% /dev/shm
이런 시스템이 있단 말이지.
$ mount -oremount,size=3G /dev/shm
$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              63G  1.4G   59G   3% /
/dev/sda1             289M   16M  259M   6% /boot
none                  3.0G     0  3.0G   0% /dev/shm
일단 물리 메모리보다 큰 파일 시스템을 마운트 했다. 이제 아래와 같은 우왁시런 소스로 2.5기가 파일을 생성해보자.
#define _LARGEFILE_SOURCE 1
#define _FILE_OFFSET_BITS 64
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

int
main(int argc,char* argv[])
{
        if (argc<2)
        {
                printf("falloc [size mb]\n");
                exit(1);
        }
        off_t size(atoi(argv[1]));
        size *= 1024*1024;
        int fd (open("/dev/shm/falloc.dat", O_TRUNC|O_CREAT|O_RDWR, 0700));
        char buf[1024*1024];
        for ( size_t i = 0; i < atoi(argv[1]); i++ )
        {
                write(fd, buf, sizeof(buf));
        }
        close(fd);

        return 0;
}
컴파일하고 실행해보자!
$ make falloc
g++     falloc.cpp   -o falloc

$ ./falloc 2560
# 영겁이 걸린다.

$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              63G  1.4G   59G   3% /
/dev/sda1             289M   16M  259M   6% /boot
none                  3.0G  2.6G  510M  84% /dev/shm

$ free -m
             total       used       free     shared    buffers     cached
Mem:          2026       2002         23          0          0        597
-/+ buffers/cache:       1404        621
Swap:         4102       1968       2134

컴퓨터 멈추는 줄 알았다. 참고로 이거 하는 동안 vmstat 1을 했는데 swap-out이 엄청나게 일어났다.
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in    cs us sy id wa
 1  0    144 906456    840 1134840    0    0     0     0 4018     4  0 25 75  0
 1  0    144 391640    840 1648600    0    0     0     0 4020    14  0 25 75  0
 3  1 657396  14096    148 1368900    0 37724     0 37724 8062   180  0 24 55 21
 3  0 1421560  14120    156 630984    0    0     0    36 4198    12  0 50 36 14
 0  4 1699308  14016    156 407260    0 209064     0 209092 4640   194  0 25 49 26
 0  2 1726188  14016    156 407700    0 248016     0 248016 5165   134  0  6 50 44
 1  1 1726188  14080    156 448044    0 291288     0 291288 4494   125  0  8 50 42
 0  3 1726188  15488    156 480168    0 256580     0 256580 4297   100  0  6 50 44
 0  2 1726188  14400    156 499136    0 106820     0 106820 4442    69  0  3 50 48
 0  3 1726188  14016    156 504624    0 5012     0  5012 4522    49  0  0 50 50
 0  2 1726188  16640    156 504652    0 3900     0  3900 4507    53  0  0 50 50
 0  2 1726188  14336    156 518596    0 17452     0 17452 4373    45  0  1 50 49
좀 성급하긴 하지만 위 결과를 토대로 "공유 메모리도 swap 정책에 따른다"는 것을 알 수 있다.