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