일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 자바
- go
- Python
- Java
- codewars
- 프로그래머스
- 동적프로그래밍
- programmers
- redis
- 코드워
- 튜토리얼
- zookeeper
- dynamic programming
- OOM
- docker
- Go언어
- 스칼라
- gradle
- Linux
- 파이썬
- boj
- golang
- leetcode
- scala
- 주키퍼
- 문제풀이
- 리눅스
- 알고리즘
- DP
- HBase
- Today
- Total
파이문
[Linux] Memory Commit 이란? 본문
프로세스는 커널에게 필요한 만큼의 메모리를 요청하고 커널은 메모리 영역을 프로세스에게 주지만, 실제로는 할당은 하지 않고 해당 영역을 프로세스에게 주었다는 것을 저장해 둔다.
이 과정을 Memory commit 이라고 부른다.
Memory commit 이 필요한 이유
가장 큰 이유는 fork() 와 같은 프로세스를 생성하는 시스템 콜을 처리할 수 있어야 하기 때문이다.
예를 들면 물리 메모리가 4기가 일 때, 3기가 프로세스 A가 돌고 있다고 해 보자. 해당 프로세스가 자식 프로세스 B를 생성하게 (fork) 되면 자식 프로세스 B는 부모 프로세스 A와 마찬가지로 3기가 프로세스일 것이다.
하지만 이미 전체 메모리 4기가에서 3기가를 부모 프로세스 A 가 사용하고 있기 때문에 가용 메모리는 1기가 밖에 되지 않는다.
메모리가 부족하기 때문에 fork 는 실패할 것이라고 생각 되지만 (자식 프로세스 B 생성 실패) 실제로는 성공한다.
커널에 의해서 memory commit 이 되어 자식 프로세스 B 에게 3기가를 준 척(?) 할 수 있는 것이다.
만약 memory commit 이 없다면 자식 프로세스는 생성 되지 못할 것이다.
이때 남은 가용 메모리가 1기가 였기 때문에 자식 프로세스 B 는 2기가가 overcommit 이 되었다고 한다.
overcommit
이처럼 요구된 메모리가 가용 메모리 보다 커도 overcommit 이라는 개념 덕분에 프로세스는 정상 동작할 수 있게 된다.
만약 동작중인 프로세스가 실제로 가용 메모리 보다 더 큰 메모리를 사용하게 된다면 (위의 예시는 fork 를 위한 일시적인 메모리 요청) OOM Killer 가 동작하게 된다. (OOM Killer 참고)
OOM Killer 가 정말 중요한 (예를 들면 DB 라든가) 프로세스를 죽이면 안되기 때문에 overcommit 옵션을 조정하여 그 비율과 사용 여부를 설정할 수 있다.
이 때 두개의 파라미터를 사용한다. 바로 /proc/sys/vm/overcommit_memory 와 /proc/sys/vm/overcommit_ratio 이다.
/proc/sys/vm/overcommit_memory (v.overcommit_memory) 는 아래 3개의 옵션을 갖는다.
- 0: 커널에서 사용하는 기본 값이다.
- 1: 항상 commit 을 하겠다는 의미다. (overcommit 사용하지 않겠다는 의미) 그래서 남은 메모리가 얼마나 충분한지는 확인하지 않는다. 이 때문에 메모리 누수가 있는 프로세스가 있다면 문제가 생길 것이다. (OOM Killer 발생)
- 2: vm.overcommit_ratio 에 따라서 overcommit 이 일어난다.
각 값에 대한 자세한 설명은 아래 참고 링크들에 있는 문서에 더 자세히 적혀 있다.
참고
- jujupapa.tistory.com/37?category=1018474
- engineering.pivotal.io/post/virtual_memory_settings_in_linux_-_the_problem_with_overcommit/
'TIL > 리눅스 Linux' 카테고리의 다른 글
[Linux] oom_score 알아보기 (3) | 2021.02.25 |
---|---|
[Linux] 메모리 부족 시 어떤 일이 일어나는걸까? (0) | 2020.10.20 |
[Linux] 리눅스에서 쓰레드 최대 갯수 (1) | 2020.10.20 |