采访者问: 我们怎样才能发现应用程序是否由于死锁或某些IO等待而无响应? 任何人都可以评论这样做的一般方式,或者各种提供一些具体的方法吗? 这是与操作系统相关的事情我相信所以我没有在这里标记任何语言。
编辑:我想知道这些技术和API。如果我愿意,我可以运行一个监控程序。答案 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
选项显示程序完成的系统调用的分析信息。