我的软件运行一个类似于以下命令的命令:
查找| xargs 做了一项可能需要大量内存的工作
问题是,有时可能需要大量内存的作业变得太饿,系统变得无响应,我必须重新启动它。我的理解是,这是由于内存分配超过承诺而发生的。我希望发生的是,如果 xargs 生成的作业需要比可用内存更多的内存,它就会终止(我对此表示同意),仅此而已。我想如果我在系统范围内关闭过度使用,我可以得到这种行为,但这不是一个选项。是否可以关闭某个进程?
我想到的一个可能的解决方案是设置
ulimit -v RAM 大小
但有些事情告诉我这不是一个好主意。
答案1
我认为您正在寻找的是--memfree
GNU 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