StarRocks FE leader節點CPU使用率周期性的忽高忽低問題分析

背景

本文基于 StarRocks 3.3.5
最近在做一些 StarRocks 相關的指標監控的時候,看到了FE master的CPU使用率相對其他FE節點是比較高的,且 呈現周期性的變化(周期為8分鐘),
于此同時FE master節點的GC頻率相對于其他節點高出很多倍,于是我們利用arthas采集了大約15分鐘CPU的火焰圖。如下:
在這里插入圖片描述
對應的FE master節點的CPU使用率的變化如下圖:
在這里插入圖片描述
FE 其他節點的CPU使用率的變化如下圖:
在這里插入圖片描述

對應的FE master節點的Young GC的變化如下圖:
在這里插入圖片描述

FE 其他節點的Young GC變化如下圖:
在這里插入圖片描述

結論

CPU使用率高的主要集中在三個點:

  1. StatisticAutoCollector(占用28%)
  2. MemoryUsageTracker (占用9%)
  3. JVM GC(占用57%)
    因為在我們的場景下,實時寫入的任務比較多,且寫入的是分區表(由于業務的場景問題,會更新以前分區的數據),所以會導致 StatisticAutoCollector 進行相關統計信息的收集,而這個統計信息的收集,會觸發System.gc操作,從而導致FE master節點的 gc頻率比其他節點高很多。

分析

StatisticAutoCollector

StatisticAutoCollector 這個類只有在FE Master才會被調用,且調用的頻率為statistic_collect_interval_sec,也就是5分鐘。
該線路數據流為:

StatisticAutoCollector.runAfterCatalogReady||\/
runJobs||\/
StatisticExecutor.collectStatistics||\/
FullStatisticsCollectJob.collect||\/
collectStatisticSync||\/
StmtExecutor.executeStatisticDQL||\/
StmtExecutor.executeDQL||\/
StatementPlanner.plan //走到 生成計劃||\/
createQueryPlanWithReTry||\/
collectOriginalOlapTables||\/
OlapTable.copyOnlyForQuery||\/
partitionInfo.clone()

partitionInfo.clone() 會初始化HashMap來復制partiiton的信息:

 protected Object clone()  {try {PartitionInfo p = (PartitionInfo) super.clone();p.type = this.type;p.idToDataProperty = new HashMap<>(this.idToDataProperty);p.idToReplicationNum = new HashMap<>(this.idToReplicationNum);p.isMultiColumnPartition = this.isMultiColumnPartition;p.idToInMemory = new HashMap<>(this.idToInMemory);p.idToTabletType = new HashMap<>(this.idToTabletType);p.idToStorageCacheInfo = new HashMap<>(this.idToStorageCacheInfo);return p;} catch (CloneNotSupportedException e) {throw new RuntimeException(e);}}

所以說在這種要收集的分區信息很多的情況下,HashMap的初始化,就很消耗CPU。
再者,在collectStatistics 之前會通過 StatisticsCollectJobFactory.buildStatisticsCollectJob 這個方法計算出要收集的 FullStatisticsCollectJob ,這里會通過執行select $quoteColumnName as column_key from $dbName.$tableName partition $partitionName這種方法收集每個分區中某些字段的信息,這里后續會詳細說

MemoryUsageTracker

StatisticAutoCollector 這個類只有在FE Master才會被調用,且調用的頻率為 memory_tracker_interval_seconds ,也就是1分鐘。
該類的數據流為:

MemoryUsageTracker.runAfterCatalogReady||\/
MemoryUsageTracker.trackMemory||\/
MemoryTrackable.estimateSize||\/
SizeEstimator.estimate

