5

固定的:

好吧,这似乎有点傻。原来 top 显示不正确,程序实际上继续运行。也许CPU时间变得太大而无法显示?无论哪种方式,该程序似乎都运行良好,而整个问题都没有实际意义。

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

原问:

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

其他信息:

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

关于导致这种行为的原因或如何恢复我目前停滞的程序的任何想法?

谢谢

4

3 回答 3

4

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

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

于 2011-10-16T16:59:57.510 回答
2

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

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

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

于 2011-10-16T17:26:37.557 回答
1

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

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

为了感受它,尝试例如strace ls

当然,strace如果正在运行的程序没有进行任何系统调用,这对您没有多大帮助。

问候。 巴西尔·斯塔林克维奇

于 2011-10-16T19:36:44.130 回答