1

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

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

4

1 回答 1

0

您只需要应用rlimit到子进程而不是依赖 rlimit 继承。setrlimit手册页中清楚地说明了您的主要阻止程序:

非特权进程只能将其软限制设置为从 0 到硬限制范围内的值,并且(不可逆地)降低其硬限制

执行此操作的标准方法是通过 fork/exec,类似于:

child_pid := fork()
if pid != 0 {
  // in child process
  setrlimit(...)
  execve(...)
}

如果你不想这样做,你还有几个选择:

  • 以特权用户身份运行
  • cmd.Runbash ulimit -m ...一个调用子进程的小包装器(例如:) 。注意:-m许多系统不尊重。
  • 调用prlimit(特定于 linux 且没有系统调用包装器。有关详细信息,请参阅此线程
于 2018-01-17T07:34:14.970 回答