长时间运行时程序停止

问题描述 投票:0回答:3

我正在运行 Ubuntu 服务器 10.04.3 的计算机上运行模拟。短期运行(<24 hours) run fine, but long runs eventually stall. By stall, I mean that the program no longer gets any CPU time, but it still holds all information in memory. In order to run these simulations, I SSH and nohup the program and pipe any output to a file.

其他信息:

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

对于导致此行为的原因或如何恢复我当前停滞的程序有什么想法吗?

linux ubuntu fortran openmp fortran90
3个回答
4
投票

我认为这是您标签中的 OpenMP 程序,尽管您从未真正声明过这一点。 ARPACK 线程安全吗?

听起来您遇到了死锁(在 MPI 程序中比 OpenMP 更常见,但这绝对是可能的)。要做的第一件事是在打开调试标志的情况下进行编译,然后下次发现此问题时,附加调试器并找出各个线程正在做什么。例如,对于 gdb,此处显示了一些在线程之间切换的指令。


2
投票

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

thread apply all where

  • 如果你的所有线程都被阻塞等待某个互斥锁,那么你就有一个 陷入僵局。
  • 如果他们正在等待其他事情(例如读取),那么您需要找出阻止操作完成的原因。

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


1
投票

了解正在运行的程序(即进程)正在执行的操作的一种可能方法是使用

gdb program *pid*
将调试器附加到它(仅当程序在使用
-g
启用调试的情况下进行编译时才能正常工作),或者使用 strace 来使用
strace -p *pid*
strace
命令是一个实用程序(从技术上讲,是构建在
ptrace
系统调用接口之上的专用调试器),它向您显示程序或进程完成的所有系统调用。

还有一个变体,称为

ltrace
,它拦截对动态库中函数的调用。

要感受一下,请尝试一下

strace ls

当然,如果正在运行的程序没有进行任何系统调用,

strace
不会对你有太大帮助。

© www.soinside.com 2019 - 2024. All rights reserved.