如何将进程状态从睡眠状态更改为在linux中运行?

时间:2014-04-19 09:34:30

标签: python linux ubuntu memory

我有一个python程序,需要扫描一些大型日志文件以提取有用信息。

在这个程序中,为了更好地利用服务器的计算资源(运行ubuntu 12.04 LTS并具有64个内核和96 GB内存),我创建了一个大小= 10的进程池并将服务器作业应用于这些池工作者每个作业使用file.readlines()从几个大文件(每个大约50 GB,总共20个文件)中读取,然后逐行分析它们以查找有用信息并将结果保存在字典中。扫描并分析所有文件后,结果字典将写入磁盘。此外,整个脚本中没有明确调用gc.collect()

我使用root帐户在服务器上启动了这个程序,这些过程最初工作正常:这个程序的每个进程占用大约3.8 GB的内存,所以总共有40 GB

几个小时之后,其他一些用户启动了另一个占用内存的程序(也使用root帐户),该程序主动使用几乎所有内存(占总内存的99%),稍后此程序被{中断{1}}并使用CTRL-Z

杀死

然而,在此之后,我发现我的大多数池工作者的进程状态已经改为S,这些睡眠进程的CPU使用率降低到0。根据man {{ 1}}:

killall -9 process_name

我使用ps -axl命令检查进程正在休眠的内核函数的名称,结果是这些poolworker进程在top上休眠。

这种情况持续很长时间(进程状态现在仍然是S)并且我不想重新启动我的进程再次扫描所有文件,如何将这些进程从状态Sleep更改为Running吗

1 个答案:

答案 0 :(得分:3)

睡眠状态表明他们正在等待什么;唤醒它们的方法是满足它们等待的任何条件(互斥体可能是等待的机制,而不是条件本身)。对内存消耗的引用表明某些进程至少部分被分页的可能性,在这种情况下,它们将等待交换器;然而,这导致不间断的睡眠D,而不是S.

处于可中断睡眠状态的系统调用也可能被信号中断,例如警报,终止,停止或继续。但是,大多数信号会导致程序中止。两个(通常)安全,继续和忽视,不改变程序流程;所以它会再次回到相同状态的睡眠状态。

最有可能的是,您的流程在S中的原因是他们真正在等待外部输入。因为我们所知道的程序是它加载了大量数据,所以我无法告诉你这是怎么回事。

至于你如何描述你的程序:"每个作业从几个大文件中读取...使用file.readlines(),然后逐行分析它们#34;。这是一种有效的方法,这种可能性很小;如果你只是在一次扫描中逐行扫描,那么首先迭代文件对象(一次获得一行)会更好。如果您按随机顺序阅读文字行,linecache就是您的朋友。使用mmap可以避免从磁盘缓冲区复制数据。哪种最合适取决于数据和算法的结构。

我的大多数泳池工作者的状态已经改为S"我怀疑其他工人是有趣的。也许正在睡觉的人只是在等待被分页的人返回。