안녕하세요. 썬구루입니다. 이 게시물에서는 스왑(SWAP)에 대해 알아보도록 하겠습니다. 프로그램은 처리가 되기 위해 반드시 물리 메모리에 올라와야 합니다. 충분한 메모리가 있다면 상관없지만 리눅스 서버 시스템이 많은 프로세스를 돌리고 있어서 메모리가 부족하다면 어떻게 될까요?
프로세스는 우선순위라는 것을 가집니다. 우선순위에 따라 메모리, CPU 기타 하드웨어 자원에 대한 우선권을 가지는 것이죠. 만약 메모리를 100% 사용하고 있는데 우선순위가 높은 프로세스가 올라온다면 우선순위가 낮은 프로세스는 자신의 자원을 내놓아야 합니다. 물리 메모리에서 우선권이 높은 프로세스한테 엉덩이 까여서 나가떨어지는 것이죠. 만약 이 프로세스가 1시간 동안 어떠한 결과 처리를 위해 돌고 있었다면 그리고 자신의 메모리를 반환했다면 어떻게 되는 것일까요? 다시 1시간 동안 이 프로세스를 돌려야 할까요? 이때를 위해 디스크의 일정 공간(파티션 또는 볼륨)이나 파일이 임시 저장 공간으로 사용되는 것입니다. 마치 물리 메모리처럼 사용되는 것이죠. 디스크 일정 공간이나 파일을 마치 물리적인 메모리처럼 사용하는 이것을 우리는 SWAP 메모리라 합니다.
만약 4GB 메모리를 가지고 있는 서버다 그러면 8GB 정도의 SWAP 공간을 잡습니다. 하지만 32GB 메모리를 가지고 있는 서버라고 한다면 64GB SWAP 공간을 잡지 않습니다. 32GB나 48GB 정도의 SWAP 공간을 잡습니다.
이 게시물에서 우리는 SWAP 관리하는 명령에 대해 알아볼 것입니다.
■ SWAP 디바이스 확인
swapon -s 명령을 사용하거나 /proc/swaps 파일 내용을 확인하면 SWAP 디바이스를 확인할 수 있다.
[root@sunguru backup]# swapon -s
Filename Type Size Used Priority /dev/sda2 partition 4194300 0 -1 [root@sunguru backup]# [root@sunguru backup]# more /proc/swaps Filename Type Size Used Priority /dev/sda2 partition 4194300 0 -1 [root@sunguru backup]# |
■ SWAP 메모리 사용량 확인
free 명령 또는 top 명령을 사용하면 SWAP 메모리 용량 및 사용량을 알 수 있다. 하지만 SWAP 메모리가 사용되지 않고 있는 것을 확인할 수 있다.
[root@sunguru backup]# free
total used free shared buffers cached Mem: 1915452 837588 1077864 4068 85948 384828 -/+ buffers/cache: 366812 1548640 Swap: 4194300 0 4194300 [root@sunguru backup]# [root@sunguru backup]# top top - 17:49:36 up 22:30, 2 users, load average: 0.00, 0.00, 0.00 Tasks: 155 total, 1 running, 154 sleeping, 0 stopped, 0 zombie Cpu(s): 1.0%us, 1.2%sy, 0.0%ni, 97.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1915452k total, 838040k used, 1077412k free, 85980k buffers Swap: 4194300k total, 0k used, 4194300k free, 384916k cached |
SWAP 메모리를 사용하도록 만들기 위해서는 프로세스를 많이 만들어 메모리로 올리면 된다. 이를 위해 아래 명령을 실행한다. 아래 명령은 실제 서버에 적용하지 않도록 한다. 왜냐하면 서버가 멈출 수도 있다.
[root@sunguru backup]# while true
> do > sleep 300 & > done [root@sunguru backup]# |
그리고 다른 터미널 창에서 top 명령을 실행하면 아래와 같이 SWAP 메모리가 사용되는 것을 확인할 수 있다.
top - 17:53:18 up 22:33, 3 users, load average: 5.63, 2.33, 0.87
Tasks: 16134 total, 5 running, 16129 sleeping, 0 stopped, 0 zombie Cpu(s): 1.4%us, 97.4%sy, 0.0%ni, 0.0%id, 0.1%wa, 0.2%hi, 0.9%si, 0.0%st Mem: 1915452k total, 1848644k used, 66808k free, 736k buffers Swap: 4194300k total, 1296572k used, 2897728k free, 9384k cached |
■ SWAP 디바이스 또는 파일 설정
아래와 같이 /dev/sdd 디스크를 분할하여 /dev/sdd1 파티션을 생성한다. (LVM을 사용하여 볼륨을 생성하여도 된다.)
[root@sunguru ~]# fdisk /dev/sdd
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0xc022ac12. 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) p 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): +5G Command (m for help): p Disk /dev/sdd: 10.7 GB, 10737418240 bytes 255 heads, 63 sectors/track, 1305 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0xc022ac12 Device Boot Start End Blocks Id System /dev/sdd1 1 654 5253223+ 83 Linux Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. [root@sunguru ~]# lsblk /dev/sdd NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdd 8:48 0 10G 0 disk └─sdd1 8:49 0 5G 0 part [root@sunguru ~]# |
아래와 같이 dd 명령을 사용하여 SWAP 디바이스로 사용할 1GB 용량의 파일을 생성한다.
[root@sunguru ~]# dd if=/dev/zero of=/swapfile01 bs=1M count=1024
1024+0 records in 1024+0 records out 1073741824 bytes (1.1 GB) copied, 5.33247 s, 201 MB/s [root@sunguru ~]# [root@sunguru ~]# ls -l /swapfile01 -rw-r--r--. 1 root root 1073741824 2016-07-11 18:07 /swapfile01 [root@sunguru ~]# |
■ SWAP 메모리 추가
아래와 같이 mkswap 명령을 사용하여 파티션, 볼륨 또는 파일을 SWAP 디바이스로 지정한다.
[root@sunguru ~]# mkswap /dev/sdd1
Setting up swapspace version 1, size = 5253216 KiB no label, UUID=e133ad71-a4a3-442c-ad02-68f261e08ea4 [root@sunguru ~]# [root@sunguru ~]# mkswap /swapfile01 Setting up swapspace version 1, size = 1048572 KiB no label, UUID=abf4b853-6f35-460f-8eb8-4f2d5da89b61 [root@sunguru ~]# |
아래와 같이 swapon 명령을 실행하여 SWAP POOL에 SWAP 디바이스를 추가하여 SWAP 메모리 용량을 늘린다.
[root@sunguru ~]# swapon -s
Filename Type Size Used Priority /dev/sda2 partition 4194300 0 -1 [root@sunguru ~]# [root@sunguru ~]# free total used free shared buffers cached Mem: 1915452 1677072 238380 3184 22708 1314224 -/+ buffers/cache: 340140 1575312 Swap: 4194300 0 4194300 [root@sunguru ~]# [root@sunguru ~]# swapon /dev/sdd1 [root@sunguru ~]# [root@sunguru ~]# swapon -s Filename Type Size Used Priority /dev/sda2 partition 4194300 0 -1 /dev/sdd1 partition 5253216 0 -2 [root@sunguru ~]# [root@sunguru ~]# free total used free shared buffers cached Mem: 1915452 1680776 234676 3184 22736 1314240 -/+ buffers/cache: 343800 1571652 Swap: 9447516 0 9447516 [root@sunguru ~]# [root@sunguru ~]# swapon /swapfile01 [root@sunguru ~]# [root@sunguru ~]# swapon -s Filename Type Size Used Priority /dev/sda2 partition 4194300 0 -1 /dev/sdd1 partition 5253216 0 -2 /swapfile01 file 1048572 0 -3 [root@sunguru ~]# [root@sunguru ~]# free total used free shared buffers cached Mem: 1915452 1682528 232924 3184 22760 1314244 -/+ buffers/cache: 345524 1569928 Swap: 10496088 0 10496088 [root@sunguru ~]# |
/etc/fstab 파일에 내용을 추가한 후 리부팅을 후에도 추가한 SWAP 디바이스가 올라오는지 확인한다.
[root@sunguru ~]# vi /etc/fstab
/dev/sdd1 swap swap defaults 0 0 <= 내용 추가 /swapfile01 swap swap defaults 0 0 <= 내용 추가 [root@sunguru ~]# [root@sunguru ~]# reboot [root@sunguru ~]# [root@sunguru ~]# swapon -s Filename Type Size Used Priority /dev/sda2 partition 4194300 0 -1 /dev/sdd1 partition 5253216 0 -2 /swapfile01 file 1048572 0 -3 [root@sunguru ~]# free total used free shared buffers cached Mem: 1915452 529992 1385460 2336 21776 193936 -/+ buffers/cache: 314280 1601172 Swap: 10496088 0 10496088 [root@sunguru ~]# |
swapoff는 SWAP 풀에 있는 SWAP 디바이스를 제거하기 위해 사용하는 명령이다. 관련된 SWAP 디바이스가 사용되고 있지 않아야 제거를 할 수 있다.
[root@sunguru ~]# swapon -s
Filename Type Size Used Priority /dev/sda2 partition 4194300 0 -1 /dev/sdd1 partition 5253216 0 -2 /swapfile01 file 1048572 0 -3 [root@sunguru ~]# [root@sunguru ~]# swapoff /swapfile01 [root@sunguru ~]# [root@sunguru ~]# swapon -s Filename Type Size Used Priority /dev/sda2 partition 4194300 0 -1 /dev/sdd1 partition 5253216 0 -2 [root@sunguru ~]# |
여기까지 SWAP 관리하는 명령에 대해 알아보았습니다. SWAP은 물리적인 메모리가 아닙니다. 프로세스 정보를 임시적으로 저장하기 위해 사용되는 공간입니다. SWAP 메모리가 사용되고 SWAP I/O가 많이 발생한다면 물리적인 메모리가 부족하다는 뜻입니다. 그리고 서버의 정보처리 속도도 떨어지게 됩니다. 왜냐하면 SWAP I/O도 처리를 해야 되기 때문이죠. 빈번하게 SWAP 메모리를 사용한다면 물리적인 메모리를 늘려 줘야 서버의 정보처리가 원활하게 이루어집니다.
만약 물리적 메모리를 늘릴 수 없다고 하는 고객분들이 있으시다면 'SWAP 메모리는 물리적 메모리가 아닌 프로세스 정보 임시 저장 공간이다. 만약 SWAP I/O가 빈번하게 일어난다면 그 I/O를 처리하기 위해 CPU 자원이 사용될 것이고 I/O WAIT 등의 지연으로 인해 서버 성능은 현저하게 떨어질 것이다. 만약 물리적 메모리를 늘릴 수 없다면 서버 성능 저하는 감수해야 할 것이고 서비스 저하로 인한 문제가 반드시 일어날 것이다.' 라도 말씀해주시면 됩니다.
No comments:
Post a Comment