overcommit_memory==2인 경우 스왑오프가 실패합니다.

overcommit_memory==2인 경우 스왑오프가 실패합니다.

설정을 통해 메모리 오버커밋을 비활성화했습니다 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이 충분하고 스왑 영역의 페이지를 사용하지 않는 경우에도 발생할 수 있습니다. 이는 앱을 무작위로 종료하지 않는 시스템을 갖추기 위해 지불하는 대가입니다.

귀하의 경우에는 사용 가능한 가상 메모리가 충분하지만 일부가 예약되어 있으므로 일부 스왑 영역이 존재해야 하며 이는 후자를 삭제할 수 없음을 의미합니다.

관련 정보