gpt4 book ai didi

go - 在不影响当前进程的情况下,使用 rlimit 限制子进程的内存使用

转载 作者:IT王子 更新时间:2023-10-29 01:47:10 30 4
gpt4 key购买 nike

我想使用 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,就会报错。

我想知道有什么方法可以在不影响当前子进程的情况下限制子进程的内存使用?

最佳答案

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

an unprivileged process may set only its soft limit to a value in the range from 0 up to the hard limit, and (irreversibly) lower its hard limit

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

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

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

  • 以特权用户身份运行
  • cmd.Run 调用子进程的小包装器(例如:bash ulimit -m ...)。注意:许多系统不支持 -m
  • 调用 prlimit(Linux 特定且无系统调用包装器。see this thread 了解详情)

关于go - 在不影响当前进程的情况下,使用 rlimit 限制子进程的内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48295074/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com