昨天線上容器突然cpu飆升,也是第一次排查這種問題所以記錄一下~
前言
首先問題是這樣的,周五正在寫文檔,突然收到了線上報警,發現cpu占用達到了90多,上平臺監控系統查看容器,在jvm監控中發現有一個pod在兩個小時內產生了61次youngGc一次fullGc,這個問題特別嚴重且少見,由于我之前也沒有排查過此類問題,所以也是百度,但整個過程也有一些自己的思考,所以跟大家分享一下~
基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能
- 項目地址:https://github.com/YunaiV/ruoyi-vue-pro
- 視頻教程:https://doc.iocoder.cn/video/
當時場景
我先給大家看一下一副正常的gc曲線監控(為保密性,我自己按照平臺監控畫了出來):
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能
正常的jvm監控曲線圖
![586b3368-3b2f-11ee-9e74-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/A1/1E/wKgaomToRQyAUpzhAAB77RONP3o586.jpg)
產生問題的jvm監控曲線圖
![5887183a-3b2f-11ee-9e74-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/A1/1E/wKgaomToRQyANz2jAACnUyyadyk384.jpg)
可以看的出來,正常情況下該系統很少gc(具體看業務系統使用情況、jvm內存分配),但是在圖二中出現了大量異常的gc情況甚至觸發了fullGc,所以我當時立馬進行了分析。
具體分析
首先異常gc的情況只出現在一個pod上(系統有多個pod),在監控系統找到對應的pod,進入pod內部查看問題原因,排查問題一定要冷靜
- 進入pod之后,輸入top查看各linux進程對系統資源的使用情況(因我這是事后補稿,資源使用不高,大家看步驟即可)
![58a4cdf8-3b2f-11ee-9e74-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/A1/1E/wKgaomToRQyAGy3RAAAcVXyMFEY033.jpg)
- 分析資源使用情況在當時的情況下
![58ab49da-3b2f-11ee-9e74-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/A1/1E/wKgaomToRQyAIWF1AAD2dvqwVnI869.jpg)
當時我的pid為1的進程cpu上到了130(多核)那我認定就是java應用出問題了,control+c退出繼續往下走
- 輸入top -H -p pid 通過此命令可以查看實際占用CPU最高的的線程的id,pid為剛才資源使用高的pid號
![58b9e2c4-3b2f-11ee-9e74-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/A1/1E/wKgaomToRQyAa29zAAAbJMs2GLo851.jpg)
- 出現具體線程的資源使用情況,表格里的pid代表線程的id,我們稱他為tid
![58ce3a30-3b2f-11ee-9e74-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/A1/1E/wKgaomToRQyAHE7dAACJP8wd9sA157.jpg)
- 我記得當時的tip為746(上述圖片只是我給大家重復步驟),使用命令printf "%x " 746,將線程tid轉換為16進制
![58e9a892-3b2f-11ee-9e74-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/A1/1E/wKgaomToRQ2Ab-FRAAA0Ft6SXEk892.jpg)
因為我們線程id號在堆棧里是16進制的所以需要做一個進制轉換
- 輸入jstack pid | grep 2ea >gc.stack
jstackpid|grep2ea>gc.stack
![59038000-3b2f-11ee-9e74-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/A1/1E/wKgaomToRQ2ALF6gAAAtMdcfOf4893.jpg)
解釋一下,jstack是jdk給提供的監控調優小工具之一,jstack會生成JVM當前時刻的線程快照,然后我們可以通過它查看某個Java進程內的線程堆棧信息,之后我們把堆棧信息通過管道收集2ea線程的信息,然后將信息生成為gc.stack文件,我隨便起的,隨意
- 當時我先cat gc.stack 發現數據有點多在容器里看不方便,于是我下載到本地瀏覽,因為公司對各個機器的訪問做了限制,我只能用跳板機先找到一臺沒用的機器a,把文件下載到a然后我再把a里的文件下載到本地(本地訪問跳板機OK),先輸入python -m SimpleHTTPServer 8080,linux自帶python,這個是開啟一個簡單http服務供外界訪問
![590a29e6-3b2f-11ee-9e74-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/A1/1E/wKgaomToRQ2AdWvLAAA_P-wZUHc886.jpg)
然后登錄跳板機,使用curl下載curl -o http://ip地址/gcInfo.stack
為方便演示,我在圖中把ip換了一個假的
![59108016-3b2f-11ee-9e74-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/A1/1E/wKgaomToRQ2Ae97jAAAy4xPdlZw672.jpg)
之后用同樣的方法從本地下載跳板機就可以了,記得關閉python開啟的建議服務嗷
- 把文件下載到了本地,打開查看編輯器搜索2ea,找到nid為2ea的堆棧信息
![59223130-3b2f-11ee-9e74-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/A1/1E/wKgaomToRQ2AHXHwAAC-fzfFuf4749.jpg)
之后找到對應的impl根據行數分析程序
- 發現是在文件異步導出excel的時候,導出接口使用了公共列表查詢接口,列表接口查詢數據最多為分頁200一批,而導出數據量每個人的權限幾萬到十幾萬不等
![593f284e-3b2f-11ee-9e74-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/A1/1E/wKgaomToRQ2AOU_cAAA29LpZZmE497.jpg)
并且該判斷方法使用了嵌套循環里判斷,且結合業務很容易 get 不到 value,Java 下的new ArrayList 就是返回一個 List 集合(好像不用說這么細 (;一_一 ),在整個方法結束之前,產生的 lists生命周期還在所以發生多次gc觸發重啟之后還影響到了別的pod。然后對代碼進行了fix,緊急上線,問題解決~
結束語
遇到生產問題,大家不要害怕,遇到問題先保證服務是否可用,然后通過有限的信息層層解析,找出最終的問題。如果你會 arthas,排查起來會更輕松!
-
cpu
+關注
關注
68文章
10905瀏覽量
213032 -
編輯器
+關注
關注
1文章
806瀏覽量
31293 -
進程
+關注
關注
0文章
204瀏覽量
13996
原文標題:new ArrayList 不當導致 CPU 飆升。。
文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
OpenHarmony語言基礎類庫【@ohos.util.ArrayList (線性容器ArrayList)】
![OpenHarmony語言基礎類庫【@ohos.util.<b class='flag-5'>ArrayList</b> (線性容器<b class='flag-5'>ArrayList</b>)】](https://file1.elecfans.com/web2/M00/C5/CD/wKgZomYCdwyAIFf5AAB_7E1pFms943.jpg)
用C語言實現ArrayList,動態增加數組及改變數組大小(可以打包存儲,并恢復)
為什么f_mount后CPU使用率飆升10%?
【學習打卡】OpenHarmony的ArrayList介紹
OpenHarmony應用示例:線性容器 ArrayList
PCB Layout不當引起CPU工作不穩定的解決方法
螺桿支撐座安裝不當會導致哪些問題發生?
![螺桿支撐座安裝<b class='flag-5'>不當</b>會<b class='flag-5'>導致</b>哪些問題發生?](https://file.elecfans.com/web2/M00/96/06/pYYBAGQDEjqAQpmnAAC6CWWzwm0130.png)
JDK中java.util.ArrayList 類的介紹
![JDK中java.util.<b class='flag-5'>ArrayList</b> 類的介紹](https://file1.elecfans.com/web2/M00/A7/91/wKgaomUlAmaAESSsAADGG4TZENI116.jpg)
cpu溫度太高怎么解決?cpu溫度高的原因?
鴻蒙語言基礎類庫:ohos.util.ArrayList 線性容器ArrayList
![鴻蒙語言基礎類庫:ohos.util.<b class='flag-5'>ArrayList</b> 線性容器<b class='flag-5'>ArrayList</b>](https://file1.elecfans.com//web2/M00/FA/66/wKgZomaNNh6AMUdvAAACSiKnE8w332.jpg)
評論