2017-07-25 77 views
2

我有一臺Ubuntu 16.04虛擬機,用於在計算機上並行運行32個內核(每個內核1個,由GNU並行分配)的高度計算開銷的作業。 經過數小時到數天的運行時間後,我注意到有些內核被釋放,相應的進程不再運行。根據htop,內存(〜100GB)和交換(〜1GB)也幾乎完全滿了。但是,單獨一個過程通常需要多個GB。如果內存和交換用完了,進程是否會自動終止?

發生了什麼事?是否有活動的進程被換出並在稍後有更多內存可用時繼續運行?還是因爲交換已滿而被殺害?

我寧願手動停止一個進程並檢索中間結果,而不是在進程計算結束後終止進程並丟失任何結果。 作業正在運行時,我無法增加內存,但我只是碰到了swapspace。在進程仍在運行時安裝它是否合理?希望自動增加交換空間並防止進程被殺害?

回答

1

默認情況下,Linux將爲系統提供比系統實際可用內存更多的內存(memory overcommitment)。許多內存分配(例如堆棧或堆場)從未被完全使用,因此這允許系統在不遇到內存分配故障的情況下執行更多的工作。但是,如果進程寫入分配給它們的所有內存,那麼內核就無法完成這個承諾。沒有辦法將錯誤返回給進程,因爲它只是一條寫入指令,所以內核必須殺死進程。有一些啓發式方法可以選擇對系統不重要的進程,但可以釋放大量內存,但這並不總能產生良好的結果。

就你而言,你可能應該配置你的系統vm.overcommit_memory=2。這將禁用內存過量使用,並且內核只會分發實際由物理內存(RAM或交換)支持的內存。

+0

好的,所以沒有被'htop'運行列出的進程可能會被終止? – CGFoX

+1

是的,這些過程都沒有了。內核應該通過syslog/journal/dmesg記錄詳細信息。 –

相關問題