본문 바로가기

리눅스

[draft] 리눅스 스왑 메모리(Swap Memory)

리눅스 스왑 메모리(Swap Memory)

스왑 메모리(Swap Memory)는 컴퓨터의 주 메모리(RAM)가 모두 사용되어 추가적인 메모리가 필요한 경우 사용되는 보조 메모리입니다. 주 메모리가 가득 차거나 시스템이 더 많은 메모리를 필요로 할 때, 운영 체제는 일부 데이터를 주 메모리에서 디스크의 스왑 영역(일반적으로 하드 디스크의 특정 파티션 또는 스왑 파일)으로 옮김으로써 메모리 부족 상태를 해소합니다.

 

스왑 메모리는 물리적인 RAM보다 훨씬 느리기 때문에, 주 메모리보다 액세스 속도가 느리지만 시스템의 안정성과 성능을 유지하는 데 중요한 역할을 합니다. 스왑 메모리를 사용하는 것은 시스템에 더 많은 프로세스를 동시에 실행할 수 있도록 하며, 실제 메모리 크기보다 큰 프로그램을 실행하는 데 도움이 됩니다.

 

스왑 메모리의 단점은 데이터 전송 속도가 느리기 때문에 스왑 영역으로 데이터를 옮기는 작업이 발생하면 성능 저하가 일어날 수 있다는 것입니다. 따라서 스왑이 빈번하게 발생한다면, 시스템이 더 많은 RAM이 필요하다는 신호일 수 있습니다. 즉, 스왑이 자주 발생하는 경우에는 더 많은 물리적인 RAM을 추가하는 것이 성능 향상에 도움이 될 수 있습니다.

 

현대의 컴퓨터는 보통 상대적으로 큰 용량의 RAM을 갖고 있으므로 스왑이 자주 발생하는 경우는 그리 흔하지 않지만, 여전히 메모리 관리는 중요한 주제이며, 시스템 성능과 안정성에 영향을 미치는 요소 중 하나입니다.

출처-https://recoverhdd.com/wp-content/themes/soft/images/blog/swap-file/principle.webp

리눅스에서 스왑 영역 및 메모리 사용 상태를 확인하는 방법

1. free 명령어

free 명령어를 사용하면 현재 시스템의 전체 메모리 및 스왑 영역의 사용 상태를 보여줍니다.

free -h
$ free -h
              total        used        free      shared  buff/cache   available
Mem:           3.7G        3.1G        521M        9.0M        129M        468M
Swap:          4.0G          0B        4.0G

출력 필드 설명

  • total : 시스템에 설치된 총 메모리 용량
  • used : 현재 사용 중인 메모리 용량
  • free : 현재 사용 가능한(free) 메모리 용량
  • shared : 공유 메모리 용량
  • buff/cache : 버퍼(buffer) 및 캐시(cache)에 사용되는 메모리 용량
  • available : 즉시 사용 가능한(available) 메모리 용량. 이 값은 실제 사용 가능한 메모리 용량을 반영하며, 시스템이 추가 메모리를 요청하는 데 사용될 수 있습니다.

위 명령어를 실행하면 사용 가능한 물리적인 메모리(RAM)와 스왑 영역의 크기, 사용 중인 양, 사용 가능한 양 등이 메가바이트(MB) 또는 기가바이트(GB) 단위로 표시됩니다.

2. swapon 명령어

swapon 명령어를 사용하여 현재 활성화된 스왑 영역을 확인할 수 있습니다.

swapon --show
$ swapon -s
Filename                                Type            Size    Used    Priority
/dev/dm-1                               partition       4194300 0       -2

위 명령어를 실행하면, 활성화된 스왑 영역과 해당 영역의 용량이 표시됩니다.

3. /proc/swaps 파일

/proc/swaps 파일에는 현재 시스템에 활성화된 스왑 영역에 대한 정보가 포함되어 있습니다. 파일을 직접 읽어 확인할 수 있습니다.

cat /proc/swaps
$ cat /proc/swaps 
Filename                                Type            Size    Used    Priority
/dev/dm-1                               partition       4194300 0       -2

4. top 또는 htop 명령어

top 명령어 또는 htop 명령어를 사용하여 실시간으로 시스템의 메모리 및 스왑 영역 사용 상태를 모니터링할 수 있습니다.

top

또는 (htop이 설치되어 있는 경우)

htop

또는 (vmstat이 설치되어 있는 경우)

vmstat -s
$ vmstat -s
     37024544 K total memory
     17924776 K used memory
      4842296 K active memory
     25644944 K inactive memory
      3303324 K free memory
         7480 K buffer memory
     15788964 K swap cache
     16777212 K total swap
         8556 K used swap
     16768656 K free swap
     80703009 non-nice user cpu ticks
        56330 nice user cpu ticks
     32451025 system cpu ticks
  12860577821 idle cpu ticks
     21485580 IO-wait cpu ticks
            0 IRQ cpu ticks
       840568 softirq cpu ticks
            0 stolen cpu ticks
      8008880 pages paged in
    358367646 pages paged out
       341129 pages swapped in
      1776783 pages swapped out
    454675945 interrupts
   1552745463 CPU context switches
   1706760923 boot time
    106370269 forks

