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

fcg9iug3  于 5个月前  发布在  其他
关注(0)|答案(3)|浏览(78)

我正在运行Ubuntu服务器10.04.3的计算机上运行一个模拟。短时间运行(<24小时)运行良好,但长时间运行最终会停止。通过停止,我的意思是程序不再获得任何CPU时间,但它仍然在内存中保存所有信息。为了运行这些模拟,我SSH和nohup程序并将任何输出管道到一个文件。
其他信息:
系统绝对没有耗尽RAM。程序在完成之前不需要读取或写入硬盘;计算完全在内存中完成。程序没有被杀死,因为它在停止后仍然有一个PID。我使用openmp,但增加了最大进程数,最大时间是无限的。我使用ARPACK Fortran库查找矩阵的最大特征值。
任何想法是什么导致这种行为或如何恢复我目前停滞的程序?

z4bn682m

z4bn682m1#

我假设这是一个来自你的标签的OpenMP程序,虽然你从来没有真正声明过这一点。
这听起来像是你遇到了死锁(在MPI程序中比在OpenMP中更常见,但这绝对是可能的)。首先要做的是在调试标志为on的情况下编译,然后下次你发现这个问题时,附加一个调试器并找出各个线程在做什么。例如,对于gdb,一些用于在线程之间切换的指令显示为here

3ks5zfa0

3ks5zfa02#

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

  • 如果所有的线程在等待某个互斥量时都被阻塞了,那么就有了死锁。
  • 如果它们正在等待其他操作(例如读取),那么您需要弄清楚是什么阻止了操作的完成。

一般来说,在UNIX上,你不需要在重新构建时打开调试标志来获得有意义的堆栈跟踪。你不会得到文件/行号,但它们可能不是诊断问题所必需的。

pepwfjgg

pepwfjgg3#

一种可能的方法来理解一个正在运行的程序(也就是进程)所做的是用gdb program *pid*将调试器附加到它(只有在使用-g启用调试的情况下编译程序时才能正常工作),或者使用strace -p *pid*对其使用strace。strace命令是一个实用程序。(从技术上讲,是一个构建在ptrace系统调用接口之上的专用调试器),它显示了程序或进程执行的所有系统调用。
还有一个名为ltrace的变体,它拦截对动态库中函数的调用。
要了解它,请尝试例如strace ls
当然,如果正在运行的程序没有执行任何系统调用,strace不会给您带来多大帮助。

相关问题