왜 Linux 시스템에서 Free Memory 가 있는데도 Swap 을 사용하게 되는 것인가 ?
- Linux가 메모리가 많음에도 불구하고 스왑공간을 사용하는 이유는 스왑 사용여부를 결정하는 값의 계산식에서 비롯된다.
- 아래의 계산 식에 따라 Linux 는 Swapping 을 결정하게 된다.
swap_tendency = mapped_ratio / 2 + distress + swappiness;
- 여기서 mapped_ratio 는 현재 Physical 메모리 대비 구동중인 Process 메모리들의 공간 비율이다. 즉 전체 메모리 16G 에서 Process 가 12G 사용하면 mapped_ratio 는 75 로 산정된다.
- distress 는 메모리 확보가 얼마나 어려운 상태인지를 체크 하는 값이다. 내부 알고리즘이며, 대략 메모리 회수 한번 했는데 실패할 경우 다음번에는 더많은 페이지를 회수하기 위해
메모리 페이지를 회수하게 되는데( 계속 늘어나니까) 이때 우선 순위를 높여가며 , 메모리 회수를 위해 적극 동작하게 되는 것이다.
이 때 아래와 같이 distress 값도 변동 되며, 일반적으로 priority 는 12가 가장 일반적이며, 시스템에서 메모리를 잘 회수하지 못하고 문제가 있을 수록 priority 가 0 으로 낮아진다.distress = 100 / (2 ^ priority)priority12~76543210distress0136122550100 - 그리고 마지막으로 우리가 조절할 수 있는 swappiness 는 커널 파라미터로 지정되며 default 로 60이 잡혀있다.
- 예를 들어 일반적인 경우에 distress는 0이고 swappiness는 60이며, 4GB 메모리를 가진 시스템에서 3GB 만 사용한다고 가정해서 위 식에 대입하면 아래와 같다.
swap_tendency = (3GB / 4GB * 100) / 2 + 0 + 60 = 97.5
중요한 것은 이 swap_tendency 가 100 을 넘지 않으면 Swap 은 발생하지 않으나 100 을 넘으면 Swap 을 쓸 수 있게 된다는 뜻이다.
즉 Process 의 메모리 사용량의 총합과 distress 는 조절 할 수 없지만 swappiness 값을 조정하므로서 Swap 이 발생하지 않도록 사용자가 제어 할 수 있다는 것이다. - 현재 각 서버에서 Swappiness 의 설정 값을 보려면 아래의 명령어를 사용하면 된다.
$> sysctl -a | grep vm.swappiness
진짜 Free 메모리가 있는데 Swap 이 사용 되나 ???
- 진짜 Free 메모리가 있는데 Swap 이 사용되는지 넷마블 내부의 모 운영서버를 한번 확인해 봤다.
- 위에서 보면 mysql 서버가 47.4% 의 메모리를 점유하고 있는데 Swap 사용량이 706M 인것 을 확인 할 수 있다.
- 이는 Mysql 의 데이터 버퍼캐쉬 중 일부가 이미 Swap 을 쓰고 있다는 사실에 놀라울 뿐이다.
- 진짜 Free 메모리가 있는데 Swap 이 사용되는지 넷마블 내부의 모 운영서버를 한번 확인해 봤다.
3. 어떻게 해야 하나?
- Swappiness 값을 조절해서 Swap 발생을 최소화 할 수 있다.
vm.swappiness = 0
(커널 버전 3.5 이상) 스와핑 끄기 vm.swappiness = 1
(커널 버전 3.5 이상) 스와핑 최소화 vm.swappiness = 10
메모리가 충분할 때 성능향상을 위해 권장되는 경우가 있음 vm.swappiness = 60
기본값 vm.swappiness = 100
적극적으로 스왑 사용 - 위 표는 1번에서 설명한 계산 식에 따라서 보면 될 것 같다.
- Distress 값이 시스템 상태에 따라 변동 되며 ( 메모리 회수에 몇번 실패할 경우) swap_tendency 값이 변동 되어 결국 100 을 넘어 가면
swap 을 쓸 수 있으므로 적절한 swappiness 조절 값이 필요하다. - 내부에서 Cache 로 사용되는 서버들 ( 예를 들면, redis 나 couchbase) 는 swappiness 를 0 또는 1로 사용하는 것이 개인적으로 권한다.
위 값에 대한 근거는 redis 와 couchbase 에서 제공되는 문서를 기반으로 하며 관련 Link 는 다음과 값다.종류Linkredis LAB https://redislabs.com/blog/5-tips-for-running-redis-over-aws#.Vvu-h-IS-Uk couchbase
manualhttp://docs.couchbase.com/admin/admin/Concepts/swap-space.html - Mysql 서버는 10 으로 설정하고 모니터링을 충분히 하는 것을 권한다.
(일반적으로 메인서버이므로... ) 다만 Oracle vendor 사와 MariaDB 에서는 0 을 권고하고 있다.
4. 어떻게 바꾸나?
- 아래의 명령어는 Dynamic 변수로 서버에 바로 적용된다.
sysctl -w vm.swappiness=0
- 영구적 적용 하려면 /etc/sysctl.conf 에 등록
vi /etc/sysctl.conf
vm.swappiness = 0
5. 그래서 결론은?
- CacheServer 들은 swappiness 를 0 또는 1로 설정하고 사용하자. Vendor 들 권고 값은 0 이다.
- Mysql 은 1 또는 10으로 설정하고 운영하고 충분한 내부 검증이 되면 0으로 설정하자. Mysql 역시 Vendor 권고값은 0 이다.
- 여기서 중요한 것은 Swappiness 를 설정한다고 해서 Swap 을 못사용한다는게 아니다!!! Free Memory 가 있는데도 Swaping 을 할꺼냐를 판단하는 것이다. 오해하지 말자 !
댓글 없음:
댓글 쓰기