본문 바로가기
[OS]/Linux

[참고] Virtual Memory (SWAP 메모리) 확인 방법!!

by METAVERSE STORY 2023. 12. 22.
반응형

 

 

(1) Virtual Memory? SWAP?

Virtual Memory,  가상 메모리는 우리가 흔히들 RAM이라고 말하는 메모리의 보조적인 역할을 합니다.

우리가 프로그램을 사용하기 위해서는 메모리에 프로그램 코드나 데이터 파일들을 메모리에 적재시켜야 합니다. 그런데 우리의 메모리는 4 GB, 많이 사용하는 분들은 16 GB 정도? 되겠죠?

그러면 우리가 사용하고자 하는 프로그램이 메모리의 허용치를 넘어가거나, 많은 수의 프로그램을 실행해야 해서 메모리가 부족한 경우는 어떻게 될까요? 다른 프로그램이 끝날 때까지 기다렸다가 해야 할까요?

 

이러한 현상을 해결하기 위해 Virtual Memory라는 개념이 나왔습니다.

 그대로 가상의 메모리를 디스크에 두고 실제 메모리  것처럼 사용하는 것이지요.

리눅스에서는 이러한 Virtual Memory SWAP이라는 이름으로 부르는  뿐입니다. Window에서는 Paging File이라고 부르구요.

 

(2) 프로그램을 통째로 메모리에 올리나? -> 페이지(Page) 나누어서!

그러면 프로그램을 실행하기 위해서는 프로그램을 통째로 메모리에 올려야 할까요?

그러면 메모리의 낭비가 심해지겠죠…?

그래서 프로그램을 일정한 크기의 작은 단위로 나누어서 관리하기로 합니다.

이렇게 나뉘어진 단위를 페이지(Page)라고 하구요. 제가 위에서 Window 가상 메모리는 Paging File이라고 했죠? 여기서 네이밍을 따온  같습니다.

그림 출처: https://terms.naver.com/entry.nhn?docId=4383223&cid=59941&categoryId=59941

 

이렇게 나뉘어진 페이지 단위로 메모리에 적재되는 것입니다.

 

(3) 페이지 교체

아래와 같은 상황을 가정해봅시다

1) 프로그램 1번의 페이지들이 올라와 있다.

2) 메모리에 여유 공간이 없다.

3) 프로그램 2번의 페이지들이 올라와야 한다.

4) 프로그램 1번은 실행 중이지만, 현재는 필요가 없을  하다.

5) 프로그램 1번의 페이지들 이외의 페이지들은 고려하지 않는다.

 

이러한 상황일 , 프로그램 1번의 페이지들을 어떻게 해야 할까요? 프로그램 1번을 강제 종료해서 메모리를 확보해야 할까요? 그러면 프로그램 1번이 실행 중에 보관하고 있던 상태  등의 데이터들이  날아가겠죠? (예를 들면, 크롬에서 현재 열려 있는 페이지들이 닫히고 새로 크롬을 실행하는 격입니다.)

이러한 경우에 가상 메모리가 사용됩니다. 현재 메모리에 적재되어 있던 프로그램 1번의 페이지들을 가상 메모리에 잠시 옮겨 두어서 메모리를 확보하는 것이지요. 확보된 공간에 프로그램 2번의 페이지들이 들어가게 되는 것이구요.

 

이렇게 메모리가 부족할 , 가상 메모리를 마치 메모리  것처럼 사용하는 것입니다.

이렇게 메모리에서 가상 메모리로 페이지가 이동하는 것을 리눅스에서는 스와핑(SWAPing) 또는 "SWAP이 발생한다" 고 하고, Windows에서는 페이징(Paging)이라고 합니다.

 

 가상메모리는 디스크에 존재하기 때문에, SWAPing  일어나게 되면 디스크 읽기/쓰기가 발생하게 되고, 그러면 프로그램의 성능이 느려지겠죠?

이때문에 아무리 가상메모리가 있다고 하더라도 메모리 크기를 늘려야 컴퓨터의 성능이 높아질  있습니다.

