UNIX/유닉스 공통

[스크랩] Swap memory 내용 (간략이 아님. 적용 방법은 다른 글 참조)

99iberty 2014. 2. 12. 11:21

http://mentlen.blogspot.kr/2013/02/swap-memory.html

 

swap 필요한 이유

  • Memory consuming programs. 많은 메모리를 필요로 하는 프로그램
  • Hibernation (suspend-to-disk). 절전모드 진입시 메모리(RAM)를 디스크로 저장.
  • Unforeseeable Circumstances. 예측하지 못한 이벤트발생시 문제를 해결하거나 작업을 저장할 수 있는 시간 확보.
  • Optimizing memory usage. 빠른 응답속도를 위한 cached memory. 그 확장을 더 효율적으로 하기 위함.. (???)
  • Optimizing Swap performance. 시스템영역과 스왑영역을 같은 디스크에 두면 성능에 좋지않다.. 이건 스왑이 필요한 이유가 아닌데...?

  • swap 용량을 얼마나 잡아야 하는가?
  • 최소한, 물리적으로 장작된 RAM 용량과 같을 것을 매우 권장(highly recommended) 한다.
  • 물리적으로 장착된 RAM 용량의 두배정도를 걍 권장(Also, it's recommended) 한다.
    옛날 메모리가 넘 비쌀때... 그런 권장사항이 생겼단다
  • 근데 예를 든 경우를 보니까 2G RAM 에 30G disk 인 경우 1G 쯤 잡아도 되나보다.
    그러니까..... 디스크용량이 메모리에 비해 너무 적은 경우에는 별수 없다..쯤 될까...아씨..;;;
  • 그냥.. 메모리 2G 쯤 되면 자기 메모리 만큼만 잡으면 되지 않을까 싶다. 아, 이건 만고 내생각.

  • 어떻게 swap 을 추가할 수 있나?
    - 대부분, OS설치시 스왑파티션을 만들지만 이미 설치된 시스템에서 추가하는 경우를 말한다.
    - 적용된 후에는 free 명령으로 확인 가능하다.
  1. Creating a file the size you want.
    • sudo dd if=/dev/zero of=/mnt/512Mb.swap bs=1M count=512
  2. Formatting that file to create a swapping device.
    • sudo mkswap /mnt/512Mb.swap
  3. Adding the swap to the running system.
    • sudo swapon /mnt/512Mb.swap
  4. Making the change permanent.
    • gksudo gedit /etc/fstab
    • Add this line at the end of the file:
      /mnt/512Mb.swap none swap sw 0 0

  • swappiness 변경 방법
    - 커널이 프로세스를 메모리영역에서 스왑영역으로 이동시키는 정도를 설정하는 파라미터값.
    - 0 에서 100 사이 (우분투 기본값 60). 0 에 가까울 수록 사용정도가 적어진다.
  1. 현재 값 체크 (To check the swappiness value)
    • cat /proc/sys/vm/swappiness
  2. 현재 시스템에 변경값 바로 적용 - 재부팅시 반영안됨. (To change the swappiness value A temporary change (lost on reboot) with a swappiness value of 10 can be made with)
    • sudo sysctl vm.swappiness=10
  3. 부팅시마다 적용하기 위해 설정파일 수정 (To make a change permanent, edit the configuration file with your favorite editor:)
    • gksudo gedit /etc/sysctl.conf
  4. vm.swappiness 항목을 찾아서 수정하거나, 없다면 추가한다. (Search for vm.swappiness and change its value as desired. If vm.swappiness does not exist, add it to the end of the file like so:)
    • vm.swappiness=10
  5. 저장 후 재부팅. (Save the file and reboot.)


 

*****************************************************************
1. Gparted 같은 유틸리티를 사용해서 파티션을 조절 하시던가
2. 스왑 파일을 만들어 두는 겁니다. 파티션을 건드리기가 꺼림직하시면 이쪽이 더 간편할겁니다. 터미널에서:



Code:
sudo su
dd if=/dev/zero of=/swapfile bs=1024k count=[메가바이트]
mkswap /swapfile
swapon /swapfile


이렇게 입력하세요. 원하는 크기의 파일을 임시로 만들어서 그걸 스왑 파일로 정의하고 스왑을 사용하게 하라는 의미입니다.

* 저 [메가바이트] 를 원하는 스왑 크기 (메가바이트 단위)로 대체하세요. 예를 들어 1기가바이트를 주려면 1024를 입력하면 되겠죠

이대로는 부팅마다 swapon /swapfile을 입력해 줘야 하니:

Code:
sudo gedit /etc/fstab


을 입력하시고 열린 파일에 이걸 추가하세요.

Code:
/swapfile none swap sw 0 0


정상적으로 적용되었는지는 터미널에서

Code:
free


를 입력해 보면 됩니다.


**********************************************************************************************************************************

1. 스왑파일시스템을 이용하여 스왑용량 늘리는 방법
- /dev/sda2 를 스왑파일시스템으로 만들기
- 현재 시스템의 스왑용량을 확인하기
- free , swapon -s
- fdisk 를 실행후에 fdisk 전용명령어 t 를 입력. t 는 현재의 파일시스템 타입을 변경하는 것
- /dev/sda2 파티션을 82번으로 변경. 파일시스템 타입 82번은 스왑파일시스템을 의미
- fdisk 전용명령어 w 를 입력하여 파티션 설정을 저장하고 fdisk 모드에서 나온다.
- mkswap 명령어를 이용하여 /dev/sda2 파티션을 스왑파일시스템으로 포맷한다.
mkswap /dev/sda2
- swapon 명령어를 이요하여 /dev/sda2를 스왑공간으로 활성화 한다.
swapon /dev/sda2
- 현재 시스템의 스왑용량을 확인하면 기존의 용량에 /dev/sda2 가 추가되어 늘어난 용량을 확인할 수 있다.
free, swapon -s
- 설정한 후에 /dev/sda2 가 재부팅 후에도 지속적으로 스왑공간으로 사용되도록 하기 위하여 /etc/fstab 파일에 설정.
/dev/sda2 swap swap defaults 0 0
- 설정한 /dev/sda2 의 스왑사용을 중지하려면 swapoff /dev/sda2 를 사용함.
2. 스왑파일을 이용하여 스왑용량 늘리기
- 스왑으로 사용할 파일을 만든다.
touch /swapfile
- dd 명령어를 이용하여 입력을 /dev/zero 로 하고 출력을 방금 생성한 /swapfile 로 하여 작업한다.
dd if=/dev/zero of=/swapfile bs=1024 count=1000
- 생성한 스왑파일 확인
ls -l swapfile
- mkswap 을 이용하여 swapfile 을 스왑파일로 포맷한다.
mkswap /swapfile
- swapfile 을 스왑공간으로 활성화 한다.
swapon /swapfile
- 스왑용량을 확인하면 전체적인 스왑공간이 늘어났음을 확인할 수 있다.
swapon -s, free
- 설정한 스왑파일을 재부팅시에 매번 적용하기 위하여 /etc/rc.d/rc.local 파일에 등록한다.
swapon /swapfile

*****************************************************************

약 어플리케이션의 RAM 용량이 차면, swap 메모리가 자동으로 늘어나도록 되어 있다.

하드디스크의 디스크를 swap 메모리로 만들기 때문에 속도가 느려진다.

또한 RAM의 용량보다 2배로 swap 메모리를 잡도록 되어 있다.
시스템 엔지니어는 이런 이슈로 리눅스 서버를 셋팅할 때 swap 영역을 얼마나 잡을지 판단해야 한다.
때로는 개발자가 이 부분을 고쳐 성능을 향상 시킬 수 있다.

개인적으로는 메모리가 갑자기 부족한 경우를 제외하고는 swap 자체를 안쓰는 것을 선호한다.

성능상 swap 메모리를 쓰는 것보다 swap in , swap out이 성능을 무너뜨리는 것을 많이 봐왔다.
또한 너무 크게 사용하는 것도 경계한다.
(난 보수적인 사람이 되었나 보다… 아직 적절히 활용한 대용량 처리 사례를 못해봐서 그런지도 모르겠다. )

차라리 RAM 하나 더 꽂는게 더 나은 것 같다.

하지만 DB나, 오픈 소스 대용량 처리 어플리케이션의 경우에서는 swap을 많이 활용하려고 하고 있다는 사실이다.

어떻게 하든 속도를 내기 위해서 메모리에서 처리하려다 보니 swap을 쓸 수 밖에 없는 구조로 가고, 너무 많이 써서 문제가 되니 다시 mlock으로 막는 구조로 가는 부분으로 처리하는 형태로 가고 있다.

1. swap 및 ram 메모리 상태 보기


free 명령어를 이용해서 간단히 살펴볼 수 있다.

# free
total used free shared buffers cached
Mem: 4150252 3991868 158384 0 78504 2265916
-/+ buffers/cache: 1647448 2502804
Swap: 2096472 208 2096264


2. Swap 메모리 설정하는 방법


리눅스 커널 2.6부터 swap 메모리를 설정할 수 있다. swap 영역은 dd 명령어와 mkswap 명령어를 이용해서 swap을 만들 수 있다.

이렇게 만들어진 영역은 swap 메모리로 쓰고 있다는 뜻이다.

아래의 예는 swap을 2G 정도만 쓰고 있다는 것을 의미한다.

# cat /proc/swaps
Filename Type Size Used Priority
/dev/cciss/c0d0p2 partition 2096472 208 -1


3. Swap 메모리 사용 빈도 설정 방법


swap 메모리를 사용 빈도를 확인하는 방법은 vm.swappiness 정보를 보는 것이다. centos를 비롯한 일부 서버는 디폴트로 60으로 잡혀 있다.

]# sysctl vm.swappiness (또는 cat /proc/sys/vm/swappiness 으로 확인 가능)
vm.swappiness = 60


