定時任務卡死問題排查

背景描述:使用quartz建立多個定時任務,每5分鐘執行一次。定時任務中包含httpclient的網絡訪問,及druid的數據庫訪問。執行一段時間後不定期(可能10天半個月,可能好幾個月)卡死。
表現狀況爲:

  • 日誌到某個時間點突然沒有輸出了,也沒有異常日誌記錄,排除當時磁盤空間不足的問題
  • httpclient使用的4.3版本,出問題的生成環境下已在request中設置3種超時時間。實際測試中除了setConnectTimeout與setConnectionRequestTimeout即使不設置,程序也會拋出超時異常。只有當setSocketTimeout不設置的時候,程序會出現日誌不打印一直卡死的狀況,但與我要解決的問題來看還是有略微區別。當時的內存狀況不一致。(圖1爲生產環境上卡死時的內存,圖2爲本機測試時,故意不設置setSocketTimeout超時情況下的內存圖 )
    blob.jpg(圖1)blob.jpg(圖2)

  • 生成環境下設置了數據庫超時,本機測試時暫時還沒有測試數據庫超時的情況。

下次生成環境上再發生此類狀況的排查步驟:

  1. 本機打開jdk安裝目錄下的visualVM查看線程執行情況,正常定時任務執行時線程應該是如下圖的少量runnalbe,如圖1所示,但是本機測試時,故意讓服務器端下斷點不返回信息,在客戶端的httpclient中不設置setConnectTimeout超時時間,最終顯示的線程圖樣是一直runnalbe的,因此下次在生產環境下出現這個問題時,可以查看線程中,該線程是否一直是runnalbe狀態如圖2所示
    blob.jpg(圖1) blob.jpg(圖2)
  2. 使用jstack查看當時的業務定時任務線程中具體代碼。打開步驟,找到程序對應的pid,然後使用命令jstack 程序pid的方式查看線程狀態(圖1)。 使用jstack的原因是這個可以看到具體代碼,如圖2
    blob.jpg(圖1)blob.jpg(圖2)

今天又發生了一次,排查懷疑是數據庫連接未釋放造成的。

blob.jpg
(發生問題的機器上,線程圖。從中可以看到執行定時job的線程pool-3-thread-1一直在運行,類似於之前在本地機器上模擬的httpclient未設置響應時間的狀態)

blob.jpg
(發生問題的機器上,內存圖)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章