IT/Linux

swap 영역 확장 및 swap 관련 커널 파라미터 튜닝

nofence 2016. 11. 25. 15:56

현재 운영 중인 라즈베리파이의 swap 영역 확장 작업을 진행해 보았다.


현재 swap 영역은 100M임이 확인 되었다.


root@rasberrypi:~# free -m

             total       used       free     shared    buffers     cached

Mem:           925        668        257         32        114        313

-/+ buffers/cache:        240        685

Swap:           99          0         99


root@rasberrypi:~# swapon -s
Filename                                Type            Size    Used    Priority
/var/swap                               file            102396  4204    -1


2GB의 swap 파일을 dd 유틸리티를 통해 생성해 보자.


root@rasberrypi:~# dd if=/dev/zero of=swap_file bs=1G count=2

dd: memory exhausted by input buffer of size 1073741824 bytes (1.0 GiB)


위에서 1GB의 bs 값을 설정했지만 입력 버퍼 사이즈에 대한 메모리 초과 오류가 발생하여 전략을 수정하기로 했다. bs 값을 512MB로 하향 조정했고, count 값을 4로 수정했다. 즉, 아웃풋으로 생성 될 swap 파일은 2GB로 동일한 셈이다.


root@rasberrypi:~# dd if=/dev/zero of=swap_file bs=512M count=4


4+0 records in

4+0 records out

2147483648 bytes (2.1 GB) copied, 137.298 s, 15.6 MB/s



위와 같이 bs와 count의 값을 각각 수정하여 명령어를 실행시킨 결과 swap_file이라는 2GB의 용량을 가진 파일이 생성 되었음을 아래와 같이 확인할 수 있다.


root@rasberrypi:~# ll -h swap_file
-rw-r--r-- 1 root root 2.0G Nov 25 20:28 swap_file


유닉스를 포함한 리눅스 세계에서, 전통적인 유틸리티인 dd를 대체할 만한 유틸리티가 존재한다는 걸 구글링을 통해 알게 되었다. fallocate이라는 유틸리티인데, 이에 대한 설명은 아래와 같다.

root@rasberrypi:~# whatis fallocate
fallocate (2)        - manipulate file space
fallocate (1)        - preallocate or deallocate space to a file


fallocate를 통해 2GB 용량의 파일을 하나 생성해 보기로 했다. 명령어를 "땅" 입력한 순간 dd와는 달리 굉장히 빠른 속도로 파일이 생성 되었음에 혀를 내두를 수 밖에 없었다. 가히 충격적인 속도로 파일이 생성 되었다. 이런 유틸리티가 존재한다면 굳이 dd를 사용할 이유는 사라지게 되는 셈인데, 지속적으로 진화하는 리눅스 생태계의 모습이 새로운 유틸리티를 통해 반영 되는 게 아닌가 하는 생각이 든다.


어찌 되었든 아래와 같이 명령행을 통해 swap_space라는 2GB 용량의 파일이 하나 생성 되어 있는 걸 알 수 있다.

root@rasberrypi:~# fallocate -l 2G swap_space
root@rasberrypi:~# ll -h swap_space
-rw-r--r-- 1 root root 2.0G Nov 25 20:52 swap_space

생성한 swap_sapce 파일을 swap 파일시스템으로 적용한다.

root@rasberrypi:~# mkswap swap_space
Setting up swapspace version 1, size = 2097148 KiB
no label, UUID=52176056-3335-41dc-9434-6f18f16996d0

swap 파일시스템으로 변경 적용한 swap_space 파일의 종류를 확인한 결과 다음과 같다.

root@rasberrypi:~# file swap_space
swap_space: Linux/i386 swap file (new style), version 1 (4K pages), size 524287 pages, no label, UUID=52176056-3335-41dc-9434-6f18f16996d0


생성 된 파일을 swap 영역으로 활성화 하려 했으나, 아래와 같이 오류가 발생하였다.

root@rasberrypi:~# swapon swap_space
swapon: /root/swap_space: insecure permissions um0644, 0600 suggested.

퍼미션에 관한 오류로서, 600으로 퍼미션을 변경 적용 후 다시 swap 영역 활성화를 진행했지만 또 다른 오류가 발생했다.