vm.swapiness 정보는 커널 파라미터이며 swap 영역을 얼마나 더 보겠냐 (또는 회피하겠냐)는 의미를 가지고 있다.

(kernel's preference (or avoidance) of swap space) 여기에 0의 값을 넣으면 swap을 최대한 쓰지 않겠다는 의미이다.

만약 100은 하드디스크의 swap영역을 최대한 활용하겠다는 의미이다.

제일 이슈는 swap 메모리가 많이 잡혀 있는 것보다 얼마나 사용하고 있는지를 측정하는 것이 좋다.

free나 cat /proc/swaps 명령어를 이용해서 해결할 수 있다.

만약 swap 메모리를 쓰지 않으려면, vm.swappiness를 0으로 셋팅하면 된다.

/etc/sysctl.conf 에 ‘vm.swappiness=0 ‘ 설정을 추가하고, ‘echo 0 > /proc/sys/vm/swappiness ‘ 명령어를 이용해서 적용한다.
5. Swappiness (2.6 kernels)
Since 2.6, there has been a way to tune how much Linux favors swapping out to disk compared to shrinking the caches when memory gets full.

ghoti adds:
When an application needs memory and all the RAM is fully occupied, the kernel has two ways to free some memory at its disposal: it can either reduce the disk cache in the RAM by eliminating the oldest data or it may swap some less used portions (pages) of programs out to the swap partition on disk.
It is not easy to predict which method would be more efficient.
The kernel makes a choice by roughly guessing the effectiveness of the two methods at a given instant, based on the recent history of activity.

Before the 2.6 kernels, the user had no possible means to influence the calculations and there could happen situations where the kernel often made the wrong choice, leading to thrashing and slow performance. The addition of swappiness in 2.6 changes this.

또한 vfs_cache_pressure 라는 값을 0으로 잡아, 커널의 cache를 빨리 날려줄 수 있도록 한다.

linux에서는 어플에서 처리한 남는 메모리를 바로 free되지 않고 buffer cache에 남게 한다.
이를 이용하면 free memory를 더 확보할 수 있다.


4. swap in, swap out 확인하는 방법


 


sar 명령어를 이용하면 메모리 상태를 확인할 수 있다.

]# sar -r -s 11:41:00
Linux 2.6.9-78.ELsmp
11시 41분 kbmemfree kbmemused %memused kbbuffers kbcached kbswpfree kbswpused %swpused kbswpcad
11시 42분 5932304 10700956 64.33 358820 1087040 2096280 192 0.01 0
Average: 5932304 10700956 64.33 358820 1087040 2096280 192 0.01 0


