如何查找进程是处于死锁状态还是正在等待I / O.

时间:2011-11-03 21:27:51

标签: windows linux unix operating-system kernel

采访者问: 我们怎样才能发现应用程序是否由于死锁或某些IO等待而无响应? 任何人都可以评论这样做的一般方式,或者各种提供一些具体的方法吗? 这是与操作系统相关的事情我相信所以我没有在这里标记任何语言。

编辑:我想知道这些技术和API。如果我愿意,我可以运行一个监控程序。

4 个答案:

答案 0 :(得分:2)

在linux上我会使用sar -u 1。如果%iowait列为高,则应用程序可能正在等待IO

答案 1 :(得分:2)

在Windows上,您可以附加WinDbg然后执行!analyze -v -hang,这将解决哪个线程在I / O上等待。 (我唯一一次使用它,我很幸运,这是一个等待的公开呼叫,所以我很快就找到了文件名。)

答案 2 :(得分:0)

答案是有许多可能的设计作为解决方案。

如果在您的应用程序中,您使用open()和lockf()或flock()来锁定资源。因此,下一次另一个进程(或同一进程)再次尝试flock()同一个文件时,它将被阻止。

如果你用LOCK_NB打开一个文件(参见“man -s 2 flock in Ubuntu”)非阻塞锁,然后返回EWOULDBLOCK错误,那么你可以推断该文件被锁定了。

要识别操作系统中的所有锁定文件,一种方法是使用“lsof”查看所有打开的文件,并使用文件名并使用fcntl()来识别所持有的锁类型。

许多可能的替代设计:例如,对于Oracle数据库,有一个名为服务器列表的概念,用于列出等待现有锁定记录的所有服务员。由于这种复杂的设计,自动死锁检测也是可能的。

http://www.dba-oracle.com/t_deadlock.htm

其他技术在一般操作系统课程中有描述:

http://lovingod.host.sk/tanenbaum/Recovery-from-Deadlock.html

答案 3 :(得分:-1)

在Linux上,您可以将gdb附加到正在运行的进程。它会在正在运行的位置停止进程,bt您将获得后向跟踪。您还可以获取所有正在运行的线程的线程信息,在它们之间切换,并使用info threads; thread N; bt查看每个线程的后跟踪。

Linux下另一个非常有用的工具是strace跟踪系统调用,您也可以将其附加到正在运行的进程。 -c选项显示程序完成的系统调用的分析信息。