定时任务卡死问题排查
背景描述:使用quartz建立多個定時任務(wù),每5分鐘執(zhí)行一次。定時任務(wù)中包含httpclient的網(wǎng)絡(luò)訪問,及druid的數(shù)據(jù)庫訪問。執(zhí)行一段時間后不定期(可能10天半個月,可能好幾個月)卡死。
表現(xiàn)狀況為:
日志到某個時間點突然沒有輸出了,也沒有異常日志記錄,排除當(dāng)時磁盤空間不足的問題
httpclient使用的4.3版本,出問題的生成環(huán)境下已在request中設(shè)置3種超時時間。實際測試中除了setConnectTimeout與setConnectionRequestTimeout即使不設(shè)置,程序也會拋出超時異常。只有當(dāng)setSocketTimeout不設(shè)置的時候,程序會出現(xiàn)日志不打印一直卡死的狀況,但與我要解決的問題來看還是有略微區(qū)別。當(dāng)時的內(nèi)存狀況不一致。(圖1為生產(chǎn)環(huán)境上卡死時的內(nèi)存,圖2為本機測試時,故意不設(shè)置setSocketTimeout超時情況下的內(nèi)存圖 )
(圖1)(圖2)
生成環(huán)境下設(shè)置了數(shù)據(jù)庫超時,本機測試時暫時還沒有測試數(shù)據(jù)庫超時的情況。
下次生成環(huán)境上再發(fā)生此類狀況的排查步驟:
本機打開jdk安裝目錄下的visualVM查看線程執(zhí)行情況,正常定時任務(wù)執(zhí)行時線程應(yīng)該是如下圖的少量runnalbe,如圖1所示,但是本機測試時,故意讓服務(wù)器端下斷點不返回信息,在客戶端的httpclient中不設(shè)置setConnectTimeout超時時間,最終顯示的線程圖樣是一直runnalbe的,因此下次在生產(chǎn)環(huán)境下出現(xiàn)這個問題時,可以查看線程中,該線程是否一直是runnalbe狀態(tài)如圖2所示
(圖1) (圖2)
使用jstack查看當(dāng)時的業(yè)務(wù)定時任務(wù)線程中具體代碼。打開步驟,找到程序?qū)?yīng)的pid,然后使用命令jstack 程序pid的方式查看線程狀態(tài)(圖1)。 使用jstack的原因是這個可以看到具體代碼,如圖2
(圖1)(圖2)
今天又發(fā)生了一次,排查懷疑是數(shù)據(jù)庫連接未釋放造成的。
(發(fā)生問題的機器上,線程圖。從中可以看到執(zhí)行定時job的線程pool-3-thread-1一直在運行,類似于之前在本地機器上模擬的httpclient未設(shè)置響應(yīng)時間的狀態(tài))
(發(fā)生問題的機器上,內(nèi)存圖)
總結(jié)
以上是生活随笔為你收集整理的定时任务卡死问题排查的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Sql Server系列:排序函数
- 下一篇: 威胁检测及威胁狩猎的工具、资源大合集