Linux:针对经常崩溃的 C++ 和 FORTRAN 程序的系统保护

Linux: system protection against C++ and FORTRAN programs which like to crash often

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

在那之后通常内存会满,系统变得无响应,我必须重新启动整个计算机。我真的不想那样做,因为我们正在谈论 Ubuntu Linux 14.04 LTS 我认为有一种方法可以避免这种情况。交换已关闭,因为交换程序的内容会减慢它的速度。

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

回答我的问题:

除了虚拟机之外,有什么好的方法可以保护系统免受那些乱七八糟的程序的侵害吗?

P.S.: 我知道这个程序有错误,但我现在不能修复它们,所以我想保护系统免于挂起。我也不能使用调试器,因为它会 运行 太久。

编辑:

经过一些评论,我想澄清一些事情。代码太复杂了。我没有时间修复错误,有些版本我什至没有得到源代码。我必须运行它,因为我们被迫这样做。你并不总是有选择。

不运行宁这样的程序不是一个选项,因为它仍然会产生一些结果。所以重新启动系统是一种解决方法,但我想做得更好。我认为 ulimit 是一个选项,但没有考虑过那个。可能会有帮助。

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

这里真正的问题是要意识到如果你的模拟程序在内存不足时被杀死,你真的可以使用生成的结果吗?该程序是否正在执行一些检查点操作以从崩溃中恢复?

还有内存泄漏的写得不好的程序也经常有更严重的问题,如溢出,如果你做真正的科学,这会使结果完全无用。

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