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

이 문제에 대해 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매개 변수가 가상 메모리 크기를 설정합니다. 진실은 무엇입니까?



답변

예, 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의 차이가 크면 어려울 수 있습니다.


답변

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