하지만 데이터베이스와 같은 메모리 사용량이  프로그램의 경우에는 메모리가 부족할 수밖에 없기 때문에  크기의 SWAP 용량을 요구하기도 합니다.

 

그럼 개념적인 설명은 여기까지 하고, 리눅스에서 SWAP (가상 메모리) 확인하고 설정하는 방법을 알아보겠습니다.

테스트 환경은 CentOS 6.9 입니다.

 

 

(4) 리눅스 SWAP 확인 방법

먼저 현재 SWAP 사용량을 알아보겠습니다.

이는 메모리 사용량을 점검할  있는 free 명령어를 통해 확인할  있습니다.

[root@localhost ~]# free -m

                  total       used       free     shared    buffers     cached

Mem:          3816        400       3416          1         19        158

-/+ buffers/cache:        222       3594

Swap:         3951          0       3951

 

저의 경우, 3951 MB 사용하고 있군요.

 

 

위에서 가상메모리는 디스크에 존재한다고 말씀드렸습니다.

그럼 저의 SWAP 어떤 디스크에 존재하는지 확인해볼까요?

[root@localhost ~]# swapon -s

Filename                                Type            Size    Used    Priority

/dev/sda2                               partition       4046844 0       -1

 

 

 

[root@localhost ~]# df -h

Filesystem      Size  Used Avail Use% Mounted on

/dev/sda3        95G  2.8G   87G   4% /

tmpfs           1.9G   72K  1.9G   1% /dev/shm

/dev/sda1       283M   40M  228M  15% /boot

 

sda 라는 디스크에 sda2라는 파티션을 만들어서 사용 중이군요.  sda 디스크는 루트 디렉터리의 파티션과 함께 사용 중입니다.

이는 권장 사항이 아닌데요, SWAP 파티션은 별도의 디스크에 파일시스템으로 구성하는 것이 권장사항입니다.

 

그럼 어떻게 기존의 SWAP 파티션을 삭제하고, 새로운 SWAP 파티션을 생성할  있는지 알아볼까요?

 

(5) 리눅스 SWAP 파티션 제거/생성 방법

우선 SWAP 파티션을 제거해볼까요?

SWAP 파티션을 제거하기 위해 먼저 SWAP으로 설정되어 있는 것을 비활성화 시켜줍니다.

[root@nameserver ~]# swapoff /dev/sda2

[root@nameserver ~]# swapon -s

Filename                                Type            Size    Used    Priority

 

다시 swapon -s  확인해보니 SWAP 없어진 것을 확인할  있습니다.

 

부팅시 다시 붙들고 오는 것을 방지하기 위해 /etc/fstab에서도 제거해주세요~

(저는 그냥 주석처리하는 것으로 대체하겠습니다.)

[root@nameserver ~]# vi /etc/fstab

#

# /etc/fstab

# Created by anaconda on Fri Feb  1 15:07:14 2019

#

# Accessible filesystems, by reference, are maintained under '/dev/disk'

# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

#

UUID=2d0d743a-bd30-4b76-9dd6-4dc9195b4061 /                       ext4    defaults        1 1

UUID=c8bb7d32-60b1-413f-801f-addaf03ea042 /boot                   ext4    defaults        1 2

#UUID=88adb052-8dea-41f1-8b62-1b3e26630ab1 swap                    swap    defaults        0 0

tmpfs                   /dev/shm                tmpfs   defaults        0 0

devpts                  /dev/pts                devpts  gid=5,mode=620  0 0

sysfs                   /sys                    sysfs   defaults        0 0

proc                    /proc                   proc    defaults        0 0

 

, 이렇게하면 SWAP 파티션 제거가 완료되었습니다!

 

그런데 우리는 성능 향상을 위해서 SWAP 필요하죠~

그럼 다시 만들어볼까요!?

저는 root 파티션이 있는 디스크와 다른 디스크를 사용하기 위해 10GB짜리 디스크를 추가했습니다.

