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.mzph.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 系统效果展示教师端系统部分功能截图学生端系统部分功能截图 结语 项目介绍 项目概述…