生產環境部署springcloud微服務啟動慢的問題排查


今天帶來一個真實案例,雖然不是什么故障,但是希望對大家有所幫助。

 

一、問題現象:

生產環境部署springcloud應用,服務部署之后,有時候需要10幾分鍾才能啟動成功,在開發測試環境則沒有這個問題。最開始是所有微服務都有這種情況,隨着項目周期的進行,zwfw微服務的問題最為突出,每次部署后,需要大概6分鍾才能啟動,在這6分鍾期間,程序沒有任何日志,控制台沒有任何輸出。每次部署都會觸發服務不可用的報警。如下:

 

注:報警是連續2分鍾不可用才開始發送。

 

二、問題分析過程

起初懷疑是公司使用的加解密工具Virbox Protector導致的,公司加密程序Virbox Protector畢竟對線上的java可執行程序和待發布的jar包都進行了修改,並且在程序啟動前,java首先要對jar包進行解密,勢必會造成程序的性能造成影響。但是加密組本着“其他組都沒有反饋這個問題,就你們組有問題”的態度,直接將問題踢了回來,導致問題久久不能認真對待。

2021年9月9日研發人員反饋另外一個微服務,也出現了這種啟動慢或者無法啟動的問題,問題被再次提出。這次,我決定再重新觀察一下這個問題,最起碼要找出是加密工具惹禍的證據。

因為zwfw這個服務能穩定復現,所以就拿這個服務進行分析。

2.1 zwfw這個微服務

首先介紹一下zwfw這個服務的背景,這個服務部署在華為雲主機上,不具備訪問互聯網的網絡權限。

2.2 jstack工具介紹

如果你想知道,當前時間,java都在執行哪些任務,那么就可以使用jstack來觀察。jstack,jmap,jstats都是java生態中非常重要的工具,並且是jvm自帶的命令。使用jstack 進程號,就能列出這個java進程所有的線程,及線程正在執行的方法棧,默認是將線程棧打印在當前控制台。jstack還可以和操作系統命令top聯合使用排查CPU占用高的問題。

2.3 排查過程

分析問題之前,首先將這個服務從nacos上面踢下來,防止在調試期間被前端機器調用(因為是直接在生產環境調試)。

然后將zwfw的進程kill掉,再手工使用命令啟動服務。打出執行命令后,日志文件中的日志開始中斷。

然后執行jstack 進程號,打印出來堆棧,結果真是出乎意料,其中主線程的方法棧如下:

 

 

比較奇怪,還真是阻塞在項目代碼上面。這個問題,之前也有人遇到過,如:https://www.javacodegeeks.com/2015/03/inetaddressimpllookupallhostaddr-slowhangs.html

因為之前做項目,碰到過多次沒有配置hostname導致的dns超時的問題(比如說hession調用),所以根據我的經驗,這個只需要修改一下host文件就能解決。

所以就對本機的hostname增加ip的解析。因為怕應用依賴hostname對應的IP,所以hostname對應的ip,要配置成局域網的真實ip。修改host配置后,問題解決,zwfw啟動縮短為正常的10秒以內。

 

三、解決方法

既然是因為解析hostname導致,那最快的解決方法就是增加hostname的解析。也不知道log4j2,為什么必須要這樣做。

1、首先查看本機的hostname,輸入hostname命令。

2、查看本機的ip和ipv6地址,使用ifconfig命令。

3、編輯/etc/hosts文件,增加hostname的解析,問題解決

 

四、問題回顧和總結

團隊之間互相踢皮球不配合導致這個問題持續的時間比較長。我一開始一直認為是公司對java程序進行了修改導致的,導致沒有嘗試排查問題,所以,以后遇到問題,不要輕易懷疑很成熟的基礎組件。

 

 其實很多生產環境的故障,我們都可以避免。下面是我在互聯網系統中總結的一些其他案例,如需自取

 做支付遇到httpclient的大坑

 記一次自動恢復的故障

 

如果你想得有關我的更一手的更新,請關注

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM