開會時CPU 飆升100%同事們都手忙腳亂記一次應急處理過程

来源:https://www.cnblogs.com/MonsterJ/archive/2020/07/14/13301217.html
-Advertisement-
Play Games

告警 正在開會,突然釘釘告警聲響個不停,同時市場人員反饋客戶在投訴系統登不進了,報504錯誤。查看釘釘上的告警信息,幾台業務伺服器節點全部報CPU超過告警閾值,達100%。 趕緊從會上下來,SSH登錄伺服器,使用 top 命令查看,幾個Java進程CPU占用達到180%,190%,這幾個Java進程 ...


告警

正在開會,突然釘釘告警聲響個不停,同時市場人員反饋客戶在投訴系統登不進了,報504錯誤。查看釘釘上的告警信息,幾台業務伺服器節點全部報CPU超過告警閾值,達100%。

趕緊從會上下來,SSH登錄伺服器,使用 top 命令查看,幾個Java進程CPU占用達到180%,190%,這幾個Java進程對應同一個業務服務的幾個Pod(或容器)。

定位

  1. 使用 docker stats 命令查看本節點容器資源使用情況,對占用CPU很高的容器使用 docker exec -it <容器ID>bash 進入。
  2. 在容器內部執行 top 命令查看,定位到占用CPU高的進程ID,使用 top -Hp <進程ID> 定位到占用CPU高的線程ID。
  3. 使用 jstack <進程ID> > jstack.txt 將進程的線程棧列印輸出。
  4. 退出容器, 使用 docker cp <容器ID>:/usr/local/tomcat/jstack.txt ./ 命令將jstack文件複製到宿主機,便於查看。獲取到jstack信息後,趕緊重啟服務讓服務恢復可用。
    5.將2中占用CPU高的線程ID使用 pringf '%x\n' <線程ID> 命令將線程ID轉換為十六進位形式。假設線程ID為133,則得到十六進位85。在jstack.txt文件中定位到 nid=0x85的位置,該位置即為占用CPU高線程的執行棧信息。如下圖所示,

在這裡插入圖片描述

  1. 與同事確認,該處為使用一個框架的excel導出功能,並且,導出excel時沒有分頁,沒有限制!!!查看SQL查詢記錄,該導出功能一次導出50w條數據,並且每條數據都需要做轉換計算,更為糟糕的是,操作者因為導出時久久沒有響應,於是連續點擊,幾分鐘內發起了10多次的導出請求。。。於是,CPU被打滿,服務崩潰了,我也崩潰了。。

解決

對於此類耗資源的操作,一定要做好相應的限制。比如可以限制請求量,控制最大分頁大小,同時可以限制訪問頻率,比如同一用戶一分鐘內最多請求多少次。

再發

服務重啟後恢復。到了下午,又一臺伺服器節點CPU告警,依前面步驟定位到占用CPU高的線程,如下

"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007fa114020800 nid=0x10 runnable 

"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00007fa114022000 nid=0x11 runnable 

使用命令 jstat -gcutil <進程ID> 2000 10 查看GC情況,如圖

在這裡插入圖片描述

發現Full GC次數達到1000多次,且還在不斷增長,同時Eden區,Old區已經被占滿(也可使用jmap -heap <進程ID>查看堆記憶體各區的占用情況),使用jmap將記憶體使用情況dump出來,

jmap -dump:format=b,file=./jmap.dump 13

退出容器,使用 docker cp <容器ID>:/usr/local/tomcat/jmap.dump ./ 將dump文件複製到宿主機目錄,下載到本地,使用 MemoryAnalyzer(下載地址:www.eclipse.org/mat/downloa… )打開,如圖

在這裡插入圖片描述

如果dump文件比較大,需要增大MemoryAnalyzer.ini配置文件中的-Xmx值

發現占用記憶體最多的是char[], String對象,通過右鍵可以查看引用對象,但點開貌似也看不出所以然來,進入記憶體泄露報告頁面,如圖

在這裡插入圖片描述

該頁面統計了堆記憶體的占用情況,並且給出疑似泄露點,在上圖中點開“see stacktrace”鏈接,進入線程棧頁面,

在這裡插入圖片描述

似曾熟悉的畫面,還是跟excel導出有關,數據太多,導致記憶體溢出。。。於是GC頻繁,於是CPU爆了。根源還是同一個。

總結

本文以處理一次線上服務CPU 100%的實戰過程示例了在遇到Java服務造成伺服器CPU消耗過高或記憶體溢出的一般處理方法,希望對大家定位線上類似問題提供參考。同時,開發實現功能時需要考慮的更深遠一些,不能停留在解決當前的場景,需要考慮數據量不斷增大時,你的實現是否還能適用。俗話說,初級程式員解決當前問題,中級程式員解決兩年後的問題,高級程式員解決五年後的問題,_

作者:雨歌
file


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 從接觸 Python 時起,我就覺得 Python 的元組解包(unpacking)挺有意思,非常簡潔好用。 最顯而易見的例子就是多重賦值,即在一條語句中同時給多個變數賦值: >>> x, y = 1, 2 >>> print(x, y) # 結果:1 2 在此例中,賦值操作符“=”號的右側的兩個數 ...
  • 我們為什麼要使用泛型? 在學習集合時,我們都知道集合中是可以存放任意對象的,只要把對象存儲集合後,那麼這時他們都會被提升成Object類型。當我們在取出每一個對象,並且進行相應的操作,這時必須採用向下類型轉換。這個時候就要註意了,很容易出現問題. public class GenericDemo { ...
  • C語言簡介 C 語言是一種通用的高級語言,最初是由丹尼斯·里奇在貝爾實驗室為開發 UNIX 操作系統而設計的。C 語言最開始是於 1972 年在 DEC PDP-11 電腦上被首次實現。 原文鏈接:https://juejin.im/post/5df8c917f265da339772a5d1#he ...
  • 字元串相關的類:String String類:代表字元串,Java 程式中的所有字元串字面值(如 "abc" )都作 為此類的實例實現。 String是一個final類,代表不可變的字元序列 當字元串重新賦值時,需要重新指定記憶體區域,不能使用原有的value進行賦值 當對現有的字元串進行連接操作時, ...
  • 基礎數據類型 在變數的定義中,我們講了每個變數是有類型的,類型在電腦中是用來約束數據的解釋。Go語言和其它電腦語言一樣,提供豐富了豐富的數據類型,我們就來看看到底有哪些類型,同時也可以比較一下它和其它語言的區別。 整型 整型就是用來表示變數是整數的類型。和C類似,Go整型分為兩個大類,無符號和有 ...
  • 作者: zyl910 一、緣由 現在zip類的文件越來越多了,例如jar、docx。 有時我們需批量處理這些文件中的數據,若都是手工操作的話就太麻煩了。於是考慮編程自動處理。 Java提供了ZipInputStream等zip的操作類。但是有些內容比較抽象,沒有代碼範例的話有點難以理解。例如zip中 ...
  • 前言 本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 首先,瞭解下什麼是JSON? JSON:JavaScript Object Notation 【JavaScript 對象表示法】 JSON 是一種輕量級的數據交換格式,完全 ...
  • 隨著時間的積累,應用的使用用戶不斷增加,數據規模也越來越大,往往資料庫查詢操作會成為影響用戶使用體驗的瓶頸,此時使用緩存往往是解決這一問題非常好的手段之一。Spring 3開始提供了強大的基於註解的緩存支持,可以通過註解配置方式低侵入的給原有Spring應用增加緩存功能,提高數據訪問性能。 在Spr ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...