修正:
这看起来有点傻。原来顶部没有正确显示,程序实际上继续运行。也许CPU时间变得太大而无法显示?无论哪种方式,该计划似乎工作正常,这整个问题没有实际意义。
谢谢(抱歉这个愚蠢的问题)。
原文问:
我在运行Ubuntu服务器10.04.3的计算机上运行模拟。短跑(< 24小时)运行良好,但长跑最终停止。通过停顿,我的意思是程序不再获得任何CPU时间,但它仍然保存在内存中的所有信息。为了运行这些模拟,我SSH和nohup程序并将任何输出传递给文件。
其他信息:
系统肯定没有用完RAM。该程序在完成之前不需要读取或写入硬盘驱动器;计算完全在内存中完成。程序没有被杀死,因为它在停止后仍然有一个PID。我使用openmp,但增加了最大进程数,最大时间不受限制。我正在使用ARPACK fortran库找到矩阵的最大特征值。
有关导致此行为的原因或如何恢复目前停滞程序的任何想法?
由于
答案 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