!['ulimit'가 예상대로 메모리 사용량을 제한하지 않는 이유는 무엇입니까?](https://rvso.com/image/1554905/'ulimit'%EA%B0%80%20%EC%98%88%EC%83%81%EB%8C%80%EB%A1%9C%20%EB%A9%94%EB%AA%A8%EB%A6%AC%20%EC%82%AC%EC%9A%A9%EB%9F%89%EC%9D%84%20%EC%A0%9C%ED%95%9C%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
프로세스의 메모리 사용량을 제한하려고 합니다.
$ulimit -m 2
$/usr/bin/time -l ./myProcess arg1 arg2
time
출력될 때까지 프로세스가 종료되지 않고 실행됩니다.
7.00 real 4.83 user 2.16 sys
4154855424 maximum resident set size
0 average shared memory size
0 average unshared data size
0 average unshared stack size
1014384 page reclaims
0 page faults
0 swaps
0 block input operations
2 block output operations
0 messages sent
0 messages received
0 signals received
0 voluntary context switches
15 involuntary context switches
명령줄 에도 불구하고 한도를 초과했음을 보여줍니다 ulimit -m 5
. 나는 또한 옵션을 시도했지만 -v
그 -l
중 어느 것도 실제로 메모리 사용량을 제한하지 않는 것 같습니다. 또한 time
하위 프로세스의 메모리 사용량을 확인하는 데 실패하지 않는지 확인하기 위해 노력했습니다 . 다음은 all 을 사용한 후의 모든 제한 사항 입니다 -m
.-v
-l
$ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) 3
max memory size (kbytes, -m) 2
open files (-n) 256
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 709
virtual memory (kbytes, -v) 2
CPU 시간( )을 제한하면 ulimit -t 3
제대로 작동하고 3초 후에 프로세스가 종료됩니다.
질문
제가 잘못 알고 있는 부분이 있나요 ulimit -m 5
? 내 ulimit 버전에 버그가 있나요?
ulimit
프로세스(반드시 bash 세션일 필요는 없음)의 시간 및 메모리 사용량을 제한하는 대안이 있습니까 ?
버전
나는 에 MAC OSX 10.11.6
있고 bash version 3.2.57
.
관련 게시물
게시물 "ulimit는 메모리 사용량을 제한하지 않습니다"매우 관련이 있지만 허용되는 답변이 문제 해결 방법에 대한 솔루션을 제공한다고 생각하지 않습니다.
답변1
최신 Linux 커널에서는 ulimit
릴리스가 나올 때마다 의미가 점점 줄어들고 있습니다. -v
귀하의 glibc 버전이 파일 로딩을 선호할 수 있으므로 실제로 사용할 수 없습니다. 따라서 프로세스가 열려는 모든 파일을 포함할 만큼 충분히 크게 mmap()
설정해야 합니다 . -v
결과적으로 -v
플래그를 사용하여 물리적 RAM 사용량을 제한할 수 없습니다.
또한 -m
플래그는 아무 작업도 수행하지 않으므로 물리적 메모리 사용량을 제한하는 데 사용할 수 없습니다.
요즘에는 물리적 RAM 사용을 제한하기 위해 커널에 대한 인터페이스를 사용해야 cgroups
하지만 불행히도 API는 사용하기가 약간 어렵습니다. 아마도 언젠가는 매개변수로 주어진 프로세스에 대한 메모리를 제한할 수 있는 nice
유사한 프로세스가 있을 것입니다.ionice
이론적으로는 최근에 systemd
다음과 같은 작업을 수행할 수 있어야 합니다.
systemd-run --scope --user -p MemoryMax=250M -- /path/to/program/to/use
그러면 마술처럼 작동할 것입니다. 이것이 작동하지 않는 기술적 이유는 없지만(기본 Linux cgroup
기능이 필요한 기능을 지원하기 때문에) 일부 systemd
버전은 자동으로 실패하고 실제로 메모리 사용량을 제한하지 않습니다. 프로그램을 종료하지 않고 메모리 소비를 낮추기 위해 프로그램을 푸시하려는 경우 옵션 -p MemoryHigh=200M
과 같은 것을 추가할 수도 있습니다 . 커널이 메모리 사용량을 줄이기 위해 해당 프로세스에서 모든 메모리(캐시 포함)를 회수하기 위해 추가 작업을 수행하기 때문에 systemd-run
초과하면 프로세스 속도가 상당히 느려진다는 점에 유의하세요 . MemoryHigh
대부분의 경우 최대 한도를 적용하려는 경우에는 이를 원하지 않습니다.