스왑 공간이 시스템 퍼포먼스에 미치는 영향

출처 : http://sdnkorea.com/blog/547

 

이 글은 가상 스왑 공간, 물리 (디스크) 스왑 공간 그리고 물리 메모리가 솔라리스9 혹은 10 을 운용하는 시스템의 퍼포먼스에
어떠한 영향을 주는지 설명 합니다. 이 글은 시스템의 물리적 메모리가 부족할 때 충분치 못한 물리 스왑 공간이 미치는 부정적인
영향에 대해 보여 드립니다.

이 글은 다음과 같은 주제를 다루고 있습니다:

스와핑이 일어나는 방법

솔라리스에서의 스와핑은 swapfs 가상 파일 시스템을 통해 수행 됩니다. 시스템이 제일 처음 세그먼트를 생성하고 세그먼트가 가상 스왑 공간을 예약합니다. 시스템이 처음 도달해서 페이지를 할당하면 페이지를 위해 가상 스왑 스페이스를 할당 합니다. 솔라리스에서 시스템은 미리 충분한 가상 스왑 공간을 예약 함으로써 스왑 공간 할당 지정이 필요할 때마다 수행되는 것이 아니라 요청시에 미리 수행이 되도록 합니다.

swapfs 파일 시스템에서 가상 스왑 스페이스의 사용 가능 공간은 가용한 페이지가능한 물리적 메모리(물리 메모리 빼기 사용된 메모리 빼기 예약된 메모리) 와 가용한 물리 (디스크) 스왑 공간의 합입니다.

다음의 데모에서 시스템은 16 GB 의 물리 메모리, 4 GB 의 물리 스왑 공간, 그리고 약 17.8 GB 의 가상 스왑 공간을 가지고 있습니다.

root@host # vmstat 3
kthr      memory            page               disk        faults
cpu
r b w   swap     free   re  mf  pi po fr de sr s1 s2 s3 -- in   sy
cs    us  sy  id
0 0 0 17767520 15791376 46 130 210  1  1  0 98 15 -0 -0  0 523 2662
1183  0   0   99
0 0 0 17876888 15717136  0   4   0  0  0  0  0  0  0  0  0 336  140
184   0   0  100
0 0 0 17876696 15716944  0   0   0  0  0  0  0  0  0  0  0 334  108
179   0   0  100

만약 시스템의 가용한 페이지 숫자가 커널 파라미터인 lotsfree 보다 작다면 시스템은 메모리 페이지 검색을 시작할 것입니다. lotsfree 의 기본 값은 물리 메모리의 1/64 입니다.

root@host # echo "lotsfree/E" | mdb -k | sed '/:$/d'
lotsfree:       32064

32064 * 8192 = 250 MB 이고 이것은 1/64 * 16 GB = 256 MB

스와핑 데모를 위한 스크립트

이 데모에서 우리는 파일들이 디스크 대신 메모리에 저장되는 /tmp 디렉토리에 대용량의 파일을 생성함으로써 메모리를 소비시킬 것입니다.

메모리를 소비하기 위해 이용할 스크립트는 다음과 같습니다:

root@host # more myfilltmp.sh
#!/bin/ksh
# Counter variables
x=0
count=145

# Create a 14.5G load in 100m chunks in /tmp
#
echo "\a\nPress $(tput smso)Enter$(tput rmso) to add 14.5G of
  space to tmp:\c"
read USERINPUT
until
    [ $x -ge $count ]
  do
    mkfile 100m /tmp/file.$x
    let x=x+1
  done
echo "Created 14.5G of Tempfiles in /tmp"

# Create a 2G load in 100m chunks in /tmp
#
x=0
count=20
echo "\a\nPress $(tput smso)Enter$(tput rmso) to add 2G of
  space to tmp:\c"
read USERINPUT
until
    [ $x -ge $count ]
  do
    mkfile 100m /tmp/file_swap.$x
    let x=x+1
  done
echo "Created 2G of Tempfiles in /tmp"

echo ""
echo "\a\nPress $(tput smso)Enter$(tput rmso) to clean tmp:\c
"
read USERINPUT
rm /tmp/file*.*

여러분은 count 변수를 여러분의 시스템에서 가용한 물리 메모리와 스왑 스페이스에 맞게 수정해야 합니다.

데모

다음의 단계에서 우리는 nm 커맨드 실행에 걸리는 시간을 비교할 것입니다.

단계 1

터미널 2번에서 메모리 소모를 시작합니다:

root@host # ./myfilltmp.sh

Press Enter to add 14.5G of space to tmp:
Created 14.5G of Tempfiles in /tmp

root@host # vmstat 3
kthr      memory            page               disk        faults
cpu
r b w   swap     free   re  mf  pi po fr de sr s1 s2 s3 -- in   sy
cs    us  sy  id
0 0 0 3018824   906752   0  0   0  0  0  0  0  0  0  0  0  348  111
182   0    0 100