root@rasberrypi:~# chmod 600 swap_space
root@rasberrypi:~# swapon swap_space
swapon: swap_space: swapon failed: Device or resource busy

swap 영역 비활성화 조치를 시도해 보고 다시 swap 영역 활성화를 한 결과 정상적으로 변경 사항이 적용되었다.

root@rasberrypi:~# swapoff swap_space
root@rasberrypi:~# echo $?
0


root@rasberrypi:~# swapon swap_space
root@rasberrypi:~# echo $?
0


swap 영역이 확장 되었는지에 대한 결과를 아래와 같이 확인할 수 있다.

root@rasberrypi:~# swapon -s
Filename                                Type            Size    Used    Priority
/var/swap                               file            102396  4204    -1
/root/swap_space                        file            2097148 0       -2


root@rasberrypi:~# free -m
             total       used       free     shared    buffers     cached
Mem:           925        401        524         28         11        243
-/+ buffers/cache:        147        778
Swap:         2147          4       2143


/etc/fstab에 swap 파일에 대한 섹션을 추가하여 재부팅 이후에도 변경 사항이 적용될 수 있도록 수정하자.

root@rasberrypi:~# tail -n 1 /etc/fstab
/root/swap_space none           swap    sw                0       0


파일을 수정했으면 재부팅을 진행한다.

root@rasberrypi:~# reboot

재부팅 완료 후 swap 영역에 대한 확장 사항이 올바르게 반영되었는지 확인 결과 아래와 같다.

root@rasberrypi:~# free -m
             total       used       free     shared    buffers     cached
Mem:           925        282        642         21         18        138
-/+ buffers/cache:        124        800
Swap:         2147          0       2147

root@rasberrypi:~# swapon -s
Filename                                Type            Size    Used    Priority
/root/swap_space                        file            2097148 0       -1
/var/swap                               file            102396  0       -2




다음은 swap 관련 커널 파라미터 튜닝에 대한 내용이다. 

/proc/sys/vm/swapiness 파일은 swap 영역과 메인 메모리 사이에 있어 swap-in, swap-out 작용이 얼마나 빈번하게 이뤄지는 지에 대한 사항을 관장하는 개체로서 값이 0에 가까울 수록 특별한 일이 발생하지 않는 이상, swapping이 거의 일어나지 않음을 뜻한다. /proc/sys/vm/vfs_cache_pressure 파일은 디렉토리 엔트리 일명, dentry와 i-node에 대한 데이터 캐시를 어느 정도의 주기 속도로 유지하는지를 담당하는 개체로서, 이 값이 100에 가까울 수록 일정한 속도로 캐시 메모리를 반납하게 된다. dentry와 i-node에 대한 캐시 메모리가 자주 반납 되면 시스템에 대한 오버헤드가 발생하므로 될 수 있으면 이들에 대한 캐시 메모리 반납 속도를 낮추는 쪽으로 값을 재설정하는 것이 시스템 안정성을 유지하는데 도움이 될 수 있다. swappiness 값은 10으로, vfs_cache_pressure 값은 디폴트 값의 절반인 50으로 수정하여 적용하도록 한다.

현재 설정 되어 있는 각각의 값들을 살펴 보자.

root@rasberrypi:~# cat /proc/sys/vm/swappiness
60
root@rasberrypi:~# cat /proc/sys/vm/vfs_cache_pressure
100


/etc/sysctl.conf 파일에 아래와 같이 각각 변경할 값을 추가 적용한다.

root@rasberrypi:~# echo "vm.swappiness = 10 " >> /etc/sysctl.conf
root@rasberrypi:~# echo "vm.vfs_cache_pressure = 50" >> /etc/sysctl.conf


변경 된 커널 파라미터를 다시 읽어 들이도록 적용한다.

root@rasberrypi:~# sysctl -p
vm.swappiness = 10
vm.vfs_cache_pressure = 50


아래와 같이 변경 된 커널 파라미터 값을 확인할 수 있다.

root@rasberrypi:~# sysctl -a --pattern swap
vm.swappiness = 10
root@rasberrypi:~# sysctl -a --pattern vfs
vm.vfs_cache_pressure = 50