할 수 있습니다.
Linux에서 발생할 수있는 두 가지 메모리 부족 조건이 있습니다. 발생하는 값은 sysctl vm.overcommit_memory
( /proc/sys/vm/overcommit_memory
) 의 값에 따라 다릅니다.
소개 :
커널은 '메모리 오버 커밋'을 수행 할 수 있습니다. 커널이 실제로 시스템에있는 것보다 많은 메모리를 프로그램에 할당 할 때입니다. 이것은 프로그램이 실제로 할당 한 모든 메모리를 사용하지 않기를 희망하며 이루어집니다.
overcommit_memory = 2
경우 overcommit_memory
로 설정 2
, 커널은 전혀 오버 커밋을 수행하지 않습니다. 대신 프로그램에 메모리가 할당되면 해당 메모리를 갖는 액세스가 보장됩니다. 시스템에 할당 요청을 충족시키기에 충분한 여유 메모리가 없으면 커널은 요청에 대한 실패 만 반환합니다. 상황을 정상적으로 처리하는 것은 프로그램에 달려 있습니다. 실제로 실패했을 때 할당이 성공했는지 확인하지 않으면 응용 프로그램에 종종 segfault가 발생합니다.
segfault의 경우 다음과 같은 출력에서 다음과 같은 행을 찾아야합니다 dmesg
.
[1962.987529] myapp[3303]: segfault at 0 ip 00400559 sp 5bc7b1b0 error 6 in myapp[400000+1000]
이는 at 0
응용 프로그램이 초기화되지 않은 포인터에 액세스하려고 시도했음을 의미하며, 이는 메모리 할당 호출이 실패한 결과 일 수 있지만 유일한 방법은 아닙니다.
overcommit_memory = 0과 1
또는 overcommit_memory
로 설정 하면 초과 커밋이 활성화되고 프로그램에서 실제로 사용 가능한 것보다 많은 메모리를 할당 할 수 있습니다.0
1
그러나 프로그램이 할당 된 메모리를 사용하려고 할 때 커널은 실제로 메모리를 만족시키기에 메모리가 충분하지 않다는 것을 알게되면 약간의 메모리를 다시 가져와야합니다. 먼저 캐시 플러시와 같은 다양한 메모리 정리 작업을 수행하려고 시도하지만 이것으로 충분하지 않으면 프로세스가 종료됩니다. 이 종료는 OOM-Killer에서 수행합니다. OOM-Killer는 시스템에서 어떤 프로그램이 어떤 메모리를 사용하고 있는지, 얼마나 오래 실행했는지, 누가 실행하고 있는지, 어떤 요소가 죽었는지 확인하기 위해 여러 가지 요소를 확인합니다.
프로세스가 종료되면 사용중인 메모리가 해제되고 메모리 부족 상태를 방금 발생시킨 프로그램에 필요한 메모리가 생깁니다.
그러나이 모드에서도 프로그램은 여전히 할당 요청을 거부 할 수 있습니다. 때 overcommit_memory
이다 0
, 커널은 할당 요청을 거부 시작해야하는 경우에 추측을 시도합니다. 로 설정되면 1
요청을 거부해야 할 시점을 결정하기 위해 어떤 결정을 사용하는지 잘 모르겠지만 매우 큰 요청을 거부 할 수 있습니다.
의 출력을보고 dmesg
다음과 같은 메시지를 찾아 OOM-Killer가 관련되어 있는지 확인할 수 있습니다 .
[11686.043641] Out of memory: Kill process 2603 (flasherav) score 761 or sacrifice child
[11686.043647] Killed process 2603 (flasherav) total-vm:1498536kB, anon-rss:721784kB, file-rss:4228kB