這里會根據初始化方法initMemoryTracker涉及到的對象進行內存的評估,具體的對象如下:

 private void initMemoryTracker() {GlobalStateMgr currentState = GlobalStateMgr.getCurrentState();registerMemoryTracker("Load", currentState.getLoadMgr());registerMemoryTracker("Load", currentState.getRoutineLoadMgr());registerMemoryTracker("Load", currentState.getStreamLoadMgr());registerMemoryTracker("Load", currentState.getInsertOverwriteJobMgr());registerMemoryTracker("Compaction", currentState.getCompactionMgr());registerMemoryTracker("Export", currentState.getExportMgr());registerMemoryTracker("Delete", currentState.getDeleteMgr());registerMemoryTracker("Transaction", currentState.getGlobalTransactionMgr());registerMemoryTracker("Backup", currentState.getBackupHandler());registerMemoryTracker("Task", currentState.getTaskManager());registerMemoryTracker("Task", currentState.getTaskManager().getTaskRunManager());registerMemoryTracker("TabletInvertedIndex", currentState.getTabletInvertedIndex());registerMemoryTracker("LocalMetastore", currentState.getLocalMetastore());registerMemoryTracker("Query", new QueryTracker());registerMemoryTracker("Profile", ProfileManager.getInstance());registerMemoryTracker("Agent", new AgentTaskTracker());QeProcessor qeProcessor = QeProcessorImpl.INSTANCE;if (qeProcessor instanceof QeProcessorImpl) {registerMemoryTracker("Coordinator", (QeProcessorImpl) qeProcessor);}IDictManager dictManager = IDictManager.getInstance();if (dictManager instanceof CacheDictManager) {registerMemoryTracker("Dict", (CacheDictManager) dictManager);}memoryMXBean = ManagementFactory.getMemoryMXBean();LOG.info("Memory usage tracker init success");initialize = true;}

這里會對里面涉及到的所有對象進行內存的評估,用來后續的內存使用指標顯示。

JVM GC

這個方法是在每個SQL執行完后就會觸發的,具體的數據流為:

StatisticAutoCollector.runJobs||\/StatisticExecutor.collectStatistics||\/FullStatisticsCollectJob.collect||\/FullStatisticsCollectJob.collectStatisticSync ||\/flushInsertStatisticsData ||\/StmtExecutor.execute() ||\/GlobalStateMgr.getCurrentState().getMetadataMgr().removeQueryMetadata();||\/queryMetadatas.metadatas.values().forEach(ConnectorMetadata::clear)||\/LocalMetaStore.clear ->  System.gc()

