使用rlimit限制子进程的内存使用情况,而不会影响当前进程

时间:2018-01-17 06:43:57

标签: go system-calls setrlimit

我想使用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,则会引发错误。

我想知道有没有办法限制子进程的内存使用而不影响当前进程?

1 个答案:

答案 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以获取详细信息)