swappiness 파라미터의 값이 0이면, 필요한 경우에만 스왑을 쓴다는 것이고, 100이면, 메모리 LRU 방식으로 preemtively 하게 조절을 한다.
그러나 메모리 상태를 보면 cached 때문에 free 메모리로 모잘러서 영향을 다른 어플이 받을 수 있다. drop_cache 파라미터를 수정하는 것도 좋을 듯하다.
<vm.swappiness, vm_drop_caches, vm_pagecache>
http://blog.naver.com/PostView.nhn?blogId=websarang_&logNo=100118236876
<swap tendency>
swap_tendency = mapped_ratio/2 + distress + vm_swappiness;
- The "distress" value is a measure of how much trouble the kernel is having freeing memory. The first time the kernel decides it needs to start reclaiming pages, distress will be zero; if more attempts are required, that value goes up, approaching a high value of 100.
- mapped_ratio is an approximate percentage of how much of the system's total memory is mapped (i.e. is part of a process's address space) within a given memory zone.
- vm_swappiness is the swappiness parameter, which is set to 60 by default.
|
http://lwn.net/Articles/83588/
<Swap 이론적 배경>
swap이 발생하는 시점은 OS단에서 메모리로 읽어 들이는 부분에서 page fault가 나야 한다. 그 원인은 3가지다. IO가 많은 것도 영향을 줄 수 있다.
| a-) User page
| b-) Read or write access
| c-) Page not present
page fault 에러가 나면, do_page_fault() –> wakeup_kswapd() 함수를 호출하고, 인터럽트를 발생하고, 데몬을 깨운다.
관련 링크
http://dojeun.egloos.com/317480
http://blog.naver.com/PostView.nhn?blogId=teastful&logNo=140120981123
http://www.tldp.org/HOWTO/KernelAnalysis-HOWTO-7.html
<swap이 발생되는 경우>
리눅스 커널은 임계값(threadhold)보다 여유 메모리가 부족하면 메모리에서 사용하되지 않는 페이지를 찾아스 디스크로 스왑해서 여유공간을 확보하려고 한다. 해당 프로세스의 스왑뿐 아니라 다른 프로세스까지 체크해서 안쓰는 페이지를 스왑으로 바꾼다. (LRU 방식)
이러다 보니 다른 프로세스가 cpu를 선점하여 스왑된 페이지를 읽고 쓰고(swap out/in) 하면서 하는 작업이 있을 수 있다.
참조 : 한빛미디어 리눅스 커널 프로그래밍
<내 생각>
jvm이 swap 영역에 빠졌다면, 메모리 증설이 필요하다. 이 때 주의할 사항은 jvm이 IO 작업이 많은 것인지 확인할 필요가 있다. (또는 그 서버에 실행중인 다른 jvm의 영향인지 살펴봐야 한다. ) 너무 느려져서 영향을 줄 수 있다면, 메모리를 가장 먼저 증설(내가 생각하는 가장 좋은 방법)하고, 리눅스의 drop_cache, swappiness 커널 파라미터를 수정해서 서버의 성능을 최대한 높여보는 것도 좋을 듯.