cpu使用率過高和jvm old佔用過高排查過程

2022-02-03 每天曬白牙

收錄於話題 #技術分享 31個

今天斷斷續續的收到管理平臺的異常報警,cpu佔用過高和jvm old佔用過高,這個時候趕緊去排查原因,下面記錄了我的排查過程,可能裡面還有不正確的地方,歡迎各位大佬指正,也歡迎大家關於類似的案例一起交流,下面就看我關於這次排查的過程把


報警

cpu使用率過高報警,接近100%

後續又來了jvm old過高報警


排查過程

首先打開監控平臺看報警節點的cpu使用情況

登錄伺服器找到佔用 cpu過高線程堆棧信息

①通過 top 命令找到佔用cpu最高的 pid[進程id]  

定位到pid是 1469

②通過 top -Hp pid 查看進程中佔用cpu過高的 tid[線程id]

③通過 printf  '%x/n' tid 把線程id轉化為十六進位

④通過 jstack pid | grep tid -A 30 定位線程堆棧信息

佔用cpu過高的線程有兩個,其中一個是列印異常日誌的(會new 對象),還有gc線程


列印異常堆棧

這個佔用cpu根據堆棧信息就可以定位,看下代碼,可以發現new 對象,且列印全棧信息

其中ExceptionUtils.getFullStackTrace(e) 屬於commons.lang包

可以發現上面兩個方法會創建很多對象且列印堆棧信息佔用內存


gc線程

可以發現佔用cpu過高的線程進行大量的gc

通過 jstat -gcutil pid 時間間隔 查看 jc  信息

可以發現伊甸園區和老年代都已經滿了,且進行了大量的FGC

指標介紹

S0:年輕代第一個倖存區(survivor)使用容量佔用百分比

S1:年輕代第二個倖存區(survivor)使用容量佔用百分比

E:年輕代伊甸園區(eden)使用容量佔用百分比

O:老年代使用容量佔用百分比

P:perm代使用容量佔用百分比

YGC:從應用程式啟動到當前採樣時年輕代gc的次數

YGCT:從應用程式啟動到當前採樣時年輕代gc的時間

FGC:從應用程式啟動到當前採樣時老年代gc的次數

FGCT:從應用程式啟動到當前採樣時老年代gc的時間

GCT:從應用程式啟動到當前採樣時gc總耗時


導出dump文件,使用jdk自帶的jvisualvm.exe分析

使用 jmap -dump:format=b,file=name.dump pid 導出dump文件,一般dump文件會比較大【我的這個2.94G】,然後下載【可以用 sz name.dump】到本地用jvisualvm【jdk自帶的,在bin目錄下】分析

首先看下dump文件的概要

看看這些大對象都是什麼

發現前面幾個大對象都和 ElastaicSearchStatusException對象有關,然後這個管理平臺用到es的地方只有一處,就是做數據漏鬥,記錄廣告檢索在哪些步驟過濾掉,方便產品和運營查看廣告被過濾的原因,然後翻開代碼

其中 RestClientFactory.getRestClient().search(searchRequest)的 search方法一步一步跟進,發現拋ElasticSearchStatusException的地方

其中parseResponseException方法會拋出ElasticSearchStatusException異常,至於這兩個地方具體是哪個步驟拋的,可以繼續研究es代碼判斷或者 遠程debug判定,我這裡先不管了,反正我們能知道es出問題了

其實正是因為這裡拋異常才會導致創建大量對象,因為異常在上面提到的列印異常日誌的地方也會創建對象,老年代佔用過高,導致大量fgc

但es這裡為何會有異常?

我登錄到es的管理平臺查看es的索引,發現有的索引沒有創建,索引的創建是有任務去創建並實時寫入數據的,發現那個任務已經停了。


處理過程

找到相關的任務重新啟動,並找任務停止的原因,修復,並把丟失的索引創建並修複數據

在異常日誌列印那最好加入流控【用Guava.RateLimiter控制】


小結cpu佔用過高排查思路

top 查看佔用cpu的進程 pid

top -Hp pid 查看進程中佔用cpu過高的線程id  tid

printf '%x/n' tid 轉化為十六進位

