記一次springboot服務凌晨無故宕機問題的解決
表述
在一次服務更新後發現每天凌晨0點3秒服務準時掛,開始的時候認為是maven依賴中存在system.exit(3)類似這樣的程式碼,但是我想了下這個程式碼很多客戶都有用到但是隻有這一個客戶出現了問題,而且另外一個服務沒有更新在此前幾個月都是沒問題的 這幾天也是一樣無故掛了。
環境
windows伺服器
排查
1、初步懷疑是記憶體洩漏問題,在啟動指令碼中加入 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\heapdump.log,第二天起來一看還是掛了沒有出現dump日誌說明不是記憶體洩漏
2、白天幾千幾萬的請求量都沒有掛,凌晨時候星星兩兩的請求量甚至沒有請求卻掛了
3、服務準時0點3秒掛,後續我寫了個指令碼加入執行計劃每日凌晨1點檢查服務並啟動,發現有寫指令碼的服務還是0點3秒掛而另外一個服務變成1點10幾分左右掛了
4、有懷疑可能是logback的問題,日誌生成規則是按日期備份的,可是每個客戶都是這樣的配置就這個客戶有問題所以暫時排除這個可能了
臨時解決
1、暫時給幾個服務的啟動指令碼加入到執行計劃中每日凌晨檢查並啟動,沒有找到好的解決方案也不知道是什麼問題,希望知道的大佬告知一下感激不盡。
附上執行計劃檢查指令碼
@echo off
echo 正在檢測啟動服務…請不要關閉該視窗
D:
cd “D:\寫上服務的目錄”
:ks
set num=0
for /f %%i in (‘netstat -ano^| find “:服務的埠”') do set /a num=%num%+1echo %num%
if %num% == 0 (
echo “開始啟動服務”
call D:\aaa.bat
) else (
echo “無需啟動服務”
)
其中D:\aaa.bat 是服務的啟動指令碼 這裡也可以直接寫上java -jar springboot服務.jar類似這樣的程式碼
最終解決
經昨晚12點時候錄屏伺服器後看後終於找到了問題所在,控制檯沒有絲毫的報錯資訊直接程式崩潰,這就是windows伺服器的不足之處,如果此時伺服器是Linux的話 會在專案目錄底下記錄崩潰的Jvm日誌。思考之後發現果真竟然是logback的鍋,找到原因:
1、因為logback配置中沒有加入maxFileSize的配置,導致日誌檔案大小有幾個G
2、伺服器本身效能配置一般
3、logback採用的是zip壓縮按日備份的
4、壓縮檔案是很耗CPU的,檔案越大CPU佔用越多,如果檔案很大就會導致壓縮到一半程式崩潰,這裡就是出現了這種情況導致壓縮到一半沒成功,tmp臨時檔案也沒有被刪除
5、沒有出現該問題的幾個客戶是因為日誌檔案都沒有達到這種級別的量,其次其他幾個客戶的伺服器效能都是很OK的
解決方法就是在加入maxFileSize配置 建議值是128M。值越大對伺服器的效能要求就越高,我這邊因為伺服器效能一般保險起見設定128M
補充知識:Springboot啟動即掛掉問題
提示說明埠8080被佔用
將埠改為其他埠號即可
以上這篇記一次springboot服務凌晨無故宕機問題的解決就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。