這是在Linux系統(紅帽發行版)上。如何調試處於不間斷睡眠的進程?
我有一個在Perl中實現的守護進程。它監控一張工作表,當它發現一個新工作表時,它會讓一個孩子執行工作。
我發現,孩子們掛在進程表在不間斷狀態:
682 16658 100 dumpdeco dumpdeco ? 0:27.62 0.0 1.8 D perl /root/runObjectBrowserJobs.pl
1453 16658 100 dumpdeco dumpdeco ? 0:13.34 0.0 1.5 D perl /root/runObjectBrowserJobs.pl
1458 16658 100 dumpdeco dumpdeco ? 0:12.42 0.0 1.5 D perl /root/runObjectBrowserJobs.pl
1467 16658 100 dumpdeco dumpdeco ? 0:13.35 2.9 1.8 D perl /root/runObjectBrowserJobs.pl
1474 16658 100 dumpdeco dumpdeco ? 0:14.31 0.0 2.1 D perl /root/runObjectBrowserJobs.pl
1479 16658 100 dumpdeco dumpdeco ? 0:13.73 0.0 2.1 D perl /root/runObjectBrowserJobs.pl
1496 16658 100 dumpdeco dumpdeco ? 0:13.97 0.0 2.0 D perl /root/runObjectBrowserJobs.pl
1499 16658 100 dumpdeco dumpdeco ? 0:13.93 0.0 2.2 D perl /root/runObjectBrowserJobs.pl
1501 16658 100 dumpdeco dumpdeco ? 0:14.47 0.0 1.4 D perl /root/runObjectBrowserJobs.pl
1503 16658 100 dumpdeco dumpdeco ? 0:14.86 2.0 2.2 D perl /root/runObjectBrowserJobs.pl
1505 16658 100 dumpdeco dumpdeco ? 0:13.88 1.0 2.0 D perl /root/runObjectBrowserJobs.pl
1520 16658 100 dumpdeco dumpdeco ? 0:14.39 0.0 1.5 D perl /root/runObjectBrowserJobs.pl
1522 16658 100 dumpdeco dumpdeco ? 0:14.12 1.0 1.8 D perl /root/runObjectBrowserJobs.pl
1531 16658 100 dumpdeco dumpdeco ? 0:16.45 0.0 1.7 D perl /root/runObjectBrowserJobs.pl
3619 16658 100 dumpdeco dumpdeco ? 2:03.59 0.0 4.5 D perl /root/runObjectBrowserJobs.pl
我從我的記錄知道孩子們已完成了分配給他們的工作。他們已記錄此信息,並且已將作業從待處理隊列中刪除。所以,從代碼檢查來看,他們沒有什麼可以做的,只是退出。
這似乎是一個新現象。這是一段老的代碼,我已經完成了殭屍進程的舞蹈,所以我很確定這不是收穫不正確的問題。
我想弄清楚的是如何找出這些過程掛在什麼。我試過strace
,但它不返回任何內容。說實話,這並不意外,因爲這個過程(我的猜測)並不是,實際上除了睡覺之外不做任何其他事情,等待一些系統調用返回。
所以,我在想:
- 有沒有一種方法來打印一個正在運行的進程的當前調用堆棧?
- 有沒有辦法在轉儲時轉儲進程並查看其調用堆棧?
- 關於我應該尋找什麼的任何建議?我正在考慮一個破損的存儲驅動程序(最近我們的存儲設備還有其他問題),但指責驅動程序總是對我來說似乎是一個懶惰的選擇。
什麼操作系統? – Nemo
我會看看存儲的東西。狀態D的進程通常表明他們正在等待IO。由於這些過程本身沒有任何進展(IO是核心土地),strace將不會顯示任何東西。 – Friek