1. 程式人生 > >tomcat線上死迴圈的排查

tomcat線上死迴圈的排查

一段死迴圈造成的伺服器CUP高負載追溯

    事故緣由:
線上伺服器近期頻繁出現某節點停止服務情況,且出問題的伺服器不固定,當時檢查發現磁碟被tomcat日誌填滿,以為是被惡意刷流量,於是刪掉了日誌,重啟了服務解決,當第三次出現該問題時,我開始查詢原因。
    追溯步驟
tail -f日誌,發現大量查詢資料庫日誌不斷重新整理,但是又沒有具體業務程式碼暴露,考慮某處有死迴圈。
這裡寫圖片描述
top命令發現java程序佔用大量cpu:
這裡寫圖片描述

程序號為10864

top -p 10864 -H
這裡寫圖片描述

找到佔用cpu最多的幾個執行緒,分別是10867、10866、13595、13596

  1. jstack 10864 > stack.log,將佔用cpu較多的執行緒號轉為16進位制,在stack.log中查詢。
    這裡寫圖片描述

    10867、10866兩執行緒為gc執行緒
    進一步找,發現執行緒13595在為RUNABLE狀態,並且在呼叫資料庫,根據堆疊資訊,找到了父子關係查詢部分自己為自己的父級情況下造成死迴圈的程式碼。