記一次老商家端應用記憶體突然飈高原因分析

来源:https://www.cnblogs.com/Jcloud/archive/2023/10/31/17799559.html
-Advertisement-
Play Games

一、排查過程 問題發現是因為當時接到了記憶體UMP報警信息,如下: 通過查看PFinder發現記憶體一直在增長,沒有停止跡象,觸發fullGC也並沒有下降趨勢: 當機立斷,先立即去NP上摘除了此台機器流量,然後繼續觀察,發現記憶體依然在不斷增長。 隨即查看故障分析,並沒有得到有效信息: 因為流量已經摘除, ...


一、排查過程

問題發現是因為當時接到了記憶體UMP報警信息,如下:

通過查看PFinder發現記憶體一直在增長,沒有停止跡象,觸發fullGC也並沒有下降趨勢:

當機立斷,先立即去NP上摘除了此台機器流量,然後繼續觀察,發現記憶體依然在不斷增長。

隨即查看故障分析,並沒有得到有效信息:

因為流量已經摘除,那麼繼續觀察到底哪裡的問題,約半小時後然後接到了機器的宕機告警如下:

由於在應用啟動參數里配置了dump路徑,那麼就馬上去把dump文件下載下來分析。

隨後找到對應IP機器的目錄,下載了dump文件java_pid432.hprof核對時間沒有問題,隨即使用MAT工具開展分析,通過泄露分析結果直接就可以看出problem1與problem2都是一個同一個問題,2個線程分別占用1.8G、1.5G:

通過查看問題對應的代碼類方法,發現該方法功能是"導出WMS保質期商品數據",該方法會調用庫存分頁介面查詢保質期商品,大致如下:

1、查詢無數據直接導出空表;

2、第一頁查詢總量小於1000的話直接把數據寫入第一個sheet並導出表格;

3、第一頁查詢總量大於1000則迴圈分頁查詢,每1000條數據生成一個sheet表格進行導出。

可以看到,org.apache.poi.hssf.usermodel.HSSFWorkbook對象數量已經達到702個了。

翻看具體代碼部分如下:

二、解決思路

經過對該功能代碼分析,本著先解決問題的原則,先將迴圈調用功能進行限制,通過ducc配置導出頁數大小限制,來避免一直迴圈調用。

至此,問題初步解決完畢,調整後沒有出現問題。

但是,這個功能的優化並沒有結束,隨後將該問題及功能邏輯反饋給產品及庫存相關方,一起討論解決商家導出的問題,一方面我們要保障商家體驗,另一方面又要確保系統穩定性。後續要從這2方面入手進行功能的優化,不斷為提升商家體驗而努力。

三、總結分析

回過頭來咱們再分析以下這個功能,通過系統日誌及監控,發現該功能商家日常使用較少,並且大部分商家的保質期商品較少,極少數會存在有非常多保質期商品數據的情況。但是一旦出現這樣的問題就會很致命,所以在導出功能設計之初我們就應該考慮到將來任何可能出現的情況,並做好提前的預防。另外就是要做功能的限制,例如導出次數、導出數據量的限制功能來保障商家體驗及系統的安全穩定。

另外再說一下,對導出功能的理解,對於商家而已,導出需求是正常的。但是過多大批量數據的一起導出無論對哪個系統來說都是非常危險的一個功能。以下列舉了一些個人總結的導出功能設計時的一些常見規則,希望大家一起參與討論分析,拙見如下:

  • 明確導出數據的價值分析
  • 明確導出數據的使用傾向
  • 明確導出數據的安全要求
  • 明確導出數據的許可權控制
  • 明確需要導出的數據量級
  • 明確導出數據的方式方法
  • 明確到倉數據的頻率頻次
  • 明確導出數據的性能效率
  • 明確導出數據的限制方法
  • 明確導出功能的隔離及降級方案
  • 明確導出數據的格式樣式
  • 明確導出數據的下載方案
  • 明確導出數據的錯誤監控

以上是個人想到的一些導出設計的簡單規則,需要產研測一起溝通明確,還希望大家多提提意見,一起完善導出規則。

另外我們再從商家角度來考慮一下導出的目的,個人從詢問業務及相關人員,發現商家導出數據有以下一些目的:

  • 存儲歸檔方便查歷史資料
  • 利用系統業務數據進行數據分析已指導商家業務工作或給領導彙報工作
  • 導出來使用表格工具等其他商家熟悉的工具進行查看,更便捷便利
  • 對導出的數據進行加工,並用於其他非京東系統的數據輸入
  • 無意識的導出並無其他作用

以上是個人總結的一些商家導出的需求目的,其實針對商家導出來說可能還有很多其他目的,我們不能全部都能瞭解。但是可以積極與商家溝通理解商家的真實目的。

另外,我們需要去分析商家的訴求,挖掘商家需求背後的目的。假如有個服裝行業的商家需要做服務訂單業務數據、庫存數據分析,是否我們可以利用數智側的系統能力,為商家打造通用的數據分析能力呢,這樣既可以避免導出數據手動分析的雞肋,同時也提升了商家對京東物流的系統使用體驗。

以上僅僅代表個人觀點,一點愚見,還請大家批評指正!

歡迎大家一起探討!

作者:京東物流 劉鄧忠

來源:京東雲開發者社區 自猿其說Tech 轉載請註明來源


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

-Advertisement-
Play Games
更多相關文章
  • 需求:有一個vo類,該類繼承了一個實體類,獲取到vo對象後,需要將其中的null值轉為空字元串; 思路:傳入參數,用Object接收,利用反射獲取到該對象的所有欄位,並判斷置空; 由於一開始沒有考慮到父類的欄位獲取,導致時不時出現錯誤,因此這裡簡單記錄一下。 // 無需返回object,set後對象 ...
  • File --JAVA 構造方法 方法說明 public File (String pathname) 根據文件路徑創建對象 public File (String parent, String child) 根據父路徑名字字元串和子路徑名字元串創建文件對象 public File (String ...
  • 作者今天在開發一個後臺發送消息的功能時,由於需要給多個用戶發送消息,於是使用了 mybatis plus 提供的 saveBatch() 方法,在測試環境測試通過上預發佈後,測試反應發送消息介面很慢得等 5、6 秒,於是我就登錄預發佈環境查看執行日誌,發現是 mybatis plus 提供的 sav ...
  • 各種閑著沒事的 scanf 奇葩用法 然而這些卻很好用誒。 同理,scanf 可以拓展到 sscanf、fscanf~ 例題:P1580 yyy loves Easter_Egg I、P7911 網路連接 未計入更加奇葩的 C 語言用法,比如 %i %a 這種明顯等價的轉換字元。 基礎1:整數輸入 ...
  • 今天在對接支付寶 APP 支付的時候遇到了一個報錯,記錄下問題的排查過程~ 報錯過程 APP 中彈窗提示的報錯“商家訂單參數異常,請重新發起付款”,檢查了下參數感覺沒啥問題,不知道是啥問題導致的。 去官網搜了下,折騰排查了一遍,發現是環境問題,沒有切到沙箱環境導致的 (*/ω\*) 。 先放個官網提 ...
  • Gradle8.4構建SpringBoot多模塊項目 一、基本 1、版本 這個版本是Jdk8最後一個SpringBoot版本 軟體 版本 Gradle 8.4 SpringBoot 2.7.15 JDK 8 2、Gradle基本介紹 2.1、使用Wrapper方式構建 好處:統一gradle的版本 ...
  • 背景 在我們系統中有這麼一個需求,業務方會通過mq將一些用戶信息傳給我們,我們的服務處理完後,再將信息轉發給子系統。mq的內容如下: @Data public class Person { //第一部分 private Integer countryId; private Integer compa ...
  • 1 ELK日誌系統 經典的ELK架構或現被稱為Elastic Stack。Elastic Stack架構為Elasticsearch + Logstash + Kibana + Beats的組合: Beats負責日誌的採集 Logstash負責做日誌的聚合和處理 ES作為日誌的存儲和搜索系統 Kib ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...