不知道為什么,窗外出現了烏雲,又不知道為什么,煩人的蟬鳴突然變得無聲了,大腦中的嘈雜瞬間歸位了寧靜,草他么,我的測試服務器又特么無緣無故的崩了。
作為菜鳥為了排查故障,最先想到的就是找日志,先后分析了項目啟動日志,resin啟動日志,jvm日志完全看不出來結果。
1.jvm日志顯示gc正常,內存沒有溢出。
2.resin進程在,啟動日志也沒有報錯。
3.項目日志有條警告,log4j和另外一個log包有類沖突,一般警告都是無視的,為了安全刪掉了無用的log包,重啟resin服務依舊不可用,請求也打不進來。
日志分析沒有結果,代碼重新編譯重部服務器依舊沒有響應,束手無策。只好去跪舔大神求助。
同事看了日志之后發現一個問題,resin並沒有真正的起來。
當時resin的stdout.log是這樣的:
正常啟動的時候應該會多打一句log如下:
[20:28:53.406] Resin started in 336646ms
說明resin在啟動的時候因為某種原因阻塞掉了。於是就用了jstack來分析線程當時的情況。
jstack 572781 > tmp
上圖是resin的主線程,在幾個時刻使用jstack查看主線程的狀態始終如此,說明主線程在這個方法上阻塞了。
稍微看了一下主線程的堆棧,原因肯定是涉及到ip和zookeeper,我才會回想起來,最近公司因為業務縮減,機房整理,以前的zk服務進行了遷移,
果然我找到項目中zk配置ping了一下原ip ping不通,之后把項目中zk配置改為了域名訪問,在hosts中設置了一個ip之后就ok了。
經歷過此次服務器宕機,學會了使用jstack來查找進程阻塞的原因,以及對java的線程轉儲有了進一步的了解。
還有個問題就是以前resin重部一次僅需要24s左右,如今需要3min,不知道是不是依然是zk配置的問題,有待進一步調查。
華麗的分割線:
jstack使用:
java線程轉儲: