Friday, April 13, 2018

CentOS 6.6 리눅스 관리] 12. SWAP 메모리 관리


안녕하세요. 썬구루입니다. 이 게시물에서는 스왑(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