我正在使用16GB内存的8核PC上运行一个小型的Debian计算集群。 我正在运行大约1k个任务的批次(每个批次总共有一个月的预计完成时间)。 一个任务是单线程的(所以我可以在每台PC上并行运行多个),不会消耗太多的IO(在启动时加载几兆字节的数据,在退出时转储数兆字节的数据;不与外部通信否则),其运行时间是未知的(从几分钟到几周),其内存消耗是未知的(从几兆字节到8GB;使用可能增长缓慢或快速)。 我想尽可能在单台PC上同时完成多项任务,但是我想避免过多的交换。
所以我有一个想法:我可以监视这些任务的内存使用情况,并暂停( kill -SIGSTOP )或hibernate(使用类似CryoPID的工具)任务,这些任务会消耗太多的内存以便稍后重新启动。 内存使用量是指“活动虚拟页面”的数量,或者实际上已经被触摸的已分配但不是共享的内存页面的数量(这些任务可以在不使用它们的情况下分配内存)。
我开始寻找一些工具来做到这一点。 我知道我可以在限制内存的cgroup中限制或运行任务,但是如果我正确理解这些任务,这些解决scheme将会终止进程,而不是暂停进程。 我想避免杀死他们,因为我需要从头开始,这意味着浪费时间。 而且,他们实际上不能测量活动虚拟页面的数量。
我可以使用真正的虚拟机,但是在这种情况下它们似乎具有相当大的开销 – 具有单独的内核,内存分配等会减less可用内存; 我必须运行其中的8个。 而且,据我所知,他们也会增加计算开销。
我想象一个实现这种行为的工具会把一些函数连接到一个页面错误通知,它会决定每个页面错误是否是暂停过程的时间。 但我不知道任何可以这样工作的工具。
还有其他的select吗?
你指的是过程检查点。 在后来的内核中有一些工作提供这个(与冷冻机cgroup一起),但还没有准备好。
实际上这很难实现,因为某些共享资源在一段固定的时间内不能使用(比如说TCPpopup,尽pipe这也可能适用于使用挂钟的应用程序,或者也可能是某些共享内存在过程脱机期间改变状态)。
至于在达到一定内存利用率的时候停止这个过程,我能想到的就是这样做。
cgroup.event_control并设置一个你不想超过的内存阈值(这在内核文档中有所解释) 请注意,“冻结”cgroup不会将页面逐出到媒体永久性位置,但是当足够的时间过去并且其他页面需要页面时,它将交换页面。
即使这样做确实有效(如果真的这么做的话,你还是要考虑一下),你需要考虑一下这个问题是否真的在解决你的问题。
sched_min_granularity_ns完成。 不幸的是,最好的解决scheme是检查点任务的能力。 令人遗憾的是大部分的实现都不够具体。
或者,您可以等待几年,以便在内核中提供适当的检查点/恢复操作!
我猜这个问题有点凌驾于我的头上,或者我误解了,但是你在寻找类似的东西
ps auxww,然后检查VSZ列。 那么如果VSZ达到一定的数量,那么你在这个过程中执行SIG? 然后在你最喜欢的间隔运行命令?
从PS手册页
vsz VSZ进程的虚拟内存大小(以1024字节为单位)。 设备映射目前被排除在外; 这是可以改变的。 (别名vsize)。