- 메모리는 기억장치이며 실제 정보를 기억하는 역할을 한다.
- 보통 메모리는 주기억장치 중 하나인 RAM을 의미하는데 모든 전기신호를 담고 있기 때문에 빠른 연산이 가능한 휘발성 메모리이다.
- swap란 물리 메모리(RAM)의 용량 부족시 하드 디스크의 일부 공간을 메모리처럼 사용하는 것이다.
- 하드 디스크 메모리를 이용하여 일부를 하드디스크에 저장하고 RAM에 메모리 블럭 자리가 생기게 되면 다시 RAM으로 이동시키는 식으로 데이터의 저장 위치를 교환해가며 16GB의 램으로 17GB의 메모리가 필요한 연산을 진행 할 수 있다.
- 이때 사용하는 메모리 공간을 swap 메모리 공간이며, 원래 가지고 있는 메모리보다 더 많은 메모리를 사용할 수 있게 해주는 유용한 방법이다.
- 이 동작은 swap in, swap out으로 구분할 수 있다.
swap out
- 만약 메모리에 최대 100개의 프로세스가 실행될 수 있는데, 101번째 프로세스가 추가로 실행해야 할 경우 swap out은 100개의 실행된 프로세스 중 101번째 프로세스를 잠시 swap partition으로 이동시켜 놓는 것을 의미한다.
swap in
- swap in은 swap으로 이동한 프로세스에서 이벤트가 올 경우, 다시 메모리 영역으로 이동시키는 것을 의미한다.
- kubernetes의 컴포넌트 kubelet은 이러한 상황을 처리하도록 설계되지 않았기 때문에, 안정화된 kubernetes에서는 지원하지 않는다.(v1.22 alpha version, v1.27 beta version swap 지원)
- kubernetes에서 pod를 생성할 때, 필요한 만큼의 리소스를 할당 받아 사용하는 구조인데, kubernetes에서는 메모리 swap을 고려하지 않고 설계되었기 때문에, kubernete cluster node들의 swap 메모리를 비활성화 해주어야 한다.
- swap 기능은 본래 가용된 메모리보다 더 큰 메모리 할당을 가능하도록 하기 위함이여, kubernetes는 주어진 노드의 자원을 100%에 가깝게 사용하는 것이 목적이기에 swap 메모리 사용은 노드 자원이 일관되지 않아 kubernetes에서도 swap off를 권장하고 있다.
- 컨테이너의 속도는 변동적인데 swap 메모리를 어떤 컨테이너가 쓰며, 느려지고 있는지 예측할 수 없다.
- swap을 지원하게 개발하려면 고려해야할 사항이 많다.
- 개발 우선순위가 낮다.
- kubernets가 swap을 관리하므로, filesystem에 적용된 swap을 off 해야한다.
- swap off를 하지않은 상태에서 reboot을 하게 되면
running with swap on is not supported문구가 출력된다.- kubelet을 동작시키기 위해서 swap 메모리를 비활성화 하여야한다.
$ sudo swapoff -a $ sudo sed -i '/ swap / s/^/#/' /etc/fstab
- v1.22 이전 쿠버네티스는 리눅스 시스템에서 스왑 메모리를 지원하지 않았다.
- swap 메모리를 사용하였을 때, pod 메모리 활용을 보장하고 설명하는 데 내재된 어려움 때문이었다.
- 결과적으로, 스왑 지원은 쿠버네티스의 초기 설계에서 범위를 벗어난 것으로 간주되었고, kubelet의 기본 동작은 노드에서 스왑 메모리가 감지되면 시작에 실패하는 것이었다.
- v1.22부터, 리눅스용 스왑 기능은 처음으로 알파 단계로 도입되었다.
- 리눅스 사용자에게 처음으로 스왑 메모리 지원을 노드 단위로 활성화할 수 있다.
- 하지만 알파 버전으로 완전히 개발되지 않았고 cgroup v2에 대한 부적절한 지원, 불충분한 메트릭 및 요약 API 통계, 부적절한 테스트 등을 포함한 몇 가지 문제가 있다.
- New in Kubernetes v1.22: alpha support for using swap memory
https://kubernetes.io/blog/2021/08/09/run-nodes-with-swap-alpha/
- 최근 3일전(23년 8월 24일 목요일)부터 v1.28에서는 swap을 사용하기 위한 베타 버전을 지원하며, 알파와 비교할 때, 스왑이 활성화된 실행에 대한 kubelet의 지원은 더 안정적이고 견고하며, 더 사용자 친화적이며, 많은 알려진 단점을 해결한다고 한다.
- kubernetes v1.28부터 swap 적용이 가능하며, 방법에 대한 설명이 나와있으니 참고바란다.
https://kubernetes.io/blog/2023/08/24/swap-linux-beta/
- 모든 버그를 고치기 위해 alpha와 beta로 나누어 출시 후 정식 버전 진행
alpha: 추가되는 기능들을 disable한 형태로 배포
beta: 추가 기능들을 enable한 형태로 배포
release: 안정화된 버전을 배포