단일 프로세스 스왑 및 오버커밋 끄기

단일 프로세스 스왑 및 오버커밋 끄기

두 가지 질문:

  1. 특정 프로세스에 대한 스와핑을 끌 수 있는 방법이 있습니까? 즉, 특정 프로세스가 시스템의 사용 가능한 기본 메모리를 모두 사용하는 경우 해당 프로세스를 종료할 수 있습니까?

  2. Linux 시스템에서 메모리 오버커밋을 어떻게 비활성화합니까?

문맥:

저는 분산 애플리케이션을 실행하고 있는데 시스템에 기본 메모리가 부족해지면 프로세스가 종료되도록 하고 싶습니다. 이 프로세스는 하드 디스크 통신에 상당히 부담이 되므로 메모리 사용량을 확인하는 것이 합리적이라고 생각합니다.프로그래밍 방식으로, 좋다:

std::ifstream statm("/proc/self/statm");
size_t mem_virt, mem_rss, mem_shared;
statm >> mem_virt >> mem_rss >> mem_shared;
if (mem_virt == MAX_SYSTEM_PRIMARY_MEMORY) {
    // kills current process
}

그러나 특정 프로세스에 대한 스왑을 끌 수 있는 명령줄 세트가 있다면 확실히 더 좋을 것입니다.

그런데 아직 오버커밋을 해제하는 방법을 모르겠습니다. 어떤 아이디어가 있나요?

답변1

를 호출하여 애플리케이션에서 스왑을 허용하지 않을 수 있습니다 mlockall(MCL_CURRENT|MCL_FUTURE). 매뉴얼 페이지를 참조하세요.

오버커밋을 비활성화할 수 있습니다.

$ sysctl vm.overcommit_memory=2    # policy number 2
$ sysctl vm.overcommit_ratio=0     # ratio = 0%

스왑 없이 실행하는 것은 일반적으로 끔찍한 생각입니다. 이제 모든 익명 mmap은 사용되지 않더라도 강제로 RAM에 의해 지원됩니다. 실제로 아무것도 스왑되지 않더라도 Unix에서는 스왑이 필요합니다.

관련 정보