繁体   English   中英

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

[英]How to change process state from sleep to running in linux?

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

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

我使用root帐户在服务器上启动了该程序,这些过程最初运行良好:该程序的每个进程将占用约3.8 GB的内存,因此总共有40 GB

几个小时后, 其他一些用户启动了另一个消耗内存的程序(也使用root帐户),该程序积极使用了几乎所有内存(占总内存的99%),后来此程序被CTRL-Z中断并被使用杀死killall -9 process_name

但是,此后,我发现我的大多数池工作程序的进程状态已更改为S,这些睡眠进程的CPU使用率已降至0。据man top

 The status of the task which can be one of:
 'D' = uninterruptible sleep,
 'R' = running,
 'S' = sleeping,
 'T' = traced or stopped,
 'Z' = zombie

我使用ps -axl命令检查进程正在睡眠的内核函数的名称, 结果证明这些poolworker进程在_fastMutex_fastMutex睡眠_fastMutex

这种情况会持续很长时间(进程状态现在仍为S),并且我不想重新启动进程以再次扫描所有文件, 如何将这些进程从“睡眠”状态更改为“正在运行”?

睡眠状态表示他们正在等待某些东西; 唤醒它们的方法是满足它们等待的条件(互斥体可能是等待的机制,而不是条件本身)。 关于内存消耗的参考表明,某些进程可能至少被部分调出,在这种情况下,它们将等待交换程序。 但是,这将导致不间断的睡眠D,而不是S。

处于可中断睡眠的系统调用也可以被信号中断,例如警报,终止,停止或继续。 但是,大多数信号都会导致程序中止。 这两个(通常)是安全的,继续并忽略的,不会改变程序流; 因此它将再次以相同的状态重新进入睡眠状态。

您的流程使用S的原因很可能是它们确实在等待外部输入。 由于我们对您的程序的了解仅是它会加载大量数据,因此我无法告诉您发生的位置。

至于您如何描述程序:“每个作业都使用file.readlines()从多个大文件中读取,然后逐行分析它们”。 这极不可能是一种有效的方法。 如果您只在一次扫描中逐行扫描,则最好首先迭代文件对象(一次获取一行)。 如果您以随机顺序阅读文本行,则linecache是您的朋友。 使用mmap可以避免从磁盘缓冲区复制数据。 哪个最合适取决于数据的结构和算法。

通过“我的大多数泳池工人的状态已更改为S”,我怀疑其他工人是有趣的。 也许正在睡觉的人只是在等待那些被调出页面返回的人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM