
在編寫程式時,有時一個失控的程式會佔用我一半的 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
這導致幾乎所有東西都被殺死。ls
,date
其他小指令在開始之前就會被執行。
你使用什麼 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 命令來適應這些新功能。