Overcommit_memory =0의 경험적 방법은 무엇을 의미합니까?

Overcommit_memory =0의 경험적 방법은 무엇을 의미합니까?

나는 man proc 문서를 읽었습니다. overcommit_memory=0의 경험적 방법은 overcommit_memory와 관련하여 잘 이해되지 않습니다. 휴리스틱은 실제로 무엇을 의미합니까?

"MAP_NORESERVE를 확인하지 않고 mmap(2)을 호출"한다는 것은 커널이 가상 메모리만 할당하고 스왑 공간이 존재한다는 사실조차 모른다는 의미입니까?

이 파일에는 커널 가상 메모리 계산 모델이 포함되어 있습니다. 값은 다음과 같습니다.

                     0: 경험적 오버커밋(기본값)
                     1: 항상 과도하게 사용하고 확인하지 마십시오.
                     2: 자주 확인하고 과도하게 투자하지 마세요.

              모드 0에서는 MAP_NORESERVE를 사용하는 mmap(2) 호출이 검사되지 않으며 기본 검사가 매우 약하여 위험이 따릅니다.
              프로세스를 "OOM-killed"로 만듭니다.

이전 질문에 덧붙여, 가상 주소 공간이 소진되면 남은 물리적 메모리가 충분한지 여부에 관계없이 OOM이 발생할 수 있는지 여부에 대해 질문드립니다.

감사해요.

답변1

overcommit_memory메모리 관리 하위 시스템에는 이 설정을 고려하는 세 가지 위치가 있습니다.

  1. 주요한 것은__vm_enough_memoryin mm/util.c은 메모리 할당을 진행하기에 충분한 메모리가 있는지 여부를 결정합니다(반드시 호출되지 않는 유틸리티 함수라는 점에 유의하세요). 1 이면 overcommit_memory함수가 항상 성공합니다. 2이면 실제 사용 가능한 메모리를 확인합니다. 0이면 다음과 같이 언급한 유명한 경험적 방법을 사용합니다.

    • 사용 가능한 페이지 수 계산
    • 파일 지원 페이지 수 추가(복원 가능)
    • 공유 메모리에 사용되는 페이지 삭제
    • 교환 페이지 추가
    • 재활용 가능한 페이지 추가
    • 페이지를 예약할 계정
    • 루트용으로 일부 메모리 예약( cap_sys_admin프로세스에서 할당이 수행되지 않은 경우)

    결과 합계는 메모리 할당을 위한 임계값으로 사용됩니다.

  2. mmap또한 설정을 확인합니다. MAP_NORESERVE오버커밋이 허용되는지(모드 0 및 1) 할당에 백업 스왑이 없는지( VM_NORESERVE) 확인합니다. 이 특별한 경우에 모드 0은 실제로 모드 1과 동일합니다. 이는 " mmap(2)확인 없이 호출 MAP_NORESERVE"을 의미합니다. 이는 MAP_NORESERVE mmap호출이 항상 성공하고 초과 할당으로 인해 OOM 킬러가 개입하게 됨을 의미합니다. 사실, 또는 쓰기를 시도하는 동안 세그먼트 충돌이 발생합니다.

  3. shmem와 유사한 동작을 갖습니다 mmap.

주소 공간이 부족하면 할당이 실제로 진행될 수 없으므로 OOM 종료가 아닌 할당 실패가 발생합니다.

관련 정보