簡體   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