2015-09-05 28 views
-3

我有一個運行很長時間,大約3周的程序。它實際上是一個模擬應用程序。Linux:針對C++和FORTRAN程序的系統保護喜歡經常崩潰

在那段時間後,通常內存變滿,系統變得不穩定,我必須重新啓動整個計算機。我真的不想這樣做,因爲我們正在談論Ubuntu Linux 14.04 LTS,我認爲有一種方法可以避免這種情況。交換關閉,因爲交換程序的東西會減慢它太多。該程序部分用C++(約10%)和FORTRAN(約90%)編寫,並使用GNU編譯器套件(g ++和gfortran)進行編譯和鏈接。

前往我的問題:

是否有防止那些搞砸了比虛擬機其它程序的好方法?

P.S .:我知道該程序有錯誤,但我現在無法修復它們,所以我想保護系統免於掛起。此外,我不能使用調試器,因爲它會運行太久。

編輯:

一些意見後,我想澄清一些事情。代碼太複雜了。我沒有時間來修復這些錯誤,並且有些版本中我甚至沒有得到源代碼。我必須運行它,因爲我們被迫這樣做。你並不總是有選擇的。

不運行這樣的程序不是一個選項,因爲它仍然會產生一些結果。因此,重新啓動系統是一種解決方法,但我希望做得更好。我認爲有限的選擇,沒有考慮那個。它可能有幫助。

+5

因此,您不想修復這些錯誤,而是想使用虛擬機來填充內存並將所有內容放慢速度?廢話。修復錯誤。 – deviantfan

+1

「*有沒有一種保護系統免受這些程序的好方法*」不要運行它們?說實話,你期望什麼樣的工具?唯一的一個(可能)能夠刪除代碼泄漏的內存,是編碼器,是不是他/她? – alk

+0

...如果操作系統交換機制對你來說不夠好,在你的程序中建立一些你知道不需要的數據*寫入文件。 – deviantfan

回答

2

限制這個蹩腳的應用程序內存是最簡單的部分。例如,您可以使用Docker(https://goldmann.pl/blog/2014/09/11/resource-management-in-docker/#_memory)或cgroup,這是一種虛擬機,但開銷較小。如評論中所述,ulimit也可以是一個選項。

這裏真正的問題是要認識到,如果您的仿真程序在內存用完時被殺死,您是否可以真正使用生成的結果?這個程序是否正在執行一些檢查點以從崩潰中恢復?

另外寫入內存泄漏的程序也經常出現溢出等更嚴重的問題,如果你真正做到了真正的科學,這可能會使結果變得毫無用處。

您可能嘗試使用valgrind來調試內存問題。 Fortran也有很好的數組邊界檢查編譯指令,如果可以的話,你應該激活這些設置。

+0

嘿,這幫了我很多。非常感謝你!我必須學習更多關於Docker的東西。 –