訪問者提問: 如何查找由於死鎖或由於等待某個IO而導致應用程序無響應?
任何人可以發表評論這樣做的任何一般的方式,或者各種爲此提供了一些具體的方法呢?
這是一個操作系統相關的事情,我相信,所以我不會在這裏標註任何語言。如何查找進程是處於死鎖狀態還是等待I/O
編輯:我想了解的技術和API的以及做到這一點。這樣我就可以運行監控程序了。
訪問者提問: 如何查找由於死鎖或由於等待某個IO而導致應用程序無響應?
任何人可以發表評論這樣做的任何一般的方式,或者各種爲此提供了一些具體的方法呢?
這是一個操作系統相關的事情,我相信,所以我不會在這裏標註任何語言。如何查找進程是處於死鎖狀態還是等待I/O
編輯:我想了解的技術和API的以及做到這一點。這樣我就可以運行監控程序了。
在Linux上我會用sar -u 1
。如果%iowait
列高,那麼應用程序可能正在等待IO
在Windows上,您可以附加WinDbg,然後執行!analyze -v -hang
這將確定哪個線程正在等待I/O。 (唯一一次我使用這個,我很幸運,這是一個公開的電話,正在等待,所以我很快找到文件名。)
在Linux上,您可以將gdb
附加到正在運行的進程。它會在正在運行的位置停止該進程,使用bt
您將得到回溯。您還可以得到所有正在運行的線程的線程信息,並在它們之間進行切換,並期待在每個使用info threads; thread N; bt
的反跟蹤。
Linux下的另一個非常有用的工具是strace
可追溯系統調用,你還可以將這個到正在運行的進程。 -c
選項顯示您分析程序完成的系統調用的信息。
答案是有很多可能的設計方案。
如果在您的應用程序中,您使用open()與lockf()或flock()來鎖定資源。因此,下一次另一個進程(或同一進程)再次嘗試堆積()同一個文件時,它將被阻塞。
如果妳打開與LOCK_NB文件(請參閱「man -s在Ubuntu 2羣)非阻塞的鎖,然後用EWOULDBLOCK返回錯誤,則U可以推斷出該文件被鎖定。
要確定所有鎖定的文件在操作系統中,一種方法是做一個「lsof」來查看所有打開的文件,並從文件名和使用fcntl()你可以識別持有的鎖的類型。 :例如,對於Oracle數據庫,有一個稱爲服務員列表的概念,以列出等待現有鎖定記錄的所有服務員。由於這種複雜的設計,自動死鎖檢測也是可能的。
http://www.dba-oracle.com/t_deadlock.htm
其他技術一般OS課程描述:
http://lovingod.host.sk/tanenbaum/Recovery-from-Deadlock.html