파이문

[Linux] 메모리 부족 시 어떤 일이 일어나는걸까? 본문

TIL/리눅스 Linux

[Linux] 메모리 부족 시 어떤 일이 일어나는걸까?

민Z 2020. 10. 20. 20:31
728x90

메모리 부족

swap

물리 메모리가 부족하게 되면 가상 메모리 방식을 응용한 'swap' 이 일어난다. 스왑은 저장 장치의 일부를 일시적으로 메모리 대신 사용하는 방식이다.

 

당연한 것이겠지만 메모리 보다 저장 장치에 접근하는 속도가 현저히 느리다.

 

그래서 시스템이 일시적인게 아니라 만성적으로 메모리가 부족하게 되면 스와핑 / 스왑 인 (스왑 영역을 물리 메모리 영역 으로 되돌리는 것) 과 스왑 아웃 (물리 메모리 영역을 스왑 영역으로) 이 반복되는 스래싱 (thrashing) 상태가 일어난다.

 

리눅스에서는 스와핑을 페이징이라고 부르기도 한다.

스와핑이 일어나지 않게 하기 (스왑으로 인해 일어나는 성능 하락을 막게 하기 위해) 위해서 아예 스와핑 옵션을 끌 수도 있다.

 

이 때 사용하는 값이 vm.swappiness 이다. 이 값은 스와핑 공간을 얼마나 사용할지에 대한 %를 나타낸다. 1과 같은 매우 낮은 값을 할당하여 스와핑이 일어나지 않게 막을 수 있다.

 

왜 0 으로 설정하지 않을까? 0은 어떤 상황에서도 절대 swap 을 하지 말라는 의미이다.  (아예 스왑 기능을 사용하지 않겠다는 의미) 그래서 1 정도로 하는 것을 추천한다고 한다.

하지만 HBase 에서는 swappiness 를 0 으로 세팅하라고 권고 하고 있다. Watch out for swapping. Set swappiness to 0.
스왑이 일어나서 생기는 이슈를 아예 방지하려고 하는 것 같다.

OOM Killer

그래도 메모리가 부족하다면 (swap 할 영역도 없다면) 시스템은 Out Of Memory 상태가 된다.

 

이러한 경우 커널(OS)은 적절한 프로세스를 찾아 강제 종료 kill 을 한다. 이를 OOM Killer 라고 한다.

죽일 (...) 프로세스를 찾는 방법

메모리 관리 시스템은 죽이기 가장 좋은 프로세스를 선택한다. 여기서 좋다 라는 의미는 죽였을 때 가장 큰 메모리를 확보할 수 있고 시스템에 큰 영향이 가지 않을 수 있다는 것에 대한 의미이다.

 

이를 위해 리눅스는 oom_score 라는 값을 각 프로세스마다 갖고 있다. 이런식으로 확인 가능하다.

$ cat /proc/<pid>/oom_score

이 값이 크면 클 수록 죽을 확률이 높다.

 

만약 아주 중요한 프로세스를 메모리 관리 시스템이 kill 하게 된다면, 서비스는 큰 문제가 발생할 것이다. 그래서 리눅스 커널 파라미터 (vm.panic_on_oom) 의 기본값을 변경해 프로세스가 아니라 시스템을 종료하게 만들 수도 있다.

참고

다시 읽어보자!

'TIL > 리눅스 Linux' 카테고리의 다른 글

[Linux] oom_score 알아보기  (3) 2021.02.25
[Linux] Memory Commit 이란?  (0) 2021.02.19
[Linux] 리눅스에서 쓰레드 최대 갯수  (1) 2020.10.20
Comments