root@host # time nm /dev/ksyms | wc -l
   35039

real    0m0.803s
user    0m0.732s
sys     0m0.166s

/tmp 를 14.5 GB 정도 채운 다음에 가용한 물리 메모리는 약 906 MB 입니다. 그리고 가용한 가상 스왑 공간은 3 GB 입니다. 커맨드 nm 은 수행에 약 0.803 초 정도가 걸렸습니다.

단계 2

이번 단계에서 우리는 /tmp 를 가용 메모리가 lotsfree 값에 가까운 250MB 까지 채워 볼 것입니다.

root@host # mkfile 100m /tmp/file.149
root@host # mkfile 100m /tmp/file.150

root@host # vmstat 3
kthr      memory            page               disk        faults
cpu
r b w   swap     free   re  mf  pi po fr de sr s1 s2 s3 -- in   sy
cs    us  sy  id
0 0 0 2609144   497016   0  0   0  0  0  0  0  0  0  0  0  350  116
205    0   0 100
0 0 0 2506736   394608   2 25   0  0  0  0  0  0  0  0  0  369 4426
192    0   1  99
0 0 0 2404056   291816   0  0   0  0  0  0  0  0  0  0  0  433   93
451    0   0 100

root@host # time nm /dev/ksyms | wc -l
   35039

real    0m0.799s
user    0m0.736s
sys     0m0.162s

가용한 물리 메모리 (291 MB) 는 lotsfree (250 MB) 이상이고, 가용한 가상 스왑 공간은 2.4 GB, 그리고 시스템은 nm 커맨드를 잘 수행했습니다.

단계 3
root@host # mkfile 100m /tmp/file.151

root@host # vmstat 3
kthr      memory            page               disk
faults cpu
r b w   swap     free  re  mf  pi   po    fr de    sr  s1 s2 s3 --
in    sy  cs us  sy id
0 0 0 2404112  291880   0   0  0     0     0  0     0   0  0  0  0
426   95 453  0  0 100
0 0 0 2303056  208992   2  25  0     0     8  0 23924   0  0  0  0
457 4419 561  0  2  98
0 0 0 2303816  199112   0   0  0 16360 16360  0 38852   1  0  0  0
598   98 563  0  1  99
0 0 0 2302088  328320  16 104  0 43894 43894  0   571 363  0  0  0
983  567 852  1  1  99
0 0 0 2303768  369504   0   0  0   340   340  0     0   3  0  0  0
445  103 474  0  0 100
0 0 0 2303768  369840   0   0  0     0     0  0     0   0  0  0  0
425  109 445  0  0 100

root@host # time nm /dev/ksyms | wc -l
   35039

real    0m0.775s
user    0m0.744s
sys     0m0.169s

가용 물리 메모리 (208 MB) 는 lotsfree (250 MB) 보다 아래이고 검색 속도 (sr) 는 23924 pages/second 입니다. (시스템은 100 pages/second 으로 검색을 시작합니다. 그리고 가용 메모리가 떨어질 수록 검색 속도가 선형으로 늘어 납니다.) 가용 스왑 공간은 2.3 GB 입니다. 시스템은 메모리가 부족함에도 불구하고 nm 커맨드를 잘 수행했습니다.

단계 4

이제 터미널 2번으로 가서 엔터를 눌러서 /tmp 를 채우도록 함으로써 가용 스왑 공간을 감소시키도록 합니다.

Press Enter to add 2G of space to tmp:

root@host # vmstat 3
kthr      memory          page                  disk
faults cpu
r b w   swap    free  re  mf pi    po    fr de  sr   s1 s2 s3 --
in      sy  cs  us sy  id
0 0 0 2235200 328544   6  65  0 11519 11519 0 9629    0  0  0  0
584   10395 597 0   2  98
0 0 0 1963000 144392   2  21  0 58588 58591 0 69377 473  0  0  0
1301  6884 1331 0   3  97
0 0 0 1894720 245784   0  12  3 59460 59462 0 12282 478  0  0  0
 934    98  572 0   1  99
0 0 0 1894720 423280   0   0  0 60200 60200 0     0 475  0  0  0
 830   111  275 0   1  99
0 0 0 1894720 603168   0   0  0 59449 59449 0     0 469  0  0  0
 813   106  198 0   0 100
0 0 0 1894720 781776   0   0  0 59562 59562 0     0 473  0  0  0
 810    89  183 0   0 100
0 0 0 1894720 958856   0   0  0 57842 57842 0     0 456  0  0  0
 810    92  175 0   0 100
0 0 0 1894720 1134160  0   0  0 58941 58941 0     0 475  0  0  0
 836   111  173 0 0 100