출력 필드 설명

  • total memory : 총 메모리 용량
  • used memory : 현재 사용 중인 메모리 용량
  • active memory : 활성(active) 메모리 용량. 현재 사용 중인 메모리로, 자주 액세스되는 데이터가 포함됩니다.
  • inactive memory : 비활성(inactive) 메모리 용량. 최근에 사용되지 않은 메모리로, 메모리 액세스가 덜 자주 발생하는 데이터가 포함됩니다.
  • free memory : 현재 사용 가능한(free) 메모리 용량
  • buffer memory : 버퍼(buffer) 메모리 용량
  • swap cache : 스왑 캐시(swap cache) 용량
  • total swap : 총 스왑 용량
  • used swap : 현재 사용 중인 스왑 용량
  • free swap : 현재 사용 가능한(free) 스왑 용량
  • 기타 : CPU 사용 통계, 페이지 교체 통계 등 시스템 상태와 관련된 여러 통계 정보를 포함합니다.

위 명령어를 실행하면 시스템의 상태가 실시간으로 갱신되며 메모리와 스왑 영역 사용량도 확인할 수 있습니다.

스왑 영역(메모리) 초기화

스왑 영역(스왑 메모리)을 초기화하려면 해당 스왑 파티션 또는 스왑 파일을 언마운트하고 비워야 합니다. 이렇게 하면 스왑 영역에 저장된 데이터가 삭제되고, 새로운 데이터가 스왑에 쓰일 수 있게 됩니다. 초기화하기 전에 스왑 영역을 사용 중인지 확인하고, 사용 중이라면 시스템에서 해당 스왑을 해제하고 비워야 합니다.

1. 스왑 해제

swapoff를 하게 되면 swap out -> swap in 되면서 실제 물리 메모리로 이동한다.

swapoff -a

** 다소 시간이 걸림

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           3.7G        3.1G        525M        8.9M        130M        472M
Swap:            0B          0B          0B

2. 스왑 사용 확인

현재 시스템에서 스왑 영역이 사용 중인지 확인합니다.

swapon -s

3. 스왑 영역 초기화

스왑을 해제한 후에는 해당 스왑 영역을 초기화합니다.

  • 스왑 파티션 초기화
sudo mkswap /dev/{스왑_파티션}
  • 스왑 파일 초기화
sudo truncate -s 0 /path/to/swapfile
sudo chmod 600 /path/to/swapfile
sudo mkswap /path/to/swapfile

위 명령어를 실행하여 스왑 파티션 또는 스왑 파일을 초기화합니다.

4. 스왑 영역 다시 활성화

스왑 영역을 초기화한 후에 다시 활성화합니다.

  • 스왑 파티션 활성화
sudo swapon /dev/{스왑_파티션}
  • 스왑 파일 활성화
sudo swapon /path/to/swapfile

리눅스 시스템에서 스왑 메모리를 조절하는데 사용되는 주요 커널 파라미터(스왑 메모리 사용 빈도 조절)

1. vm.swappiness: 이 값은 시스템이 언제 스왑 메모리를 사용하도록 하는지를 조절합니다.

  • 값의 범위는 0에서 100까지이며, 기본값은 일반적으로 60입니다.
  • vm.swappiness=0: 스왑 메모리를 전혀 사용하지 않음을 의미합니다. RAM이 가득 찬 경우에도 스왑을 사용하지 않습니다.
  • vm.swappiness=100: 시스템이 가능한 한 빠르게 스왑 메모리를 사용하도록 합니다. RAM이 조금이라도 부족하면 스왑을 즉시 사용합니다.

값을 변경하려면 다음과 같이 sysctl 명령어를 사용하거나, /etc/sysctl.conf 파일에 설정을 추가하여 영구적으로 변경할 수 있습니다.

# 현재 swappiness 값을 확인
sysctl vm.swappiness
# swappiness 값을 변경 (영구적으로 적용하려면 /etc/sysctl.conf 파일에도 추가)
sudo sysctl vm.swappiness=10

스왑 메모리 사용 빈도 변경

$ sysctl vm.swappiness=10
vm.swappiness = 10
$ sysctl -w vm.swappiness=10
vm.swappiness = 10
echo 10 > /proc/sys/vm/swappiness

영구 적용 (재부팅 시에 적용됨)

$ vim /etc/sysctl.conf
vm.swappiness = 10

2. vm.vfs_cache_pressure: 이 값은 파일 시스템 캐시가 페이지 캐시(메모리)와 스왑 메모리 간의 교환 비율을 조절합니다.

  • 기본값은 일반적으로 100이며, 값이 높을수록 파일 시스템 캐시를 더 적극적으로 사용하고 스왑을 덜 사용하게 됩니다.
# 현재 vfs_cache_pressure 값을 확인
sysctl vm.vfs_cache_pressure
# vfs_cache_pressure 값을 변경 (영구적으로 적용하려면 /etc/sysctl.conf 파일에도 추가)
sudo sysctl vm.vfs_cache_pressure=50

위의 커널 파라미터를 조절하여 스왑 메모리의 사용 방식을 변경할 수 있습니다. 값의 변경은 시스템의 특정 요구 사항과 하드웨어 성능에 따라 달라질 수 있으며, 변경하기 전에 신중히 고려하고 테스트하는 것이 좋습니다.

 

참고URL

- Red Hat Customer Portal : Interpreting /proc/meminfo and free output for Red Hat Enterprise Linux