程序在长时间运行期间停止

时间:2011-10-16 16:34:38

标签: linux ubuntu fortran openmp fortran90

修正:

这看起来有点傻。原来顶部没有正确显示,程序实际上继续运行。也许CPU时间变得太大而无法显示?无论哪种方式,该计划似乎工作正常,这整个问题没有实际意义。

谢谢(抱歉这个愚蠢的问题)。

原文问:

我在运行Ubuntu服务器10.04.3的计算机上运行模拟。短跑(< 24小时)运行良好,但长跑最终停止。通过停顿,我的意思是程序不再获得任何CPU时间,但它仍然保存在内存中的所有信息。为了运行这些模拟,我SSH和nohup程序并将任何输出传递给文件。

其他信息:

系统肯定没有用完RAM。该程序在完成之前不需要读取或写入硬盘驱动器;计算完全在内存中完成。程序没有被杀死,因为它在停止后仍然有一个PID。我使用openmp,但增加了最大进程数,最大时间不受限制。我正在使用ARPACK fortran库找到矩阵的最大特征值。

有关导致此行为的原因或如何恢复目前停滞程序的任何想法?

由于

3 个答案:

答案 0 :(得分:4)

我认为这是一个来自你的标签的OpenMP程序,尽管你实际上从未说明过这一点。 ARPACK线程安全吗?

听起来你正陷入僵局(MPI程序比OpenMP更常见,但绝对可能)。首先要做的是使用调试标志进行编译,然后在下次发现此问题时,使用调试器附加并找出各个线程正在执行的操作。例如,对于gdb,显示了一些在线程之间切换的指令here

答案 1 :(得分:2)

下次你的程序“停顿”时,将GDB附加到它并执行thread apply all where

  • 如果所有线程都被阻塞等待一些互斥锁,那么你有一个 死锁。
  • 如果他们正在等待其他事情(例如读取),那么您需要找出阻止该操作完成的内容。

通常在UNIX上,您无需使用调试标志进行重建以获得有意义的堆栈跟踪。您不会获得文件/行号,但可能没有必要来诊断问题。

答案 2 :(得分:1)

了解正在运行的程序(即进程)正在做什么的一种可能方法是使用gdb program *pid*将调试器附加到它(仅当程序编译时启用调试{ {1}}),或使用-g在其上使用strace。 strace -p *pid*命令是一个实用程序(从技术上讲,是在strace系统调用接口之上构建的专用调试器),它向您显示程序或进程完成的所有系统调用。

还有一个名为ptrace的变体拦截对动态库中函数的调用。

要了解它,请尝试使用ltrace

当然,如果正在运行的程序没有进行任何系统调用,strace ls对你没什么帮助。

的问候。 Basile Starynkevitch