0 0 0 1894720 1310576  0   0  0 58068 58068 0     0 462  0  0  0
 823    89  177 0 0 100
0 0 0 1894720 1486000  1   3  3 59108 59108 0     0 474  0  0  0
 843   109  188 0 0 100
0 0 0 1894616 1661640  0   6  5 48646 48646 0     0 464  0  0  0
 745  3664  169 0 1  99
0 0 0 1587368 1483880 10 103  0     0     0 0     0   0  0  0  0
 374 19104  186 0 3  97
0 0 0 1280288 1144736  5  52 11     0     0 0     0   1  0  0  0
 378  3210  206 0 1  99
0 0 0 1280360 1126824  0   0  0     0     0 0     0   0  0  0  0
 357   111  174 0 0 100
0 0 0 256208 318656    0   0  0     0     0 0     0   0  0  0  0
 419   107  433 0 0 100

root@host # time nm /dev/ksyms | wc -l
   35039

real    0m0.837s
user    0m0.736s
sys     0m0.168s

가용한 가상 스왑 공간은 256 MB, 가용한 물리 메모리는 318 MB 이고 시스템은 잘 동작합니다.

단계 5
root@host # mkfile 100m /tmp/file_swap.20

root@host # vmstat 3
kthr      memory          page                disk          faults
cpu
r b w   swap     free  re mf pi   po   fr de sr s1 s2 s3 -- in   sy
cs   us  sy  id
0 0 0 153880   259240   0  0  0 3731 3731 0   0 29 0 0   0  454   92
468   0   0 100
0 0 0 153880 260472     0  0  0  298  298 0   0  3 0 0   0  442  141
485   0   0 100

root@host # time nm /dev/ksyms | wc -l
   35039

real    0m0.763s
user    0m0.736s
sys     0m0.166s

가용한 가상 스왑 공간은 153 MB, 가용한 물리 메모리는 260 MB 이고 시스템은 잘 동작합니다.

단계 6
root@host # mkfile 100m /tmp/file_swap.21

root@host # vmstat 3
kthr      memory        page                  disk           faults
cpu
r b w   swap  free  re  mf pi    po    fr de  sr  s1 s2 s3 --  in  sy
cs  us sy  id
0 0 0 153808 270832  2  25  0 17927 17927 0 4080  50 0  0  0  587  134
591 0   1  99
0 0 0  85464 284696  0   0  0 13998 13998 0 3082 110 0  0  0  555 4378
503 0   1  99
0 0 0  51448 275352  0   0  0 25417 25417 0 7140 200 0  0  0  614  120
509 0   1  99

root@host # time nm /dev/ksyms | wc -l
   35039

real    0m48.465s
user    0m0.738s
sys     0m0.176s

가용 가상 스왑 공간은 51 MB, 가용 물리 메모리는 275 MB 이고 시스템이 아주 느리게 동작합니다.

단계 7

일분 후에 시스템은 가용 메모리를 627 MB 이상으로 예약합니다.

root@host # vmstat 3
kthr      memory        page              disk          faults
cpu
r b w   swap   free re mf pi po  fr de  sr s1 s2 s3 --  in   sy
cs  us sy  id
0 0 0  51568 627064  0  0  0  0   0  0  0   0  0  0  0  419  89
455 0   0  100
0 0 0  51568 627064  0  0  0  0   0  0  0   0  0  0  0  432 117
540 0   0  100

root@host # time nm /dev/ksyms | wc -l
   35039

real    0m47.474s
user    0m0.744s
sys     0m0.171s

가용 스왑 공간이 51 MB (가용 메모리는 627 MB) 이 되자 시스템은 아주 느리게 동작했고 더이상 검색을 하지 않았습니다.

root@host # vmstat 3
kthr      memory       page            disk           faults
cpu
r b w   swap  free re mf pi po fr de  sr s1 s2 s3 --   in   sy
cs  us sy  id
0 0 0  50968 626680 3 29  0  0  0  0  0  0  0  0   0  406  241
518  0  0  99
0 0 0  49424 625632 1 10  0  0  0  0  0  0  0   0  0  410   96
459  0  0 100
결론

데모에서 보았듯이 시스템에 물리적 메모리가 부족하면 퍼포먼스는 영향을 받습니다. 왜냐하면 메모리 페이지 검색 때문입니다. 그러나 시스템의 가상 스왑 공간이 부족하면 물리 메모리 부족에 비해 훨씬 더 심각하게 퍼포먼스에 영향을 줍니다. 보통 물리 스왑 공간은 물리 메모리의 0.5 에서 1.5 배 정도의 사이즈가 되어야 합니다.
이 글의 영문 원본은
Impact of Swap Space on System Performance for the Solaris 9 and 10 OS
에서 보실 수 있습니다.

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중