【问题标题】:How can I find whether a process is in deadlock or is waiting for I/O如何查看进程是否处于死锁状态或正在等待 I/O
【发布时间】:2011-12-21 13:45:38
【问题描述】:

面试官问: 我们如何确定应用程序是否由于死锁或等待某些 IO 而变得无响应?
任何人都可以评论这样做的任何一般方式,或者如果各种提供了一些具体的方式来做到这一点?
我相信这是与操作系统相关的事情,所以我没有在这里标记任何语言。

编辑:我也想了解相关技术和 API。这样我就可以根据需要运行监控程序。

【问题讨论】:

    标签: windows linux unix operating-system kernel


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

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

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

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

        一般操作系统课程中介绍了其他技术:

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-12-22
            相关资源
            最近更新 更多