我想使用rlimit限制子进程的内存使用量。目前我们的代码如下:
old_rlimit := get_rlimit()
set_rlimit(child_process_rlimit)
cmd.Start()
set_rlimit(old_rlimit)
cmd.Wait()
但是,有时Golang运行时会在cmd.Start()
报告内存不足错误。似乎在cmd.Start()
当前进程中将分配一些内存,如果当前内存使用率高于child_process_rlimit
,则会引发错误。
我想知道有没有办法限制子进程的内存使用而不影响当前进程?
答案 0 :(得分:0)
您只需要将rlimit
应用于子进程,而不是依赖于rlimit继承。这里的主要拦截器清楚地在setrlimit
手册页中详细说明:
非特权进程可能只将其软限制设置为 范围从0到硬限制,并且(不可逆地)降低其硬度 限制
执行此操作的标准方法是通过fork / exec,类似于:
child_pid := fork()
if pid != 0 {
// in child process
setrlimit(...)
execve(...)
}
如果您不想这样做,您仍有几个选择:
cmd.Run
一个调用子进程的小包装器(例如:bash ulimit -m ...
)。注意:许多系统都不尊重-m
。prlimit
(特定于linux,没有系统调用包装。see this thread以获取详细信息)