
설정을 통해 메모리 오버커밋을 비활성화했습니다 overcommit_memory=2
. 이제 시도하면 swapoff
다음 오류가 발생합니다.
swapoff: /dev/sda5: swapoff 실패: 메모리를 할당할 수 없습니다.
하지만 실제로는 0 MiB
스왑 공간과 여유 메모리가 많이 있습니다! 100으로 설정해 보았 overcommit_ratio
으나 아무런 변화가 없었습니다.
일시적으로 기본값으로 설정한 다음 남용을 다시 비활성화 하면 overcommit_memory=0
성공할 수 있습니다 .swapoff
왜 그렇게 이상한 행동을 하는 걸까요? 이것은 버그입니까?
편집하다댓글에서 질문한 대로:
$ grep -E '^Mem|Commit' /proc/meminfo
MemTotal: 2044420 kB
MemFree: 751836 kB
CommitLimit: 4122112 kB
Committed_AS: 2752544 kB
답변1
@Mat이 지적했듯이 Commited_AS > MemTotal입니다. 즉, 실제 가지고 있는 것보다 더 많은 메모리를 할당했기 때문에 스왑을 비활성화했다면 오버커밋하게 되었을 것입니다. 따라서 오버커밋을 허용하지 않으면 일부 메모리가 해제될 때까지 스왑을 비활성화할 수 없습니다.
할당된 모든 메모리가 실제로는 아닙니다.사용된, 그래서 많은 메모리를 할당했음에도 불구하고 여전히 사용 가능한 메모리가 남아 있습니다.
답변2
이것은 매우 흔한 혼란입니다. 몇몇 개념은 느슨하게만 연관되어 있습니다.
- 물리적 메모리 사용량
- 스왑 영역 사용량
- 가상 메모리 예약
- 가상 메모리 할당
프로세스가 메모리(malloc 또는 유사)를 할당할 때 실제로 수행하는 작업은 메모리를 예약하는 것입니다. 기본적으로 Linux는 가상 메모리를 오버커밋하므로 보존에 크게 신경 쓰지 않고 일반적으로 성공적으로 반환됩니다.
예약된 메모리에 처음 액세스할 때 메모리는 RAM이나 디스크에 있는 페이지에 의해 지원되어야 합니다.
RAM에서 액세스된 모든 가상 메모리를 수용할 만큼 RAM이 충분하지 않으면 시스템이 페이징(종종 스와핑이라고도 함)을 시작하고 성능이 중단됩니다.
프로세스가 스왑 및 RAM(일부)을 합친 것보다 더 많은 메모리를 예약하고 시스템이 메모리를 오버커밋하지 않도록 구성된 경우 할당이 실패합니다. 이는 여유 RAM이 충분하고 스왑 영역의 페이지를 사용하지 않는 경우에도 발생할 수 있습니다. 이는 앱을 무작위로 종료하지 않는 시스템을 갖추기 위해 지불하는 대가입니다.
귀하의 경우에는 사용 가능한 가상 메모리가 충분하지만 일부가 예약되어 있으므로 일부 스왑 영역이 존재해야 하며 이는 후자를 삭제할 수 없음을 의미합니다.