응용 프로그램 메모리 사용을 제한하는 방법은 무엇입니까?


10

이 문제에 대해 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주위 1.8%에서 시스템 상주 메모리 (스왑 파일이 없음)를 사용함 을 보여줍니다 1GB. 가상 크기는 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매개 변수가 가상 메모리 크기를 설정합니다. 진실은 무엇입니까?


게시물 형식에주의하십시오.
rozcietrzewiacz

답변:


6

예, VSZ는 가상 메모리입니다. RLIMIT_AS에 관해서는 위에서 인용 한 단락을 어디에서 찾았습니까? setrlimit (2)는 Linux 시스템 호출이므로 라이브러리 함수 malloc (3)을 어떻게 모니터링 할 수 있는지 알 수 없습니다. 대신 brk (2), sbrk (2) 및 mmap (2)로만 작동 할 수 있으며 맨 페이지 (Scientific Linux 확인)에서 제안하는 내용이기도합니다. 그러나,이 기능을 통해 요청 된 메모리의 총량 이다 RLIMIT_AS 실제로 가상 메모리를 제한하므로 가상 메모리. (이는 다시 setrlimit (2) 맨 페이지에 따릅니다.)

불행히도 Linux에서는 RSS를 제한 할 수 없습니다 (이것은 ulimit -m). ulimit -d(RLIMIT_DATA)를 시도 할 수 있지만 이는 일반적으로 큰 할당에 사용되는 mmap (2)를 무시합니다. 또 다른 가능성은 가상 메모리를 제한하는 것이지만 RSS와 VSZ의 차이가 크면 어려울 수 있습니다.


답변 주셔서 감사합니다. 이 단락은 setrlimit맨 페이지 에서 IEEE/The Open Group 2003 GETRLIMIT(3P)나옵니다 . 어떻게 psRSS를 보여줄 수 있습니까?하지만 커널이 RSS를 제한 할 수 없습니까?
Dragomir Ivanov

6
Alan Cox에 따르면, 이것은 역사적인 이유가 있습니다. RSS 계산은 비싸기 때문에 제한을 적용하면 커널에 큰 부하가 가해집니다. 출처 : linux.derkeiler.com/Mailing-Lists/Kernel/2006-01/msg03306.html . 또한 참조 stackoverflow.com/questions/3043709/...
안스 Esztermann에게

내가 참조. 나는 ulimit -d그때 함께 갈 것 같아요 . 이 응용 프로그램은 내가 작성했으며 사용하지 않았습니다 mmap().
Dragomir Ivanov

2
아니요, 일반적으로 sbrk ()는 아니지만 malloc ()은 그렇지 않습니다.
Ansgar Esztermann

내가 참조. 매우 유감입니다. 따라서이 질문에 대한 해결책은 cgroups 또는 일부 스크립트 언어로 메모리 사용 폴링입니다.
Dragomir Ivanov

3

많은 프로세스가 다른 프로세스와 일부 메모리를 공유합니다. 예를 들어 libc는 거의 모든 프로세스에서 사용되지만 한 번만 메모리에 매핑되지만 모든 프로세스의 가상 메모리 사용에 포함됩니다. cgroup을 사용하여 특정 프로세스 (대부분 RSS)에서만 사용되는 메모리 사용을 제한 할 수 있습니다. 프로세스의 총 자원 (메모리)을 제한하는 방법 및 프로세스 를 수행하는 방법에 대한 하위 응답을 참조하십시오 . 이는 프로세스와 해당 하위 프로세스의 총 메모리를 제한합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.