http://pminkov.github.io/blog/what-happens-when-you-run-out-of-memory-in-linux.html

 

What happens when you run out of memory in Linux?

I've always been curious to figure out what happens when you run out of memory in Linux and recently I was experimenting with something that helped me figure it out. I was trying out dhbox deployment on an EC2 machine. dhbox allows you to start a virtual e

pminkov.github.io

 

https://medium.com/@EJSohn/%EB%B2%88%EC%97%AD-linux%EC%97%90%EC%84%9C-%EB%A9%94%EB%AA%A8%EB%A6%AC%EB%A5%BC-%EB%8B%A4-%EC%8D%A8%EB%B2%84%EB%A0%B8%EC%9D%84-%EB%95%8C-%EC%9D%BC%EC%96%B4%EB%82%98%EB%8A%94-%EC%9D%BC-9dadba29c89c

 

[번역] Linux에서 메모리를 다 써버렸을 때 일어나는 일

What happens when you run out of memory in Linux?의 원저자에게 허락을 맡고 번역한 글입니다

medium.com

 

 

위의 내용을 읽고 핵심만 요약 정리한다.

위의 내용에서는 메모리가 꽉 찼을 때 disk 를 대신 사용하는 swap 기능은 제외하였다.

 

 

1.

메모리 및 리눅스 전체 자원 상황을 볼 수 있는 명령어들은 다음과 같다.

메모리 : free -m 혹은 free -h

리눅스 전체 자원 : vmstat

 

2.

리눅스 커널에서 메모리가 놀고있다면, 커널이 이 노는 메모리(유휴 메모리)를 cache 용도로 사용한다.

(ls 등의 명령어로 나타나는 출력 결과를 cache 하거나 IO 데이터를 캐싱함)

 

3.

프로세스가 많아지면서 메모리를 사용하게 되어

메모리 사용률이 어느 정도 올라가게 되면,

2번에서 설명한, 커널에서 사용하던 cache 용도의 메모리를 프로세스가 사용할 수 있도록 양보한다.

즉, 커널이 cache 용도로 사용하는 공간이 줄어들게 된다.

 

4.

프로세스가 더 많아지면서 메모리를 왕창 사용하게 되어

메모리 사용률이 한계까지 올라가게 되면,

cache 용도로 사용되는 메모리 부분은 대부분 프로세스가 사용하게 된다.

 

5.

커널은 프로세스를 동작시키기 위한 지시문들을 disk 에서 메모리로 caching 해두고 사용하는데

caching 을 할 수 없게 되므로, 커널은 disk 에서 그때 그때 지시문들을 읽어온다.

즉, disk io 가 굉장히 많이 발생하게 되고 속도가 느려지게 된다.

 

6.

하나의 프로세스가 동작할 때 분명 지시문을 cache memory 에 저장할 수 있을 것이다.

하지만 context switching 이 일어난 이후 올라온 다음 프로세스에 의해

cache 에 저장된 지시문은 지워질 것(덮어쓰여짐)이다.

따라서 계속 disk io 가 발생한다.

 

7.

이런 상황에서는 ls 처럼 간단한 명령어도 굉장히 느리게 수행된다.

 

8.

이런 상황을 타파하기 위해선 메모리를 잡아먹는 프로세스들을이 끝나야한다.

알아서 끝날 때 까지 기다리거나, kill 로 강제로 끝내게 할 수 있다.

 

 

여담)

OOM killer 에 대한 이야기도 나오는데 이해를 못 함

 

 

 

 

참고

vmstat 보는 방법 : https://eyeballs.tistory.com/403

메모리의 buffer cache 설명 (영어) : https://tldp.org/LDP/sag/html/buffer-cache.html

 

기타

https://lascrea.tistory.com/66

 

 

 

+ Recent posts