當然這也只是該 StatisticAutoCollector 定時的觸發的,還有如果有查詢SQL的話,也會進行觸發。具體看 StmtExecutor.execute方法:

   public void execute() throws Exception {...try {...} finally {GlobalStateMgr.getCurrentState().getMetadataMgr().removeQueryMetadata();if (context.getState().isError() && coord != null) {coord.cancel(PPlanFragmentCancelReason.INTERNAL_ERROR, context.getState().getErrorMessage());}if (parsedStmt != null && parsedStmt.isExistQueryScopeHint()) {clearQueryScopeHintContext();}// restore session variable in connect contextcontext.setSessionVariable(sessionVariableBackup);}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/71572.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71572.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/71572.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第37章 合作之路與占坑成功

在春寒料峭的時節&#xff0c;那絲絲寒意宛如一縷縷若有若無的輕煙&#xff0c;在空氣中悄然彌漫。銳創所的會議室&#xff0c;宛如一個被歲月塵封的神秘空間&#xff0c;暖黃色的燈光暈染開來&#xff0c;像是為整個房間披上了一層朦朧的薄紗&#xff0c;陳舊卻又帶著幾分溫馨…

Webpack打包優化

在使用 Webpack 打包項目時&#xff0c;隨著項目規模的擴大&#xff0c;構建時間和打包產物的體積可能會逐漸增加。為了提高構建性能和減小打包產物的體積&#xff0c;可以采取以下幾種 Webpack 打包優化 的方法。 1. 使用 mode 配置 Webpack 通過 mode 配置來指定構建模式。…

計算機專業知識【深入理解IP網段:192.168.1.1/24 與 192.168.1.0/24】

在網絡世界里&#xff0c;IP地址和網段是非常基礎卻又至關重要的概念。很多朋友在看到類似 192.168.1.1/24 和 192.168.1.0/24 這樣的表述時&#xff0c;可能會感到困惑。今天&#xff0c;我們就來詳細剖析一下它們的含義以及兩者之間的關系。 一、IP地址與子網掩碼基礎 在深…

python的if判斷和循環語句(while循環和for循環)

1.if判斷 1.1if判斷的基本格式 if 判斷條件&#xff1a; 滿足條件做的事 score input("請輸入成績&#xff1a;") if score 100:print("你真棒") if score 60:print("還要加油") 使用input輸入默認類型為字符串類型 1.2運算符 1.2…

洛谷P9240 [藍橋杯 2023 省 B] 冶煉金屬

題目描述 小藍有一個神奇的爐子用于將普通金屬 O 冶煉成為一種特殊金屬 X。這個爐子有一個稱作轉換率的屬性 V&#xff0c;V 是一個正整數&#xff0c;這意味著消耗 V 個普通金屬 O 恰好可以冶煉出一個特殊金屬 X&#xff0c;當普通金屬 O 的數目不足 V 時&#xff0c;無法繼續…

Rpc導讀

手寫Rpc框架 - 導讀 git倉庫-all-rpc GTIEE&#xff1a;https://gitee.com/quercus-sp204/all-rpc 【參考源碼 yrpc】 1. Rpc概念 RPC 即遠程過程調用&#xff08;Remote Procedure Call&#xff09; &#xff0c;就是通過網絡從遠程計算機程序上請求服務。 本地調用抽象&…

網絡安全:防范NetBIOS漏洞的攻擊

稍微懂點電腦知識的朋友都知道&#xff0c;NetBIOS 是計算機局域網領域流行的一種傳輸方式&#xff0c;但你是否還知道&#xff0c;對于連接互聯網的機器來講&#xff0c;NetBIOS是一大隱患。 漏洞描述 NetBIOS(Network Basic Input Output System&#xff0c;網絡基本輸入輸…

VIE(可變利益實體)架構通俗解析 —— 以阿里巴巴為例(中英雙語)

VIE&#xff08;可變利益實體&#xff09;架構通俗解析 —— 以阿里巴巴為例 什么是 VIE 架構&#xff1f; VIE&#xff08;Variable Interest Entity&#xff0c;可變利益實體&#xff09;是一種特殊的法律結構&#xff0c;主要用于中國企業在海外上市&#xff0c;特別是受中…

使用代碼與 AnythingLLM 交互的基本方法和示例

AnythingLLM 是一個基于大語言模型&#xff08;LLM&#xff09;的工具&#xff0c;主要用于構建和管理個人或企業知識庫。雖然它主要提供圖形化界面&#xff08;GUI&#xff09;進行操作&#xff0c;但也可以通過代碼進行一些高級配置和集成。以下是使用代碼與 AnythingLLM 交互…

用DeepSeek零基礎預測《哪吒之魔童鬧海》票房——從數據爬取到模型實戰

系列文章目錄 1.元件基礎 2.電路設計 3.PCB設計 4.元件焊接 5.板子調試 6.程序設計 7.算法學習 8.編寫exe 9.檢測標準 10.項目舉例 11.職業規劃 文章目錄 **一、為什么要預測票房&#xff1f;****二、準備工作****三、實戰步驟詳解****Step 1&#xff1a;數據爬取與清洗&am…

如何將MySQL數據庫遷移至阿里云

將 MySQL 數據庫遷移至阿里云可以通過幾種不同的方法&#xff0c;具體選擇哪種方式取決于你的數據庫大小、數據復雜性以及對遷移速度的需求。阿里云提供了多種遷移工具和服務&#xff0c;本文將為你介紹幾種常見的方法。 方法一&#xff1a;使用 阿里云數據庫遷移服務 (DTS) 阿…

Ubuntu22.04 - gflags的安裝和使用

目錄 gflags 介紹gflags 安裝gflags 使用 gflags 介紹 gflags 是Google 開發的一個開源庫&#xff0c;用于 C應用程序中命令行參數的聲明、定義和解析。gflags 庫提供了一種簡單的方式來添加、解析和文檔化命令行標志(flags),使得程序可以根據不同的運行時配置進行調整。 它具…

Git LFS介紹(Large File Storage)大文件擴展,將大文件存儲在外部存儲,倉庫中只記錄文件的元數據(大文件的指針,類似一個小的占位符文件)

文章目錄 LFS的功能&#xff1f;如何使用LFS&#xff1f;將大文件存儲在外部系統是什么意思&#xff1f;具體是如何運作的&#xff1f;為什么要這樣做&#xff1f; 對開發者的影響&#xff1f;1. **性能和效率**2. **協作體驗**3. **版本管理差異**4. **額外的工具和配置** LFS…

Fastgpt學習(5)- FastGPT 私有化部署問題解決

1.? 問題描述&#xff1a; Windows系統&#xff0c;本地私有化部署&#xff0c;postgresql數據庫鏡像日志持續報錯" data directory “/var/lib/postgresql/data” has invalid permissions "&#xff0c;“ DETAIL: Permissions should be urwx (0700) or urwx,gr…

2026考研趨勢深度解析:政策變化+高效工具指南

2026考研深度解析&#xff1a;趨勢洞察高效工具指南&#xff0c;助你科學備戰上岸 從政策變化到工具實戰&#xff0c;這份千字攻略解決99%考生的核心焦慮 【熱點引入&#xff1a;考研賽道進入“高難度模式”】 2025年全國碩士研究生報名人數突破520萬&#xff0c;報錄比預計擴…

娛樂使用,可以生成轉賬、圖片、聊天等對話內容

軟件介紹 今天要給大家介紹一款由吾愛大佬 lifeixue 開發的趣味軟件。它的玩法超豐富&#xff0c;能夠生成各式各樣的角色&#xff0c;支持文字聊天、發紅包、轉賬、發語音以及分享圖片等多種互動形式&#xff0c;不過在分享前得著重提醒&#xff0c;此軟件僅供娛樂&#xff0…

DeepSeek動畫視頻全攻略:從架構到本地部署

DeepSeek 本身并不直接生成動畫視頻,而是通過與一系列先進的 AI 工具和傳統軟件協作,完成動畫視頻的制作任務。這一獨特的架構模式,使得 DeepSeek 在動畫視頻創作領域發揮著不可或缺的輔助作用。其核心流程主要包括腳本生成、畫面設計、視頻合成與后期處理這幾個關鍵環節。 …

C++類與對象深度解析(一):從引用、內聯函數到構造析構的編程實踐

目錄 一.引用 引用的特征&#xff1a;1.引用必須初始化 2.本質是別名 3.函數參數傳遞 4.常引用 5.函數返回值 6.權限 放大 縮小 平移 引用 vs 指針 二.內聯函數 關鍵點說明 三.宏函數 四.類 什么是類&#xff1f; 簡單的類 五.構造函數與析構函數 1. 構造函數&…

vsan數據恢復—vsan緩存盤故障導致虛擬磁盤文件丟失的數據恢復案例

vsan數據恢復環境&故障&#xff1a; VMware vsan架構采用21模式。每臺設備只有一個磁盤組&#xff08;71&#xff09;&#xff0c;緩存盤的大小為240GB&#xff0c;容量盤的大小為1.2TB。 由于其中一臺主機&#xff08;0號組設備&#xff09;的緩存盤出現故障&#xff0c;導…

開源在線考試系統開源在線考試系統:支持數學公式的前后端分離解決方案

開源在線考試系統&#xff1a;支持數學公式的前后端分離解決方案 項目介紹項目概述&#xff1a;技術棧&#xff1a;版本要求主要功能&#xff1a;特色亮點 項目倉庫地址演示地址GiteeGitHub 系統效果展示教師端系統部分功能截圖學生端系統部分功能截圖 結語 項目介紹 項目概述…