우선 현재 상태를 다시 확인해보고~

[root@nameserver ~]# swapon -s

Filename                                Type            Size    Used    Priority

 

lsblk 확인해보면, 10GB 짜리 디스크가 있습니다.

[root@nameserver ~]# lsblk

NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT

sr0     11:0    1 1024M  0 rom

sda      8:0    0  100G  0 disk

├─sda1   8:1    0  300M  0 part /boot

├─sda2   8:2    0  3.9G  0 part

└─sda3   8:3    0 95.9G  0 part /

sdb      8:16   0   10G  0 disk

 

 그럼  디스크에 파티션을 생성해줍니다.

[root@nameserver ~]# fdisk /dev/sdb

Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel

Building a new DOS disklabel with disk identifier 0x32b67859.

Changes will remain in memory only, until you decide to write them.

After that, of course, the previous content won't be recoverable.

 

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

 

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to

         switch off the mode (command 'c') and change display units to

         sectors (command 'u').

 

Command (m for help): n

Command action

   e   extended

   p   primary partition (1-4)

Partition number (1-4): 1

First cylinder (1-1305, default 1): <엔터>

Using default value 1

Last cylinder, +cylinders or +size{K,M,G} (1-1305, default 1305): <엔터>

Using default value 1305

 

Command (m for help): w

The partition table has been altered!

 

Calling ioctl() to re-read partition table.

Syncing disks.

 

그러고 다시 lsblk 확인해보면 sdb1 파티션이 생성되었습니다.

[root@nameserver ~]# lsblk

NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT

sr0     11:0    1 1024M  0 rom

sda      8:0    0  100G  0 disk

├─sda1   8:1    0  300M  0 part /boot

├─sda2   8:2    0  3.9G  0 part

└─sda3   8:3    0 95.9G  0 part /

sdb      8:16   0   10G  0 disk

└─sdb1   8:17   0   10G  0 part

 

 

 이제 그럼  파티션을 SWAP 파티션으로 만들어볼까요?

간단하게 mkswap 명령어로 만들어주면 됩니다.

[root@nameserver ~]# mkswap -c /dev/sdb1

Setting up swapspace version 1, size = 10482376 KiB

no label, UUID=11935e7f-a3b9-465f-a862-e48654f649e3

 

,  만들어줬으면 SWAP 파티션을 활성화시켜줍니다.

아까 비활성화  때에는 swapoff 썼으니,

활성화  때는 swapon 하면 되겠죠?

[root@nameserver ~]# swapon /dev/sdb1

swapon -s 확인하면 아래와 같이 /dev/sdb1  추가되었습니다!

[root@nameserver ~]# swapon -s

Filename                                Type            Size    Used    Priority

/dev/sdb1                               partition       10482376        0       -1

 

이제 재부팅 시에도 자동으로 마운트되도록 /etc/fstab 파일을 수정해줍니다.

[root@nameserver ~]# vi /etc/fstab

#

# /etc/fstab

# Created by anaconda on Fri Feb  1 15:07:14 2019

#

# Accessible filesystems, by reference, are maintained under '/dev/disk'

# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

#

UUID=2d0d743a-bd30-4b76-9dd6-4dc9195b4061 /                       ext4    defaults        1 1

UUID=c8bb7d32-60b1-413f-801f-addaf03ea042 /boot                   ext4    defaults        1 2

#UUID=88adb052-8dea-41f1-8b62-1b3e26630ab1 swap                    swap    defaults        0 0

tmpfs                   /dev/shm                tmpfs   defaults        0 0

devpts                  /dev/pts                devpts  gid=5,mode=620  0 0

sysfs                   /sys                    sysfs   defaults        0 0

proc                    /proc                   proc    defaults        0 0

/dev/sdb1               swap                    swap    defaults        0 0

 

 

 

 

 

출처 : https://continuetochallenge.tistory.com/75 
https://terms.naver.com/entry.nhn?docId=4383223&cid=59941&categoryId=59941

반응형

댓글