我想限制Ruby进程可用的堆大小,即如果进程试图获取更多堆,它应该中止。从zsh调用Ruby进程。为了测试这个概念,我做了以下几点:
在我的Ruby程序中,我使用以下函数计算堆大小:
def heap_size
GC.stat[:heap_length] * # Number of pages
GC::INTERNAL_CONSTANTS[:HEAP_OBJ_LIMIT] * # Number of slots in one page
GC::INTERNAL_CONSTANTS[:RVALUE_SIZE] # Size of one slots in bytes
end
通过为该程序设置合适的参数,我可以看到初始堆大小,并在分配了一定数量的对象时验证堆如何增加。
在我的调用zsh脚本中,我使用 limit 命令设置子进程的shell限制,以具有以下值:
cputime unlimited
filesize unlimited
datasize 9MB
stacksize 8MB
coredumpsize 0kB
addressspace 1MB
memorylocked 1MB
maxproc 266
descriptors 2560
使用此设置,我仍然可以设法运行报告堆消耗的进程,例如,在堆上分配数据后,初始堆大小为1077120字节,以及36214080字节。
虽然初始大小刚好低于1MB的限制,但在执行期间堆增长到大约36MB,我本来希望操作系统能够终止进程。
我是否误解了 limit 命令的工作方式?
我正在使用OSX 10.6
BTW,我还使用 ulimit 验证了限制,以防我的zsh的 limit 命令以某种方式被破坏,但这些看起来也合理:
$ /usr/bin/ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) 9216
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) 1024
max memory size (kbytes, -m) 1024
open files (-n) 2560
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 266
virtual memory (kbytes, -v) 1024