防止机器因内存不足而变慢

防止机器因内存不足而变慢

我的软件运行一个类似于以下命令的命令:

查找| xargs 做了一项可能需要大量内存的工作

问题是,有时可能需要大量内存的作业变得太饿,系统变得无响应,我必须重新启动它。我的理解是,这是由于内存分配超过承诺而发生的。我希望发生的是,如果 xargs 生成的作业需要比可用内存更多的内存,它就会终止(我对此表示同意),仅此而已。我想如果我在系统范围内关闭过度使用,我可以得到这种行为,但这不是一个选项。是否可以关闭某个进程?

我想到的一个可能的解决方案是设置

ulimit -v RAM 大小

但有些事情告诉我这不是一个好主意。

答案1

我认为您正在寻找的是--memfreeGNU Parallel:

find ... | parallel --memfree 1G dostuff

dostuff仅当有 1G RAM 空闲时才会启动。它将再启动一个,直到可用 RAM 少于 1G 或每个 CPU 线程正在运行 1 个作业。如果有 0.5G RAM 空闲(1G RAM 的 50%),则最年轻的作业将被终止。所以在元代码中:

limit = 1G
while true:
  if freemem > limit:
    if count(running_jobs) < cpu.threads():
      another_job.start()
  if freemem < 0.5 * limit
    youngest_job.kill()

如果结合使用,--retries 10您可以告诉 GNU Parallel 重试被终止的作业 10 次。

如果dostuff需要一段时间才能耗尽内存,请--delay 30s在生成下一个作业之前等待 30 秒。

答案2

sysctl vm.overcommit_memory 2

如果你想避免 cgroup

相关内容