sar 명령어의 –B 파라미터는 swapping 통계를 낸다.

]# sar -B 2 5
Linux 2.6.9-78.ELsmp
11시 41분 28초 pgpgin/s pgpgout/s fault/s majflt/s
11시 41분 30초 2.04 75.51 21.43 0.00
11시 41분 32초 0.00 0.00 359.49 0.00
11시 41분 34초 0.00 258.46 19.49 0.00


5. 이슈


jvm 영역에서 사용된 메모리는 언제나 swap 영역으로 이동될 수 있다.

jvm 에서 nio를 사용하는 경우 (예, DirectBuffer) 에는 리눅스 운영체제가 언제든지 swap 영역으로 이동할 수 있다.
이를 방지하기 위해서는 mlock/mlockall 시스템 콜을 이용해서 특정 virtual address를 ram 에 묶어 둘 수 있게 한다.

mlock을 쓰는 방식이 cassandra 0.6.5 에서 추가되었다.

마치며..

리눅스의 swap 메모리를 이해할 수 있었다. jvm을 사용하면서 나타날 수 있는 swap 메모리 이슈에 대해서 쉽게 처리할 수 있도록 공부하자.
cassandra의 swap 이슈 에 대한 분석을 좀 더 이해하려고 한다.

------------------------------------------------------------------------------------------------------------