0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

new ArrayList不當(dāng)導(dǎo)致CPU飆升

jf_ro2CN3Fa ? 來(lái)源:芋道源碼 ? 2023-08-15 14:56 ? 次閱讀

天線上容器突然cpu飆升,也是第一次排查這種問(wèn)題所以記錄一下~

前言

首先問(wèn)題是這樣的,周五正在寫文檔,突然收到了線上報(bào)警,發(fā)現(xiàn)cpu占用達(dá)到了90多,上平臺(tái)監(jiān)控系統(tǒng)查看容器,在jvm監(jiān)控中發(fā)現(xiàn)有一個(gè)pod在兩個(gè)小時(shí)內(nèi)產(chǎn)生了61次youngGc一次fullGc,這個(gè)問(wèn)題特別嚴(yán)重且少見,由于我之前也沒有排查過(guò)此類問(wèn)題,所以也是百度,但整個(gè)過(guò)程也有一些自己的思考,所以跟大家分享一下~

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

當(dāng)時(shí)場(chǎng)景

我先給大家看一下一副正常的gc曲線監(jiān)控(為保密性,我自己按照平臺(tái)監(jiān)控畫了出來(lái)):

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

正常的jvm監(jiān)控曲線圖

586b3368-3b2f-11ee-9e74-dac502259ad0.jpg正常的jvm監(jiān)控曲線圖

產(chǎn)生問(wèn)題的jvm監(jiān)控曲線圖

5887183a-3b2f-11ee-9e74-dac502259ad0.jpg產(chǎn)生問(wèn)題的jvm監(jiān)控曲線圖

可以看的出來(lái),正常情況下該系統(tǒng)很少gc(具體看業(yè)務(wù)系統(tǒng)使用情況、jvm內(nèi)存分配),但是在圖二中出現(xiàn)了大量異常的gc情況甚至觸發(fā)了fullGc,所以我當(dāng)時(shí)立馬進(jìn)行了分析。

具體分析

首先異常gc的情況只出現(xiàn)在一個(gè)pod上(系統(tǒng)有多個(gè)pod),在監(jiān)控系統(tǒng)找到對(duì)應(yīng)的pod,進(jìn)入pod內(nèi)部查看問(wèn)題原因,排查問(wèn)題一定要冷靜

  1. 進(jìn)入pod之后,輸入top查看各linux進(jìn)程對(duì)系統(tǒng)資源的使用情況(因我這是事后補(bǔ)稿,資源使用不高,大家看步驟即可)
58a4cdf8-3b2f-11ee-9e74-dac502259ad0.jpg
  1. 分析資源使用情況在當(dāng)時(shí)的情況下
58ab49da-3b2f-11ee-9e74-dac502259ad0.jpgtop

當(dāng)時(shí)我的pid為1的進(jìn)程cpu上到了130(多核)那我認(rèn)定就是java應(yīng)用出問(wèn)題了,control+c退出繼續(xù)往下走

  1. 輸入top -H -p pid 通過(guò)此命令可以查看實(shí)際占用CPU最高的的線程的id,pid為剛才資源使用高的pid號(hào)
58b9e2c4-3b2f-11ee-9e74-dac502259ad0.jpgtop -H -p pid
  1. 出現(xiàn)具體線程的資源使用情況,表格里的pid代表線程的id,我們稱他為tid
58ce3a30-3b2f-11ee-9e74-dac502259ad0.jpgtid
  1. 我記得當(dāng)時(shí)的tip為746(上述圖片只是我給大家重復(fù)步驟),使用命令printf "%x " 746,將線程tid轉(zhuǎn)換為16進(jìn)制
58e9a892-3b2f-11ee-9e74-dac502259ad0.jpgtid轉(zhuǎn)換為16進(jìn)制

因?yàn)槲覀兙€程id號(hào)在堆棧里是16進(jìn)制的所以需要做一個(gè)進(jìn)制轉(zhuǎn)換

  1. 輸入jstack pid | grep 2ea >gc.stack
jstackpid|grep2ea>gc.stack
59038000-3b2f-11ee-9e74-dac502259ad0.jpgjstack

解釋一下,jstack是jdk給提供的監(jiān)控調(diào)優(yōu)小工具之一,jstack會(huì)生成JVM當(dāng)前時(shí)刻的線程快照,然后我們可以通過(guò)它查看某個(gè)Java進(jìn)程內(nèi)的線程堆棧信息,之后我們把堆棧信息通過(guò)管道收集2ea線程的信息,然后將信息生成為gc.stack文件,我隨便起的,隨意

  1. 當(dāng)時(shí)我先cat gc.stack 發(fā)現(xiàn)數(shù)據(jù)有點(diǎn)多在容器里看不方便,于是我下載到本地瀏覽,因?yàn)?a target="_blank">公司對(duì)各個(gè)機(jī)器的訪問(wèn)做了限制,我只能用跳板機(jī)先找到一臺(tái)沒用的機(jī)器a,把文件下載到a然后我再把a(bǔ)里的文件下載到本地(本地訪問(wèn)跳板機(jī)OK),先輸入python -m SimpleHTTPServer 8080,linux自帶python,這個(gè)是開啟一個(gè)簡(jiǎn)單http服務(wù)供外界訪問(wèn)
590a29e6-3b2f-11ee-9e74-dac502259ad0.jpg開啟http服務(wù)

然后登錄跳板機(jī),使用curl下載curl -o http://ip地址/gcInfo.stack

為方便演示,我在圖中把ip換了一個(gè)假的

59108016-3b2f-11ee-9e74-dac502259ad0.jpgcurl

之后用同樣的方法從本地下載跳板機(jī)就可以了,記得關(guān)閉python開啟的建議服務(wù)嗷

  1. 把文件下載到了本地,打開查看編輯器搜索2ea,找到nid為2ea的堆棧信息
59223130-3b2f-11ee-9e74-dac502259ad0.jpg找到nid為2ea的堆棧信息

之后找到對(duì)應(yīng)的impl根據(jù)行數(shù)分析程序

  1. 發(fā)現(xiàn)是在文件異步導(dǎo)出excel的時(shí)候,導(dǎo)出接口使用了公共列表查詢接口,列表接口查詢數(shù)據(jù)最多為分頁(yè)200一批,而導(dǎo)出數(shù)據(jù)量每個(gè)人的權(quán)限幾萬(wàn)到十幾萬(wàn)不等
593f284e-3b2f-11ee-9e74-dac502259ad0.jpg導(dǎo)出excel

并且該判斷方法使用了嵌套循環(huán)里判斷,且結(jié)合業(yè)務(wù)很容易 get 不到 value,Java 下的new ArrayList 就是返回一個(gè) List 集合(好像不用說(shuō)這么細(xì) (;一_一 ),在整個(gè)方法結(jié)束之前,產(chǎn)生的 lists生命周期還在所以發(fā)生多次gc觸發(fā)重啟之后還影響到了別的pod。然后對(duì)代碼進(jìn)行了fix,緊急上線,問(wèn)題解決~

結(jié)束語(yǔ)

遇到生產(chǎn)問(wèn)題,大家不要害怕,遇到問(wèn)題先保證服務(wù)是否可用,然后通過(guò)有限的信息層層解析,找出最終的問(wèn)題。如果你會(huì) arthas,排查起來(lái)會(huì)更輕松!


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10772

    瀏覽量

    210441
  • 編輯器
    +關(guān)注

    關(guān)注

    1

    文章

    798

    瀏覽量

    31011
  • 進(jìn)程
    +關(guān)注

    關(guān)注

    0

    文章

    200

    瀏覽量

    13933

原文標(biāo)題:new ArrayList 不當(dāng)導(dǎo)致 CPU 飆升。。

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    OpenHarmony語(yǔ)言基礎(chǔ)類庫(kù)【@ohos.util.ArrayList (線性容器ArrayList)】

    ArrayList是一種線性數(shù)據(jù)結(jié)構(gòu),底層基于數(shù)組實(shí)現(xiàn)。ArrayList會(huì)根據(jù)實(shí)際需要?jiǎng)討B(tài)調(diào)整容量,每次擴(kuò)容增加50%。
    的頭像 發(fā)表于 04-25 18:48 ?568次閱讀
    OpenHarmony語(yǔ)言基礎(chǔ)類庫(kù)【@ohos.util.<b class='flag-5'>ArrayList</b> (線性容器<b class='flag-5'>ArrayList</b>)】

    用C語(yǔ)言實(shí)現(xiàn)ArrayList,動(dòng)態(tài)增加數(shù)組及改變數(shù)組大小(可以打包存儲(chǔ),并恢復(fù))

    移植到其他平臺(tái)。簡(jiǎn)單的增加字符串例子:ArrayList *tmep = NULL;ArrayList *object = new_array_list(NULL,"
    發(fā)表于 02-28 12:33

    為什么f_mount后CPU使用率飆升10%?

    江湖救急:我用SD卡來(lái)導(dǎo)出運(yùn)行過(guò)程中的一些數(shù)據(jù),起了一個(gè)dump_output_task來(lái)負(fù)責(zé)dump,初始化時(shí)時(shí)f_mount了一把SD卡(返回值0),后面不做任何跟SD卡相關(guān)的讀寫操作,CPU使用率也直接飆升10%,求助。。。運(yùn)行環(huán)境:UCOS-III
    發(fā)表于 10-27 23:34

    ArrayList的get/get如何操作?

    ArrayList的特點(diǎn)是什么ArrayList的get操作ArrayList的add操作
    發(fā)表于 11-09 06:43

    如何解決STM32串口溢出錯(cuò)誤Overrun使用不當(dāng)導(dǎo)致的串口死機(jī)?

    如何解決STM32串口溢出錯(cuò)誤Overrun使用不當(dāng)導(dǎo)致的串口死機(jī)?
    發(fā)表于 12-15 07:29

    FlexSPI復(fù)位方式不當(dāng)會(huì)導(dǎo)致i.MXRT系列下OTFAD加密啟動(dòng)失敗怎么解決?

    FlexSPI復(fù)位方式不當(dāng)會(huì)導(dǎo)致i.MXRT系列下OTFAD加密啟動(dòng)失敗怎么解決?
    發(fā)表于 02-07 08:11

    【學(xué)習(xí)打卡】OpenHarmony的ArrayList介紹

    在底層的集合允許我們?cè)贚ist 接口的幫助下插入和刪除元素。List 接口是一個(gè)有序的對(duì)象集合,允許存儲(chǔ)重復(fù)值。 ArrayList是OpenHarmony中實(shí)現(xiàn)List接口特性的類,具有結(jié)構(gòu)
    發(fā)表于 07-27 21:51

    OpenHarmony應(yīng)用示例:線性容器 ArrayList

    簡(jiǎn)介本示例通過(guò)線性容器 ArrayList 模擬了添加刪除聯(lián)系人的操作,展示了 ArrayList 相關(guān)的接口功能。效果圖如下:相關(guān)概念線性容器ArrayListArrayList
    發(fā)表于 08-15 14:31

    PCB Layout不當(dāng)引起CPU工作不穩(wěn)定的解決方法

    在高速數(shù)字電路中,CPU的功耗往往隨著主頻的提升而增大,如果PCB Layout不當(dāng),則可能會(huì)引起CPU工作不穩(wěn)定,本人就曾經(jīng)遇到過(guò)。Marvell 88F6282 CPU運(yùn)行在2GH
    發(fā)表于 06-01 09:15 ?2218次閱讀

    螺桿支撐座安裝不當(dāng)會(huì)導(dǎo)致哪些問(wèn)題發(fā)生?

    螺桿支撐座是精密傳動(dòng)元件,在機(jī)械工業(yè)中起著很重要的作用,螺桿支撐座在使用過(guò)程中或多或少都會(huì)有需要注意的問(wèn)題,如果這些問(wèn)題處理不當(dāng),往往會(huì)導(dǎo)致機(jī)械運(yùn)行中的一系列故障。
    的頭像 發(fā)表于 03-04 17:41 ?537次閱讀
    螺桿支撐座安裝<b class='flag-5'>不當(dāng)</b>會(huì)<b class='flag-5'>導(dǎo)致</b>哪些問(wèn)題發(fā)生?

    JDK中java.util.ArrayList 類的介紹

    1、ArrayList 定義 ArrayList 是一個(gè)用數(shù)組實(shí)現(xiàn)的集合,支持隨機(jī)訪問(wèn),元素有序且可以重復(fù)。 public class ArrayList E > extends
    的頭像 發(fā)表于 10-10 15:51 ?603次閱讀
    JDK中java.util.<b class='flag-5'>ArrayList</b> 類的介紹

    ArrayList入門實(shí)踐

    構(gòu)造函數(shù) ArrayList 有三個(gè)構(gòu)造函數(shù),默認(rèn)不帶參數(shù)的構(gòu)造函數(shù)就是初始化一個(gè)空數(shù)組。 //一個(gè)空數(shù)組 private static final Object
    的頭像 發(fā)表于 10-10 16:36 ?337次閱讀
    <b class='flag-5'>ArrayList</b>入門實(shí)踐

    cpu溫度太高怎么解決?cpu溫度高的原因?

    如何解決這一問(wèn)題。 一、CPU溫度過(guò)高的原因 1. 散熱系統(tǒng)不當(dāng):服務(wù)器或臺(tái)式機(jī)的散熱系統(tǒng)設(shè)計(jì)可能不夠完善,或者由于久經(jīng)使用而積灰、質(zhì)量下降等問(wèn)題。CPU散熱器可能被堵塞,導(dǎo)致熱量無(wú)法
    的頭像 發(fā)表于 12-09 16:15 ?2732次閱讀

    鴻蒙語(yǔ)言基礎(chǔ)類庫(kù):ohos.util.ArrayList 線性容器ArrayList

    ArrayList是一種線性數(shù)據(jù)結(jié)構(gòu),底層基于數(shù)組實(shí)現(xiàn)。ArrayList會(huì)根據(jù)實(shí)際需要?jiǎng)討B(tài)調(diào)整容量,每次擴(kuò)容增加50%。
    的頭像 發(fā)表于 07-10 09:37 ?159次閱讀
    鴻蒙語(yǔ)言基礎(chǔ)類庫(kù):ohos.util.<b class='flag-5'>ArrayList</b> 線性容器<b class='flag-5'>ArrayList</b>

    主板cpu故障燈常亮是什么原因

    2.1 硬件問(wèn)題 CPU安裝不當(dāng) :如果CPU沒有正確安裝,或者安裝時(shí)損壞了針腳,可能會(huì)導(dǎo)致故障燈亮起。 過(guò)熱問(wèn)題 :CPU過(guò)熱可能
    的頭像 發(fā)表于 09-02 14:43 ?1786次閱讀