기본 콘텐츠로 건너뛰기

/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 정책에 따른다"는 것을 알 수 있다.

댓글

이 블로그의 인기 게시물

Bash Array, Map 정리

Bash에서 Array, Map에 대한 정리. (매번 찾기 귀찮) 찾아보진 않았지만, Bash에서 Array든 Map이든 동일하게 Map(C++에서 Unordered Map)으로 동작하는 것 같다. 왜냐하면, Array의 Index가 연속하지 않아도 동작한다. 그저 Key가 0 이상의 정수인 Map이랑 비슷하게 동작한다. 예) 1, 2, 3, 9, 10 Array # 생성 declare -a empty_array declare -a ar=(haha hoho baba "long string haha hoho") # 접근 echo "ar[0]=${ar[0]}" echo "all as array=${ar[@]}" # 큰따옴표 안에서 각 원소를 따로따로 전달한다. echo "all as one=${ar[*]}" # 큰따옴표 안에서 각 원소를 문자열 하나로 합쳐 전달한다. echo "indexes=${!ar[@]}" echo "indexes=${!ar[*]}" echo "length=${#ar[@]}" echo "length=${#ar[*]}" echo "last=${ar[-1]}" echo "last=${ar[@]: -1}" # 콜론 뒤에 빈 칸이 꼭 필요하다. 옛 방식 # 현재 상황 declare -p ar #(출력) declare -a ar=([0]="haha" [1]="hoho" [2]="baba" [3]="long string haha hoho") ar[100]=hello # 인덱스를 건너 뛰어도 동작한다. declare -p ar #(출력) declare -a ar=([0]="haha" [1]="hoho" [2]="baba" [3]=&

설치한 패키지에서 RPM 추출하기

오래된 패키지를 관리할 저장소가 없어졌고, 기존 패키지로 다른 서버를 세팅해야할 일이 생겼다면 RPM의 리패키지 기능을 이용해보자. $ rpm -e --repackage [PACKAGE_NAME] 위와 같이 리패키지하면, /var/spool/repackage/ 에 생성한 RPM파일이 있다. :-)