ulimit는 메모리 사용량을 제한하지 않습니다.

ulimit는 메모리 사용량을 제한하지 않습니다.

프로그램을 작성할 때, 런어웨이 프로그램이 내 RAM의 절반을 빨아들이고(대개 큰 데이터 구조를 생성하는 동안 거의 무한 루프로 인해) 시스템이 정말 느려져서 문제가 되는 프로그램을 죽일 수도 없게 되는 경우가 있습니다. 그래서 내 프로그램이 비정상적인 양의 메모리를 사용할 때 ulimit를 사용하여 자동으로 프로그램을 종료하고 싶습니다.

$ ulimit -a
core file size          (blocks, -c) 1000
data seg size           (kbytes, -d) 10000
scheduling priority             (-e) 0
file size               (blocks, -f) 1000
pending signals                 (-i) 6985
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) 10000
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 6985
virtual memory          (kbytes, -v) 100000
file locks                      (-x) unlimited
$ ./run_program

그런데 내 프로그램이 여전히 주어진 제한보다 더 많은 RAM을 사용하는 이유는 무엇입니까(예, 동일한 bash 쉘에서 프로그램을 시작하고 있습니다)?

내가 ulimit에 대해 뭔가 오해한 걸까요?

답변1

귀하의 예제는 귀하가 생각하는 대로 작동해야 합니다(RAM을 너무 많이 소모하면 프로그램이 종료됩니다). 방금 쉘 서버에서 작은 테스트를 수행했습니다.

먼저 한도를 매우 낮게 제한했습니다.

ulimit -m 10
ulimit -v 10

그로 인해 거의 모든 것이 죽게 됩니다. ls, date기타 작은 명령은 시작하기도 전에 실행됩니다.

어떤 Linux 배포판을 사용하시나요? 프로그램이 단일 프로세스만 사용합니까, 아니면 수많은 하위 프로세스를 생성합니까? 후자의 경우 ulimit가 항상 효과적인 것은 아닙니다.

답변2

ulimit -m더 이상 작동하지 않습니다. 대신 사용하세요 ulimit -v.

그 이유는 ulimitsetrlimit를 호출하고남자 setrlimit말한다:

RLIMIT_RSS 프로세스 상주 세트(RAM에 상주하는 가상 페이지 수)의 제한(바이트)을 지정합니다. 이 제한은 Linux 2.4.x, x < 30에서만 적용되며 MADV_WILLNEED를 지정하는 madvise(2) 호출에만 영향을 미칩니다.

답변3

이는 .bash_profile에 넣지 않는 한 단일 bash 세션에서만 작동하며 이미 실행 중인 프로세스에는 적용되지 않습니다.

내가 이상하다고 생각하는 점은 다음과 같습니다.

 max memory size         (kbytes, -m) unlimited

1개의 사용자 계정에 대해 전체가 아닌 프로세스당 메모리 소비만 제한하더라도 /etc/security/limits.conf에는 없습니다. Cgroup을 추가하는 대신 기존 unix 명령을 수정하여 새로운 기능을 수용해야 했습니다.

관련 정보