이 글은 가상 스왑 공간, 물리 (디스크) 스왑 공간 그리고 물리 메모리가 솔라리스9 혹은 10 을 운용하는 시스템의 퍼포먼스에 어떠한 영향을 주는지 설명 합니다.

이 글은 시스템의 물리적 메모리가 부족할 때 충분치 못한 물리 스왑 공간이 미치는 부정적인 영향에 대해 보여 드립니다.

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

스와핑이 일어나는 방법 스와핑 데모를 위한 스크립트 데모 결론

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

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

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

root@host # vmstat 3kthr memory page disk faultscpur b w swap free re mf pi po fr de sr s1 s2 s3 -- in sycs us sy id0 0 0 17767520 15791376 46 130 210 1 1 0 98 15 -0 -0 0 523 26621183 0 0 990 0 0 17876888 15717136 0 4 0 0 0 0 0 0 0 0 0 336 140184 0 0 1000 0 0 17876696 15716944 0 0 0 0 0 0 0 0 0 0 0 334 108179 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 variablesx=0count=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 USERINPUTuntil [ $x -ge $count ] do mkfile 100m /tmp/file.$x let x=x+1 doneecho "Created 14.5G of Tempfiles in /tmp"# Create a 2G load in 100m chunks in /tmp#x=0count=20echo "\a\nPress $(tput smso)Enter$(tput rmso) to add 2G of space to tmp:\c"read USERINPUTuntil [ $x -ge $count ] do mkfile 100m /tmp/file_swap.$x let x=x+1 doneecho "Created 2G of Tempfiles in /tmp"echo ""echo "\a\nPress $(tput smso)Enter$(tput rmso) to clean tmp:\c"read USERINPUTrm /tmp/file*.* 여러분은 count 변수를 여러분의 시스템에서 가용한 물리 메모리와 스왑 스페이스에 맞게 수정해야 합니다.

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

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

root@host # ./myfilltmp.shPress Enter to add 14.5G of space to tmp:Created 14.5G of Tempfiles in /tmproot@host # vmstat 3kthr memory page disk faultscpur b w swap free re mf pi po fr de sr s1 s2 s3 -- in sycs us sy id0 0 0 3018824 906752 0 0 0 0 0 0 0 0 0 0 0 348 111182 0 0 100root@host # time nm /dev/ksyms | wc -l 35039real 0m0.803suser 0m0.732ssys 0m0.166s /tmp 를 14.5 GB 정도 채운 다음에 가용한 물리 메모리는 약 906 MB 입니다. 그리고 가용한 가상 스왑 공간은 3 GB 입니다. 커맨드 nm 은 수행에 약 0.803 초 정도가 걸렸습니다.

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

root@host # mkfile 100m /tmp/file.149root@host # mkfile 100m /tmp/file.150root@host # vmstat 3kthr memory page disk faultscpur b w swap free re mf pi po fr de sr s1 s2 s3 -- in sycs us sy id0 0 0 2609144 497016 0 0 0 0 0 0 0 0 0 0 0 350 116205 0 0 1000 0 0 2506736 394608 2 25 0 0 0 0 0 0 0 0 0 369 4426192 0 1 990 0 0 2404056 291816 0 0 0 0 0 0 0 0 0 0 0 433 93451 0 0 100root@host # time nm /dev/ksyms | wc -l 35039real 0m0.799suser 0m0.736ssys 0m0.162s 가용한 물리 메모리 (291 MB) 는 lotsfree (250 MB) 이상이고, 가용한 가상 스왑 공간은 2.4 GB, 그리고 시스템은 nm 커맨드를 잘 수행했습니다.

