FAQ
Q1)
Setting vm.swappiness=0 on RHEL 6.4 - 6.7 can cause OOM conditions.
https://access.redhat.com/solutions/1149413
위 사례에 해당하는 현상이 발생하지 않기 위해서는 저희 측 서버(RHEL 6.7 - 2.6.32-573.el6.x86_64)의 경우에는 workaround로 vm.swappiness=0 이 아닌 vm.swappiness=1 설정을 하는 것이 맞을지요?
A1)
우선 RHEL6.4 이전까지는 vm.swappiness를 '0' 설정할 경우, minimal하게 swap out을 발생하였습니다.
그런데 RHEL6.4부터 vm.swapniess를 '0'으로 설정할 경우, OOM(Out of Memory)의 상태가 발생할 것을 제외하고는 swap out이 발생하지 않는 것이 기본입니다.
코드상으로 차이를 본다면.. 아래와 같습니다.
diff --git a/mm/vmscan.c b/mm/vmscan.c index 2161de6..8a6c9c7 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -1673,10 +1673,10 @@ static void get_scan_ratio(struct zone *zone, struct scan_control *sc, * proportional to the fraction of recently scanned pages on * each list that were recently referenced and in active use. */ - ap = (anon_prio + 1) * (reclaim_stat->recent_scanned[0] + 1); + ap = anon_prio * (reclaim_stat->recent_scanned[0] + 1); ap /= reclaim_stat->recent_rotated[0] + 1; - fp = (file_prio + 1) * (reclaim_stat->recent_scanned[1] + 1); + fp = file_prio * (reclaim_stat->recent_scanned[1] + 1); fp /= reclaim_stat->recent_rotated[1] + 1; /* Normalize to percentages */ @@ -1732,7 +1732,7 @@ static void shrink_zone(int priority, struct zone *zone, unsigned long scan; scan = zone_nr_lru_pages(zone, sc, l); - if (priority || noswap) { + if (priority || noswap || !sc->swappiness) { scan >>= priority; scan = (scan * percent[file]) / 100; }
문의사항에 넣어주신 KCS문서는 이렇게 swappiness가 '0'일때 swap out이 발생하지 않게 동작으로 변경한 후에, heavy I/O가 있을때에 OOM이 발생하는 현상이 있어서 이에 대한 workaround르 제시하고 있는 것입니다.
해당 이슈는 kernel 2.6.32-600.el6에서 patch가 되었습니다.
Q2)
추가 질문 드립니다.
질의 1)
RHEL 6.7 GA커널을 사용하는 XX 서버의 경우 Swap out 없이 OOM Killer 동작할 수 있으므로 커널 업데이트 하거나 커널 업데이트가 불가피하면 vm.swappiness = 1 로 설정해야한다는 것으로 이해하면 되는 것이죠?
질의 2)
kernel 2.6.32-600.el6 patch는 'vm.swappiness = 0' OOM 이슈를 버그 차원에서 패치한 것인가요?
질의 3)
kernel 2.6.32-600.el6 버전 이후의 커널을 사용하는 서버는 'vm.swappiness = 0' 설정 시 RHEL 6.4 커널 버전 이전의 동작과 같은 매커니즘으로 동작을 하나요?
A2)
답변 1)
네 6.7 GA 버젼에 패치가 되어 있지 않기 때문에 vm.swappiness = 1 설정이 필요 합니다.
답변 2)
네, 맞습니다.
답변 3)
RHEL6.4이후 vm.swappiness= 0 은 '0'으로 설정할 경우, OOM(Out of Memory)의 상태가 발생할 것을 제외하고는 swap out이 발생하지 않는 것으로 바뀐 내용이며,
RHEL 6.3 이전 까지는 vm.swappiness=0이라고 설정이 되어 있지만, 실제적으로는 vm.swappiness= 0+1 과 같은 설정이라고 판단됩니다.