애플리케이션 메모리 사용량을 제한하는 방법은 무엇입니까?

애플리케이션 메모리 사용량을 제한하는 방법은 무엇입니까?

나는 이것에 대한 질문을 읽는 데 2시간을 보냈지만 여전히 오해가 있습니다.

이 프로세스가 있습니다.

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND    
root 1452 0.4 1.8 1397012 19308 ? Sl 04:23 3:48 ./transaction_server

이를 보면 시스템 상주 메모리를 19.3MB(스왑 파일은 가지고 있지 않음)를 사용하고 있음을 알 수 있는데, 이는 전체 1GB 시스템 메모리의 약 1.8%에 해당하는데, 가상 크기는 1.39GB? ! ? 나는 이것이 ulimit -m작동하지 않는다는 것을 읽었습니다. 사람들이 ulimit -v프로세스에 대한 가상 메모리 제한을 설정하는 데 사용됩니다. 이 가상 메모리가 VSZ에 나열되어 있습니까 ps? 이 프로세스를 최대 100MB의 시스템 메모리만 사용하도록 제한하려면 어떤 값을 설정해야 합니까? 문서를 읽었 setrlimit는데 이것이 합법적인 것 같습니다.

RLIMIT_AS
        This  is  the maximum size of a process' total available memory, 
        in bytes. If this limit is exceeded, the malloc() and mmap() 
        functions shall fail with errno set to [ENOMEM]. In addition, 
        the automatic stack growth fails with the effects outlined above.

그러나 다른 버전의 문서에서는 이 RLIMIT_AS매개변수가 가상 메모리 크기를 설정한다고 나와 있습니다. 진실은 무엇입니까?

답변1

예, VSZ는 가상 메모리입니다. RLIMIT_AS의 경우 위에 인용된 구절을 어디서 찾았나요? setrlimit(2)는 Linux 시스템 호출이므로 이것이 라이브러리 함수 malloc(3)을 모니터링하는 방법을 이해할 수 없습니다. 대신 brk(2), sbrk(2) 및 mmap(2)에서만 사용할 수 있습니다. 이는 해당 맨페이지(Scientific Linux 확인)에서 제안하는 내용이기도 합니다. 그러나 이러한 기능을 통해 요청된 총 메모리 양은가상 메모리이므로 RLIMIT_AS는 가상 메모리를 제한합니다. (이 역시 setrlimit(2) 맨페이지와 일치합니다.)

불행하게도 Linux에서는 RSS를 제한할 수 없습니다(그렇게 될 것입니다 ulimit -m). (RLIMIT_DATA)를 시도할 수 있지만 ulimit -d여기에는 Linux 4.7부터 mmap(2)만 포함되며 일반적으로 대규모 할당에 사용됩니다. 또 다른 가능성은 가상 메모리를 제한하는 것이지만 RSS와 VSZ의 차이가 너무 커서 이것이 어려울 수 있습니다.

답변2

많은 프로세스가 다른 프로세스와 일부 메모리를 공유합니다. 예를 들어 libc는 거의 모든 프로세스에서 사용되지만 메모리에 한 번만 매핑되지만 각 프로세스의 가상 메모리 사용량에 포함됩니다. cgroup을 사용하여 특정 프로세스(주로 RSS)에 의해서만 메모리 사용량을 제한할 수 있습니다. 답변 보기프로세스 및 해당 하위 프로세스의 총 리소스(메모리)를 제한하는 방법어떻게 해야 하나요? 이렇게 하면 프로세스와 해당 하위 항목의 전체 메모리가 제한됩니다.

관련 정보