jstack pid |grep tid的十六進位 -A 30 查看堆棧信息定位



jvm old區佔用過高排查思路

top查看佔用cpu高的進程

jstat -gcutil pid 時間間隔 查看gc狀況

jmap -dump:format=b,file=name.dump pid  導出dump文件

用visualVM分析dump文件


之前寫過的兩篇關於jvm的文章

GC算法和垃圾收集器

內存分配與回收策略


相關焦點

  • JAVA應用-CPU使用率過高問題排查思路
    本次應用投產後,生產報告cpu使用率過高,經常100%:參考網上資料,經排查後解決。
  • win7出現物理內存佔用過高的問題
    有系統哥的小夥伴在使用win7 64位旗艦版系統的過程中,會出現電腦卡頓、死機的問題。而這種問題大多都是因為電腦系統物理內存佔用過高所導致的。為了解決這種問題我們可以嘗試在任務管理器中將多餘的進程關閉,或者是調整系統的虛擬內存即可。
  • Java中的CPU佔用高和內存佔用高的問題排查
    Java應用程式CPU和內存佔用過高的過程。如果是Java面試,這2個問題在面試過程中出現的概率很高,所以我打算在這裡好好總結一下。1、Java CPU過高的問題排查舉個例子,如下: package com.classloading;public class Test {    static class MyThread extends Thread {        public void run() { // 死循環,消耗CPU
  • 提示CPU使用率過高?當心你的電腦淪為挖礦木馬的工具!
    前言最近幾天不斷收到系統的報警信息,提示CPU利用率過高
  • JVM線上問題排查思路小結
    前言本文總結了一些常見的線上應急現象和對應排查步驟和工具。分享的主要目的是想讓對線上問題接觸少的同學有個預先認知,免得在遇到實際問題時手忙腳亂。畢竟作者自己也是從手忙腳亂時走過來的。只不過這裡先提示一下。
  • 《怪物獵人世界冰原》PC版CPU佔用過高問題修復補丁即將上線
    導 讀 在PC版《怪物獵人世界》冰原DLC上線後,眾家向官方反應遊戲CPU佔用過高,音畫不同步,載入卡死等問題
  • 如何在.NET應用程式中分析CPU使用率過高的問題
    他是經過認證的.NET和Java開發人員。在過去的幾年中,他還熱衷於使用Node.js,MongoDB和Erlang。原文來自:https://www.toptal.com/dot-net/hunting-high-cpu-usage-in-dot-net軟體開發可能是一個非常複雜的過程。作為開發人員,我們需要考慮很多不同的變量。
  • 如何預防磁碟使用率過高?
    與磁碟已用空間百分比不同,磁碟使用率是指在硬碟驅動器和RAM之間進行數據傳輸的最大速度(以kB / sec為單位)的百分比。通常,伺服器的磁碟使用率保持在10%到20%,但是有時候在伺服器繁忙的情況下,磁碟使用率可能高達100%,而長時間的100%磁碟使用率會導致很多錯誤,這些錯誤會嚴重影響到伺服器的性能,例如處理緩慢、應用程式凍結或系統無響應。
  • 面試官:線上伺服器CPU佔用率高如何排查定位問題?
    解決問題的能力以超高比例排名第一,這也是為什麼很多面試過程中,面試官都喜歡問如下問題:1、你這個項目遇到的最大挑戰是什麼?如何解決的? 2、如果線上發生了報警你回如何排查呢? 3、你有解決過什麼線上問題嗎? 4、能列舉幾個你知道的排查Linux伺服器線上問題的命令嗎?
  • node故障排查從原理到實操-分析cpu耗時瓶頸
    作為一個獨立的node進程,我們在做故障排查的時候需要注意一個是內存,還有一個就是cpu。
  • JVM、GC 大串講,面試夠用了
    調優的目的根據需求進行jvm規劃和預調優優化jvm運行環境(慢、卡頓)解決jvm運行過程中出現的各種問題(OOM),面試主要問這個。調優,從規劃開始從業務場景開始,沒有業務場景的調優就是耍流氓無監控(壓力測試、能看到結果),不調優。
  • Java 應用線上問題排查思路、工具小結
    在線上應急過程中要記住,只有一個總體目標:「儘快恢復服務,消除影響」。不管處於應急的哪個階段,我們首先必須想到的是恢復問題,恢復問題不一定能夠定位問題,也不一定有完美的解決方案,也許是通過經驗判斷,也許是預設開關等,但都可能讓我們達到快速恢復的目的,然後保留部分現場,再去定位問題、解決問題和復盤。好,現在讓我們進入正題吧。
  • 關於java單線程經常佔用cpu 100%的分析
    背景:這個是在centos7 + lxcfs 和jdk11 的環境上復現的。下面列一下我們是怎麼排查並解這個問題。  一、故障現象OPPO內核團隊接到jvm的兄弟甘兄發來的一個案例,現象是java的熱點一直是如下函數,佔比很高。
  • JVM性能調優
    程序在上線前的測試或運行中有時會出現一些大大小小的JVM問題,比如cpu load過高、請求延遲、tps降低等,甚至出現內存洩漏(每次垃圾收集使用的時間越來越長,垃圾收集頻率越來越高,每次垃圾收集清理掉的垃圾數據越來越少)、內存溢出導致系統崩潰,因此需要對JVM進行調優,使得程序在正常運行的前提下,獲得更高的用戶體驗和運行效率。
  • JVM性能調優實踐
    程序在上線前的測試或運行中有時會出現一些大大小小的JVM問題,比如cpu load過高、請求延遲、tps降低等,甚至出現內存洩漏(每次垃圾收集使用的時間越來越長,垃圾收集頻率越來越高,每次垃圾收集清理掉的垃圾數據越來越少)、內存溢出導致系統崩潰,因此需要對JVM進行調優,使得程序在正常運行的前提下,獲得更高的用戶體驗和運行效率。
  • 聊聊 top 命令中的 CPU 使用率
    sy:system time,表示 CPU 在內核運行的時間,包括 IRQ 和 softirq。系統 CPU 佔用越高,表明系統某部分存在瓶頸。通常這個值越低越好。ni:nice time,具有優先級的用戶進程執行時佔用的 CPU 利用率百分比。id:idle time,表示系統處於空閒期,等待進程運行。wa:waiting time,表示 CPU 在等待 IO 操作完成所花費的時間。
  • 交換機CPU使用率高問題定位
    診斷工具display cpu-usage [ slot x ]display cpu-defend statistics對於報文衝擊導致CPU高的情形,可進一步通過cpu-defend報文衝擊導致的CPU使用率高問題定位思路最常見協議衝擊CPU致使用率高主要表現在bcmRX、FTS、SOCK等任務上。
  • 抽絲剝繭定位Windows客戶端CPU佔用問題
    本文主要展示了從電腦管家CPU佔用過高問題發現到解決的全過程。包括分析問題的思路、解決問題的方法、壓力測試的設計、優化前後數據對比等。
  • CPU佔用過高,電腦卡?教你5種方法徹底解決CPU使用率過高問題 | 科技搜
    很多筆記本用戶在升級到Windows 10後,都遇到了這樣一個問題,發現每次開機後,電腦明明沒有運行什麼程序,但是CPU佔用率卻一直居高不下,導致CPU佔用100%的罪魁禍首是什麼呢?接下來將一些解決方法分享給大家。一.禁用Win10家庭組服務首先win+R 打開運行窗口,輸入命令services.msc,然後點擊確定按鈕。
  • 筆記本電腦cpu溫度過高怎麼辦
    這種情況顯然是由CPU溫度過高造成的,那麼CPU溫度過高呢?如何處理高CPU溫度?方法一、清洗CPU冷卻風扇1. 如何處理CPU溫度過高?最簡單有效的省錢方法就是自己用刷子和老虎清潔CPU散熱風扇。我們只用的工具是毛刷和皮老虎。這將顯著提高散熱器的散熱性能,降低噪聲。對於每一張板卡的清洗情況,我們應該始終有一個小刷子和虎皮,半年左右的合理清洗。方法二:再塗上導熱矽脂1. 有時CPU冷卻風扇清洗後,CPU溫度沒有明顯提高,需要重新給CPU塗導熱矽脂。導熱矽油的使用時間越長,其導熱性能越差,容易乾燥開裂。