단일 프로세스의 리소스 제한에 대한 많은 질문과 답변이 있습니다. 예를 들어 RLIMIT_AS를 사용하여 프로세스에 의해 할당된 최대 메모리를 제한할 수 있습니다 top
. 이 주제에 대한 자세한 내용은 여기를 참조하세요.Unix에서 특정 프로세스가 사용할 수 있는 메모리 양을 제한하는 방법이 있습니까?
setrlimit(2)
문서에는 다음과 같이 나와 있습니다.
fork(2)를 통해 생성된 하위 프로세스는 상위 프로세스의 리소스 제한을 상속합니다. execve(2) 전체에 걸쳐 리소스 제한을 예약합니다.
다음과 같이 이해해야 합니다.
프로세스의 RLIMIT_AS가 2GB인 경우 2GB 이상의 메모리를 할당할 수 없습니다. 하위 프로세스가 생성되면 2GB 주소 공간 제한이 하위 프로세스에 전달되지만 0부터 계산되기 시작합니다. 이 2개의 프로세스는 총 4GB의 메모리를 차지할 수 있습니다.
그러나 전체 프로세스 트리에 할당된 총 메모리 양을 제한하는 유용한 방법은 무엇입니까?
답변1
이것이 귀하의 질문에 대한 답변인지 확실하지 않지만 다음을 찾았습니다.펄 스크립트귀하의 요구 사항을 정확하게 충족한다고 주장하십시오. 이 스크립트는 프로세스와 해당 자식의 리소스 사용량을 깨우고 확인하여 제한을 적용하는 자체 시스템을 구현합니다. 잘 문서화되고 설명된 것으로 보이며 최근에 업데이트되었습니다.
slm이 그의 의견에서 말했듯이 cgroup은 이 목적으로도 사용될 수 있습니다. Linux를 사용한다고 가정하고 cgroup 관리용 유틸리티를 설치해야 할 수도 있습니다 libcgroups
.
sudo cgcreate -t $USER:$USER -a $USER:$USER -g memory:myGroup
$USER
귀하의 사용자인지 확인하세요 .
그러면 사용자는 cgroup의 메모리 설정에 액세스할 수 있습니다 /sys/fs/cgroup/memory/myGroup
.
그런 다음 다음을 수행하여 제한을 500MB로 설정할 수 있습니다.
echo 500000000 > /sys/fs/cgroup/memory/myGroup/memory.limit_in_bytes
이제 Vim을 실행해 봅시다:
cgexec -g memory:myGroup vim
이제 vim 프로세스와 모든 하위 프로세스는 500MB RAM만 사용하도록 제한됩니다.하지만, 내 생각에 이 제한은 RAM에만 적용되고 스왑에는 적용되지 않습니다. 프로세스가 한계에 도달하면 교체가 시작됩니다. 이 문제를 해결할 수 있을지 잘 모르겠습니다. cgroup을 사용하여 스왑 사용을 제한하는 방법을 찾을 수 없습니다.
답변2
https://unix.stackexchange.com/a/536046/4319:
모든 systemd 기반 배포판에서는 systemd-run을 통해 간접적으로 cgroup을 사용할 수도 있습니다. 예를 들어 pdftoppm
RAM을 500M로 제한하려면 다음을 사용하세요.
systemd-run --scope -p MemoryLimit=500M pdftoppm
...
답변3
메모리가 제한된 cgroup에서 대상 프로세스를 실행하기 위해 cgroup-tools의 명령을 사용하여 이를 수행하는 스크립트를 만들었습니다. 바라보다이 답변세부정보와 스크립트를 알아보세요.