【发布时间】:2011-12-21 13:45:38
【问题描述】:
面试官问:
我们如何确定应用程序是否由于死锁或等待某些 IO 而变得无响应?
任何人都可以评论这样做的任何一般方式,或者如果各种提供了一些具体的方式来做到这一点?
我相信这是与操作系统相关的事情,所以我没有在这里标记任何语言。
编辑:我也想了解相关技术和 API。这样我就可以根据需要运行监控程序。
【问题讨论】:
标签: windows linux unix operating-system kernel
面试官问:
我们如何确定应用程序是否由于死锁或等待某些 IO 而变得无响应?
任何人都可以评论这样做的任何一般方式,或者如果各种提供了一些具体的方式来做到这一点?
我相信这是与操作系统相关的事情,所以我没有在这里标记任何语言。
编辑:我也想了解相关技术和 API。这样我就可以根据需要运行监控程序。
【问题讨论】:
标签: windows linux unix operating-system kernel
在 linux 上,我会使用 sar -u 1。如果%iowait 列高,那么应用程序可能正在等待 IO
【讨论】:
在 Windows 上,您可以附加 WinDbg,然后执行 !analyze -v -hang,这将确定哪个线程正在等待 I/O。 (我唯一一次使用这个我很幸运,这是一个等待的开放调用,所以我很快就找到了文件名。)
【讨论】:
答案是有许多可能的设计作为解决方案。
如果在您的应用程序中,您使用 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
【讨论】:
在 Linux 上,您可以将 gdb 附加到正在运行的进程。它将在正在运行的点停止进程,使用bt 您将获得回溯。您还可以获取所有正在运行的线程的线程信息,在它们之间切换并使用info threads; thread N; bt查看每个线程的回溯。
Linux 下另一个非常有用的工具是strace,它跟踪系统调用,您也可以将它附加到正在运行的进程。 -c 选项显示程序完成的系统调用的分析信息。
【讨论】: