限制Ruby进程的堆大小不起作用

时间:2015-02-17 10:42:06

标签: ruby zsh ulimit

我想限制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

0 个答案:

没有答案