단계 3 root@host # mkfile 100m /tmp/file.151root@host # vmstat 3kthr memory page diskfaults cpur b w swap free re mf pi po fr de sr s1 s2 s3 --in sy cs us sy id0 0 0 2404112 291880 0 0 0 0 0 0 0 0 0 0 0426 95 453 0 0 1000 0 0 2303056 208992 2 25 0 0 8 0 23924 0 0 0 0457 4419 561 0 2 980 0 0 2303816 199112 0 0 0 16360 16360 0 38852 1 0 0 0598 98 563 0 1 990 0 0 2302088 328320 16 104 0 43894 43894 0 571 363 0 0 0983 567 852 1 1 990 0 0 2303768 369504 0 0 0 340 340 0 0 3 0 0 0445 103 474 0 0 1000 0 0 2303768 369840 0 0 0 0 0 0 0 0 0 0 0425 109 445 0 0 100root@host # time nm /dev/ksyms | wc -l 35039real 0m0.775suser 0m0.744ssys 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 3kthr memory page diskfaults cpur b w swap free re mf pi po fr de sr s1 s2 s3 --in sy cs us sy id0 0 0 2235200 328544 6 65 0 11519 11519 0 9629 0 0 0 0584 10395 597 0 2 980 0 0 1963000 144392 2 21 0 58588 58591 0 69377 473 0 0 01301 6884 1331 0 3 970 0 0 1894720 245784 0 12 3 59460 59462 0 12282 478 0 0 0 934 98 572 0 1 990 0 0 1894720 423280 0 0 0 60200 60200 0 0 475 0 0 0 830 111 275 0 1 990 0 0 1894720 603168 0 0 0 59449 59449 0 0 469 0 0 0 813 106 198 0 0 1000 0 0 1894720 781776 0 0 0 59562 59562 0 0 473 0 0 0 810 89 183 0 0 1000 0 0 1894720 958856 0 0 0 57842 57842 0 0 456 0 0 0 810 92 175 0 0 1000 0 0 1894720 1134160 0 0 0 58941 58941 0 0 475 0 0 0 836 111 173 0 0 1000 0 0 1894720 1310576 0 0 0 58068 58068 0 0 462 0 0 0 823 89 177 0 0 1000 0 0 1894720 1486000 1 3 3 59108 59108 0 0 474 0 0 0 843 109 188 0 0 1000 0 0 1894616 1661640 0 6 5 48646 48646 0 0 464 0 0 0 745 3664 169 0 1 990 0 0 1587368 1483880 10 103 0 0 0 0 0 0 0 0 0 374 19104 186 0 3 970 0 0 1280288 1144736 5 52 11 0 0 0 0 1 0 0 0 378 3210 206 0 1 990 0 0 1280360 1126824 0 0 0 0 0 0 0 0 0 0 0 357 111 174 0 0 1000 0 0 256208 318656 0 0 0 0 0 0 0 0 0 0 0 419 107 433 0 0 100root@host # time nm /dev/ksyms | wc -l 35039real 0m0.837suser 0m0.736ssys 0m0.168s 가용한 가상 스왑 공간은 256 MB, 가용한 물리 메모리는 318 MB 이고 시스템은 잘 동작합니다.

단계 5 root@host # mkfile 100m /tmp/file_swap.20root@host # vmstat 3kthr memory page disk faultscpur b w swap free re mf pi po fr de sr s1 s2 s3 -- in sycs us sy id0 0 0 153880 259240 0 0 0 3731 3731 0 0 29 0 0 0 454 92468 0 0 1000 0 0 153880 260472 0 0 0 298 298 0 0 3 0 0 0 442 141485 0 0 100root@host # time nm /dev/ksyms | wc -l 35039real 0m0.763suser 0m0.736ssys 0m0.166s 가용한 가상 스왑 공간은 153 MB, 가용한 물리 메모리는 260 MB 이고 시스템은 잘 동작합니다.

단계 6 root@host # mkfile 100m /tmp/file_swap.21root@host # vmstat 3kthr memory page disk faultscpur b w swap free re mf pi po fr de sr s1 s2 s3 -- in sycs us sy id0 0 0 153808 270832 2 25 0 17927 17927 0 4080 50 0 0 0 587 134591 0 1 990 0 0 85464 284696 0 0 0 13998 13998 0 3082 110 0 0 0 555 4378503 0 1 990 0 0 51448 275352 0 0 0 25417 25417 0 7140 200 0 0 0 614 120509 0 1 99root@host # time nm /dev/ksyms | wc -l 35039real 0m48.465suser 0m0.738ssys 0m0.176s 가용 가상 스왑 공간은 51 MB, 가용 물리 메모리는 275 MB 이고 시스템이 아주 느리게 동작합니다.

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

root@host # vmstat 3kthr memory page disk faultscpur b w swap free re mf pi po fr de sr s1 s2 s3 -- in sycs us sy id0 0 0 51568 627064 0 0 0 0 0 0 0 0 0 0 0 419 89455 0 0 1000 0 0 51568 627064 0 0 0 0 0 0 0 0 0 0 0 432 117540 0 0 100root@host # time nm /dev/ksyms | wc -l 35039real 0m47.474suser 0m0.744ssys 0m0.171s 가용 스왑 공간이 51 MB (가용 메모리는 627 MB) 이 되자 시스템은 아주 느리게 동작했고 더이상 검색을 하지 않았습니다.

root@host # vmstat 3kthr memory page disk faultscpur b w swap free re mf pi po fr de sr s1 s2 s3 -- in sycs us sy id0 0 0 50968 626680 3 29 0 0 0 0 0 0 0 0 0 406 241518 0 0 990 0 0 49424 625632 1 10 0 0 0 0 0 0 0 0 0 410 96459 0 0 100

결론 데모에서 보았듯이 시스템에 물리적 메모리가 부족하면 퍼포먼스는 영향을 받습니다. 왜냐하면 메모리 페이지 검색 때문입니다. 그러나 시스템의 가상 스왑 공간이 부족하면 물리 메모리 부족에 비해 훨씬 더 심각하게 퍼포먼스에 영향을 줍니다. 보통 물리 스왑 공간은 물리 메모리의 0.5 에서 1.5 배 정도의 사이즈가 되어야 합니다.

이 글의 영문 원본은 Impact of Swap Space on System Performance for the Solaris 9 and 10 OS 에서 보실 수 있습니다.