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 shell 中啟動該程式)?

我是否誤解了 ulimit 的某些內容?

答案1

你的例子應該像你想像的那樣工作(程式在消耗太多記憶體後被殺死)。我剛剛在我的 shell 伺服器上做了一個小測試:

首先,我將我的限制限制得很低:

ulimit -m 10
ulimit -v 10

這導致幾乎所有東西都被殺死。lsdate其他小指令在開始之前就會被執行。

你使用什麼 Linux 發行版?您的程式僅使用單一進程還是會產生大量子進程?在後一種情況下,ulimit 可能並不總是有效。

答案2

ulimit -m不再有效。代替使用ulimit -v

原因是ulimit呼叫 setrlimit,並且手動設定限制說:

RLIMIT_RSS 指定進程駐留集(RAM 中駐留的虛擬頁數)的限制(以位元組為單位)。此限制僅在 Linux 2.4.x(x < 30)中有效,並且僅影響對指定 MADV_WILLNEED 的 madvise(2) 的呼叫。

答案3

這只適用於單一 bash 會話,除非您將其放入 .bash_profile 中並且不會應用於已執行的進程。

我覺得奇怪的是:

 max memory size         (kbytes, -m) unlimited

不存在於 /etc/security/limits.conf 中,即使它只限制每個程序的記憶體消耗,而不是 1 個使用者帳戶的整體記憶體消耗。他們不應該添加 Cgroup,而應該修改現有的 unix 命令來適應這些新功能。

相關內容