728x90
메모리 스와핑
대부분 운영체제에서는 효율적인 메모리 관리를 위해 스와핑이라는 기술을 사용하며, 이를 통해 사용되지 않는 애플리케이션의 물리 메모리를 디스크로 스왑 한다.

- 스와핑이 일어나면 가상 메모리의 일부 내용을 디스크로 쓰기 위해 디스크의 일정 영역을 스왑 영역으로 만든다.
- 이때 일어나는 동기화 작업에 의해 순식간에 시스템 성능이 떨어지고 장애가 발생할 수도 있다.
- 시스템 리소스가 넉넉하면 스와핑이 일어나지 않도록 설정하는 것이 안전하다.(지속적인 스왑 인/아웃 과정을 통해 성능이 급격히 나빠질 수도 있다.)
- 운영체제 관점에서는 스와핑은 많은 리소스를 사용하므로 모니터링을 철저히 해야 한다.
free: 스왑 상태 체크
free
cat /proc/swaps: 스왑 영역이 디스크상 생성된 위치 확인
cat proc/swaps
sar: 스왑 인/아웃이 일어나고 있는 메모리 상태 확인
sar -r -s 21:00:00 //스왑핑 메모리 상태 보기
sar -B 2 5 //스왑 통계 보기
엘라스틱서치에서 스와핑을 비활성화해야 하는 이유
- 엘라스틱서치가 동작하는데 필요한 메모리도 스와핑으로 인해 언제든지 디스크로 스와핑 될 수 있으며, 스와핑이 발생할 경우 노드 안정성에 치명적이기 때문에 이를 최대한 피해야 한다.
- 스와핑 작업으로 GC가 수분동안 지속되거나, 노드 응답이 느려질 수 있다.
- 클러스터 연결이 불안정해서 연결됨과 끊어짐이 반복될 수 있다.
- 클러스터를 구성하는 노드에는 가능한 엘라스틱서치만 단독 운영하는 것이 좋다.
- 엘라스틱서치가 물리 메모리를 독점할 수 있기 때문에 스와핑이 필요 없다.
- 스와핑 작업이 일어나지 않도록 시스템에서 비활성화할 수도 있다.
스와핑을 피하는 법
1) 스와핑 비활성화
sudo swapoff -a
//vi /etc/fstab //영구 비활성화
- 엘라스틱서치 노드 전용으로 사용하면 스와핑을 비활성화하는 것이 좋다.
2) 스와핑 최소화
sudo sysctl vm.swappiness=1 //swappiness = 1 설정
//cat /proc/sys/vm/swappiness //vm.swappiness 정보 확인
- 스와핑 주기를 조절해서 발생 빈도를 최소화하는 것도 가능하다.
- vm.swappiness 값을 1로 설정 시, 스와핑을 최대한 이용하지 않는다는 의미며, 일반적인 상황에서 스와핑을 일어나지 않게 할 수 있다.
3) memory_lock 설정
vi /elasticsearch.yml
bootstrap.memory_lock: true
- 사용자 권한만 가지고 있다면, vm.swappiness를 수정할 수 없기 때문에 엘라스틱서치의 bootstrap.momory_lock 속성을 이용하면 된다.
- 활성화 시, mlockall() 함수와 동일한 방식으로 애플리케이션 차원에서 스와핑을 최대한 방지할 수 있다.
- momory_lock 방식은 애플리케이션 레벨에서만 제한적인 기술로 운영체제 차원에서 메모리 부족으로 판단될 경우 이 설정이 무시되고 스와핑이 일어날 수 있다.
mlockall() 함수
커널 수준에서 제공하는 저수준 함수 중 하나로, 호출한 프로세스의 페이징을 금지시키고 모든 메모리가 RAM에 상주하는 것을 보장한다. 애플리케이션을 개발할 때 사용하는 memory_lock 기술인데, 이를 활용하면 애플리케이션이 최초 실행될 때 할당받은 메모리를 스와핑 하지 못하도록 강제로 메모리를 잡을 수 있다.
GET _nodes?filter_path=**.mlockall
{
"nodes": {
"e6YYBK_6Su2qugjROIfPZw": {
"process": {
"mlockall": true
}
}
}
}
- 엘라스틱서치를 실행해서 해당 명령어로 확인할 수 있다.
- false가 나오면 memory_lock에 실패한 것으로 로그를 확인해 원인을 확인해야 한다.
- memory_lock 설정에 실패하는 대부분 케이스는 운영체제의 리소스 제한 설정이 주원인이고 ulimit 명령어로 unlimited로 변경하면 된다.
기본적으로 swapoff 명령어로 운영체제에서 스왑핑이 발생하지 않도록 하고,엘라스틱서치 환경설정을 이용해 bootstrap.memory_lock 속성을 활성화하는 것을 추천한다.
728x90
'Elastic Search' 카테고리의 다른 글
| Ch11. 장애 방지를 위한 실시간 모니터링 - 클러스터 Health 체크 (0) | 2025.10.15 |
|---|---|
| Ch10. 대용량 처리를 위한 시스템 최적화 - 시스템 튜닝 포인트 (0) | 2025.10.10 |
| Ch10. 대용량 처리를 위한 시스템 최적화 - 엘라스틱서치와 가상 메모리 (0) | 2025.10.10 |
| Ch10. 대용량 처리를 위한 시스템 최적화 - 힙 크기를 32GB 이하로 유지해야 하는 이유 (0) | 2025.10.10 |
| Ch10. 대용량 처리를 위한 시스템 최적화 - 노드 실행 환경과 JVM 옵션 (0) | 2025.10.10 |