(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
'[OS] > Linux' 카테고리의 다른 글
[참고] 리눅스 CPU 사용률 확인하는 3가지 방법!! (69) | 2024.01.05 |
---|---|
[참고] 리눅스 date 명령어를 이용한 시간 확인 및 설정하기 (hwclock 포함) !! (74) | 2024.01.05 |
[참고][Linux][CentOS7] ipv6 비활성화!! (84) | 2023.12.27 |
[중요][참고][Linux] /dev/null, 2>&1 의미!! (91) | 2023.12.26 |
[참고] Red Hat Linux, Fedora, CentOS와 Rocky Linux의 관계!! (54) | 2023.12.05 |
[참고][Linux] sed 명령어 파일 편집 방법 (특수문자 / 처리 방법) (51) | 2023.11.28 |
[리눅스/유닉스] du 명령어, 디렉터리별 디스크 사용량 확인하기. 퍼센테이지 비율로 확인하기 , ls명령어와 크기가 다른 이유? (0) | 2023.07.17 |
[Linux] 권한 관리 명령어 사용 방법(chmod, chown, chgrp) (0) | 2022.09.14 |
댓글