Linux:系统保护,防止c++和FORTRAN程序经常崩溃



我有一个运行很长时间的程序,大约3周。它实际上是一个模拟应用程序。

在那之后,通常内存被填满,系统变得没有响应,我不得不重新启动整个计算机。我真的不想这样做,因为我们正在谈论Ubuntu Linux 14.04 LTS,我认为有一种方法可以避免这种情况。Swap是关闭的,因为让程序的东西交换会使它变慢太多。

该程序部分使用c++(约10%)和FORTRAN(约90%)编写,并使用GNU编译器套件(g++和gfortran)进行编译和链接。

回到我的问题:

有没有一种好的方法来保护系统不受那些程序的干扰,而不是虚拟机?

注:我知道这个程序有bug,但我现在无法修复,所以我想保护系统不被挂起。我也不能使用调试器,因为它会运行太长时间。

编辑:

在一些评论之后,我想澄清一些事情。代码太复杂了。我没有时间去修复bug,而且有些版本我甚至连源代码都没有。我必须运行它,因为我们被迫这样做。你并不总是有选择的余地。

不运行这样的程序不是一个选项,因为它仍然会产生一些结果。所以重新启动系统是一个变通办法,但我想做得更好。我认为无限制是一种选择,没有考虑过那个。也许会有帮助。

限制这个蹩脚的应用程序内存是最简单的部分。例如,您可以使用Docker (https://goldmann.pl/blog/2014/09/11/resource-management-in-docker/#_memory)或cgroup,它们是一种虚拟机,但开销要小得多。如评论中所述,ulimit也可能是一种选择。

这里真正的问题是要意识到,如果您的模拟程序在内存耗尽时被终止,您实际上可以使用生成的结果吗?这个程序是否做了一些检查点来从崩溃中恢复?

同样,带有内存泄漏的编写糟糕的程序也经常出现更严重的问题,比如溢出,如果你做真正的科学研究,这会使结果完全无用。

您可以尝试使用valgrind来调试内存问题。Fortran也有很好的编译指令用于数组边界检查,如果可以的话,您应该激活这些设置。

最新更新