当占用太多内存时自动挂起/休眠进程

lio*_*ori 6 linux virtual-memory memory-usage

我在具有 16GB RAM 的 8 核 PC 上运行一个小型 Debian 计算集群。我正在运行大约 1k 个任务的批次(每个批次的总预期时间为一个月)。单个任务是单线程的(因此我可以在每台 PC 上并行运行多个任务),不消耗太多 IO(启动时加载几兆字节的数据,退出时转储几兆字节的数据;不与外界通信否则),它的运行时间是未知的(从几分钟到~一周),它的内存消耗是未知的(从几兆字节到~8GB;使用可能会缓慢或快速增长)。我想在一台 PC 上并行执行尽可能多的此类任务,但我想避免过度交换。

所以我有了一个想法:我可以监视这些任务的内存使用情况,并暂停 ( kill -SIGSTOP) 或休眠(使用像CryoPID 之类的工具)任务,这些任务消耗了太多内存,无法稍后重新启动。我所说的内存使用是指“活动虚拟页面”的数量,或分配的数量,而不是实际被触及的共享内存页面(这些任务可能会在不使用它们的情况下分配内存)。

我开始寻找一些工具来做到这一点。我知道我可以ulimit或在内存受限的 cgroup 中运行任务,但是——如果我理解正确的话——这些解决方案将终止进程而不是挂起它。我想避免杀死它们,因为稍后我需要从头开始,这意味着浪费时间。此外,它们实际上无法测量活动虚拟页面的数量。

我可以使用真正的虚拟机,但在这种情况下它们似乎有很大的开销——拥有单独的内核、内存分配等会减少可用内存;我必须运行其中的 8 个。此外,据我所知,他们也会增加计算开销。

我想,实现这种行为的工具会将某些功能与页面错误通知挂钩,该通知将决定每个页面错误是否是暂停进程的时间。但我也不知道有任何工具可以以这种方式工作。

还有其他选择吗?

小智 0

我猜这个问题有点超出我的头脑,或者我误解了它,但是你是否在寻找类似的东西

ps auxww 然后检查 VSZ 列。然后,如果 VSZ 达到一定数量,您就会在该进程上执行您的 SIG?然后以您喜欢的时间间隔运行该命令?

来自 ps 手册页

vsz 进程的 VSZ 虚拟内存大小(以 KiB 为单位)(1024 字节单位)。目前不包括设备映射;这可能会发生变化。(别名vsize)。