挂起/恢复磁盘上的单个进程


22

有时,我们希望在Ubuntu和OS X服务器上暂停占用大量内存的进程,以临时释放一些RAM用于其他作业。如果我们只担心CPU使用率,那么简单的方法Ctrl-Z就可以了。但是,我们需要能够释放RAM(通过将其写入磁盘),然后重新启动进程(磁盘-> RAM),或者换句话说,“休眠”单个进程。有关如何执行此操作的任何线索?(最好来自CLI。)谢谢。


7
我猜想,当一个进程处于挂起状态时,如果需要,它的已用内存可以作为交换到磁盘的候选对象,并且应该从内核自动完成。
enzotib

1
@enzotib-我不知道是否会发生,从理论上讲,这听起来不错。但是,我只是做了一个粗略的测试,实际上它是行不通的。暂停“ RAM Eaters”时产生的任何新进程都非常缓慢,而且我没有检测到将RAM交换到磁盘时会发生的任何磁盘活动。
Mike Covington

1
@frozenwithjoy我可以确认确实发生了。我能想到的是,挂起的进程不会逐渐被交换掉的唯一原因是请求的不可交换内存(非常少见,并且(大多数)保留给根用户),或者它所映射的内存与另一个活动进程共享。
吉尔(Gilles)'所以

1
这里可能有用的术语是“检查点”(是的,丑陋的动词形式)。这通常是一个难题,因为程序可能正在使用某些资源,这些资源可能会在程序睡眠时更改状态。处理该问题曾经是Big Iron和小巧的计算机之间的区别之一。
dmckee,2011年

Answers:


8

没有用于休眠单个进程的通用功能,只有整个系统。

但是,如果您不关心过程映像在重启后是否会幸免,则有一个内置功能可将过程映像保存到磁盘:交换。确保您有足够的交换空间,并且如果存在内存压力并且该进程未处于活动状态(例如,由于该进程已挂起),则其内存将被交换出去。

如果您知道该进程很长时间可能处于非活动状态,并且在某个时候需要快速响应,则可以通过在一个进程中分配大量RAM来强制释放大量RAM。短期过程,例如

perl -e '$tmp = "a" x 999999999' # allocate about 1GB

您无法控制要交换的内容,因此其他进程可能会被交换出去。在Linux上,您可以通过强制访问其映射的页面来交换回进程。此答案中的脚本将执行以下操作:将进程映射的所有页面加载到内存中(请注意,这包括打开的文件;您可以根据地图信息有选择地遍历区域,以避免交换不需要的数据,请参阅此答案以获取更多信息)。



5

确保您有足够的交换空间。确保将系统设置为首选交换不活动的页面(vm.swappiness = 100)。然后,足以中止该过程。内核将更愿意交换不活动的页面。


-1

在Mac OS X上,您可以尝试使用purge命令(Xcode附带)释放一些(不活动的)RAM。

vm_stat
purge
vm_stat

2
purge在这里无济于事。它删除了磁盘缓存,但这不会导致进程的内存被换出,也不会使另一个进程获得RAM的速度更快。
吉尔(Gilles)'所以
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.