【OceanBase诊断调优】—— 执行内存占用高问题汇总

执行内存占用高问题经常在不同环境中遇到, 在内存较大的租户场景下, 问题可能暴露不明显, 但小规格场景下, 如果执行内存占用非常高, 往往有上 G 甚至几十G 的情况, 可能导致整个租户无内存使用。本文汇总执行内存占用高问题。

获取内存高的 mod 的代码 backtrace 方式

对于执行内存占用高的问题,可以使用常态化 memory leak 诊断工具 获取代码 backtrace。一般通过以下步骤可以获取到占用内存高的代码堆栈,具体方法如下。

  • 在 OceanBase 数据库 V2.x、V3.x 版本。

    1. 在 SYS 租户中,打开 mem_leak 监控。

      obclient> alter system set leak_mod_to_check='OB_COMMON_ARRAY';
      
    2. 等待内存模块增长一段时间后,执行如下 SQL 查看泄露堆栈。

      obclient>SELECT * FROM oceanbase.__all_virtual_mem_leak_checker_info ORDER BY alloc_count DESC;
      
    3. 找到 alloc_count 最多的堆栈,通过 addr2line 获取函数名。

      addr2line -pCfe /home/admin/oceanbase/bin/observer xxxxx
      
    4. 联系 OceanBase 数据库技术支持人员协助排查。

    5. 关闭 mem_leak。

      由于打开 mem_leak 监控影响性能,问题定位后及时将 mem_leak 监控关闭,命令如下。

      obclient> alter system set leak_mode_to_check='';
      
  • 在 OceanBase 数据库 V4.0 及以上版本。

    1. 通过视图 GV$OB_MEMORY, 获取占用内存较高的 mod_name。

    2. 通过 mod_name 获取 backtrace。

      select * from oceanbase.__all_virtual_malloc_sample_info where mod_name='xxx' order by alloc_size desc limit 10;
      
    3. 解析 backtrace。

      addr2line -pCfe bin/observer 0x4209973 0x3d56e15 0x3d56d0a 0x41f6ec4 0xe2663a9 0xe266542 0x113e7f85 0xed77810 0xd28eaff 0xd28ea56 0x6f7fe47 0x41dfaec 0x7f80d3580445 0x41dc315
      

执行内存占用高的问题

SqlExecContext 模块

问题描述

repeatspace 等表达式向量化场景 SqlExecContext 模块内存膨胀到 10+g。

问题原因

repeatspace 的结果内存大小不可控,且结果长度很大时仍使用的 varchar 类型存储,在向量化场景会进一步放大内存使用,导致内存很高。

问题诊断
  1. 执行语句中含有 repeat/space 表达式。

  2. 泄漏堆栈中存在如下堆栈信息。

    oceanbase::sql::ObExpr::alloc_str_res_mem()
    oceanbase::sql::ObExprStrResAlloc::alloc()
    oceanbase::sql::ObExprRepeat::repeat()
    
解决方法

OceanBase 数据库 V4.2 版本缓解,V4.3 版本彻底解决。

multi table replace 算子模块

问题描述

SQL_EXEC_CTX_ID 内存膨胀至 190G,租户内存爆。

问题原因

OceanBase 数据库 V3.x 版本的 multi_part_xxx 计划因为未作多批次写入流程,所有的数据都会被 load 在本地,所以当数据量很大的时候,会发生严重的内存膨胀。

问题诊断
  1. 存在 replace into 算子。

  2. 堆栈中存在如下信息。

    oceanbase::sql::ObChunkDatumStore::switch_block(long) 
    oceanbase::sql::ObChunkDatumStore::add_row(
    oceanbase::sql::ObMultiTableReplaceOp::load_replace_row
    oceanbase::sql::ObMultiTableReplaceOp::inner_open()
    
解决方法

OceanBase 数据库 V3.2.3 版本之前存在但不是很明显,V3.2.3 及之后版本, 开向量化时该场景内存使用会明显增加,注意 V3.2.3 版本尚未解决。

聚合函数的参数含 distinct 模块

问题描述

distinct aggration + 向量化场景下内存占用高问题。

问题原因

向量化中会维护 256 组聚合,每组都会用 sort 做去重,导致这里用内存太多。

问题诊断
  1. 执行语句中,聚合函数的参数含 distinct, 比如 sum(distinct c1) 等。

  2. 通过命令过滤内存分配报错日志信息。

    grep 'add row to distinct set failed'
    
解决方法

OceanBase 数据库 V4.2 版本缓解,V4.3 版本彻底解决。

SqlExecutor 模块

问题描述

batch insert 场景内存使用高。

问题原因

insert values 类型 SQL 后跟多行数据时,硬解析时,内存膨胀,另外行数不固定,可能导致不能命中 plan_cache,出现并发硬解析时,同时占用内存就很大。

问题诊断

执行语句为 batch insert,比如 insert into ... values(...), (...), (...) ... ...

解决方法

OceanBase 数据库 V4.0 版本已进行优化,默认关闭,还存在 bad case,而在 V4.3 版本会默认打开优化。优化打开命令。

ALTER SYSTEM SET ob_enable_batched_multi_statement = true;

SqlExecutor/CostBasedRewrite 模块

问题描述

in 个数或 or 很多时, query range 抽取内存占用高。

问题原因

抽取 query range 时,反复深拷导致内存占用高。

问题诊断
  1. SQL 语句中含有大量 in 或者 or 条件。

  2. 使用内存高的 backtrace 中,含有 ObQueryRange。

解决方法

OceanBase 数据库 V4.2 版本解决。

SqlWindoRowStor 模块

问题描述

window function 中,存在某个组数据很多情况场景, 内存占用高。

问题原因

window function 未接入自动内存管理,当前落盘阈值太高。

问题诊断
  1. 通过 SqlWindoRowStor 直接判断。

  2. 执行语句中,含有 over 关键字。

  3. 使用内存高的 backtrace 中,含有 ObWindowFunctionOp::RowsStore::add_row

解决方法

OceanBase 数据库 V4.2 版本解决。

SqlAggrFunGroCo 模块

问题描述

groupconcat aggregate + 向量化场景, 内存占用高问题。

问题原因

groupconcat aggregate 没接自动内存管理。

问题诊断
  1. 通过 SqlAggrFunGroCo 直接判断。

  2. 执行语句中,含有 group_concat

  3. 使用内存高的 backtrace 中,含有 ObAggregateProcessor::group_extra_aggr_calc_batch

解决方法

OceanBase 数据库 V4.2 缓解,V4.3 彻底解决。

SqlCteRow 模块

问题描述

cte 场景, 可能存在内存占用高问题。

问题原因

数据量大、递归层次过高、无限递归场景,判环占用内存高。

问题诊断
  1. 通过 SqlCteRow 这个 mod 直接判断。

  2. recursive cte 无限递归根据 with 子句判断,是否带有终止条件(level < x 等),比如 with cte(n) as (select 1 union select n+1) select * from cte

解决方法

OceanBase 数据库 V3.2.3 版本之前存在但不是很明显,V3.2.3 及之后版本,开向量化时该场景内存使用会明显增加。

ConnectByPump 模块

问题描述

connect by 场景, 可能存在内存占用高问题。

问题原因

递归层次过高时保留 pump node 用于判环, 导致内存占用高。

问题诊断
  1. 通过 ConnectByPump 这个 mod 直接判断。

  2. 无限递归需要根据 connect by 条件判断,是否写法正确(确定 prior 是否遗漏),比如 connect by c1 = c2 时刚好某行数据的 c1 值与 c2 值相同。

解决方法

OceanBase 数据库所有活跃版本均存在该问题。

MysqlRequesReco 模块

问题描述

sql audit queue 内存小规格占用 80M 问题。

问题原因

因为当前 sql audit 内部使用的循环 buffer,默认使用的 1000w 个槽位, 不支持动态调整,固定占用 80+M。

问题诊断

这个 mod 名称 ·MysqlRequesReco·, 表示 sql audit 消耗内存, 可以先通过 SQL 语句 select svr_ip, svr_port, count(*) from gv$ob_sql_audit group by svr_ip, svr_port 查看 sql audit 中的执行记录信息。

  • 如果执行记录数很少,比如只有几百行,同时 sql audit 中内存占用有有超过 100M+,则 sql audit 内存占用可能不合理,属于未知 Bug 缺陷。

  • 如果 sql audit 中记录数很少,同时小于 100M,则是因为 sql audit queue 默认占用 80M 问题,属于已知问题。

  • 如果内存占用高,且 sql audit 记录数很多,则符合预期。

解决方法

OceanBase 数据库 V4.3 版本解决。

DtlIntermRes 模块

问题描述

执行分布式计划时内存占用高。

问题原因

停流量后,内存占用仍然很大:中间结果泄漏;停流量后,内存占用降到很低(执行一些分布式 inner sql ):流量大导致写入大量中间结果。

解决方法

OceanBase 数据库 V4.2 版本已修复,V4.3 版本解决,实施中间结果的自动内存管理。

ObSQLSessionInf 模块

问题描述

大量 session 建连场景,内存占用过高,长时间未释放。

问题原因

session_pool hold 住内存,当前设计不存在释放相应内存。

解决方法

在 OceanBase 数据库 V4.x 版本中添加开关,关闭 session pool。

WindowAggProc 模块

问题描述

WindowAggProc 内存膨胀 5G+;400k 的查询首次执行爆内存,再次执行成功。

问题原因

WM_CONCAT 内存使用过于粗放,数据全部缓存在 arena 中,引发内存膨胀。

解决方法

OceanBase 数据库 V4.3 版本解决。

适用版本

OceanBase 数据库所有版本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/19630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

构建坚不可摧的Web安全防线:深入剖析二阶注入与全面防御策略

引言 在数字化时代&#xff0c;数据安全是企业和个人最为关注的问题之一。网络攻击手段层出不穷&#xff0c;其中SQL注入攻击尤为狡猾&#xff0c;它允许攻击者通过Web应用的漏洞对数据库进行非法操作。更隐蔽的是二阶注入攻击&#xff0c;它不仅威胁当前操作&#xff0c;还能…

音视频开发—FFmpeg打开麦克风,采集音频数据

文章目录 1.使用命令行实现采集PCM数据2.使用代码实现3.播放PCM4.PCM转换为WAV 1.使用命令行实现采集PCM数据 确保你的系统有FFmpeg安装。你可以通过在终端运行ffmpeg -version来检查是否已安装。 找出你的麦克风设备名。在Linux中&#xff0c;你可以使用arecord -l命令列出所…

通过强化学习彻底改变大型数据集特征选择

文章目录 一、说明二、强化学习&#xff1a;特征选择的马尔可夫决策问题三、用于使用强化学习进行特征选择的 python 库3.1. 数据预处理3.2. 安装和导入FSRLearning库 四、结论和参考文献 一、说明 了解强化学习如何改变机器学习模型的特征选择。通过实际示例和专用的 Python 库…

【Python】解决Python错误报错:IndexError: tuple index out of range

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

ROS2从入门到精通2-1:launch多节点启动与脚本配置

目录 0 专栏介绍1 ROS2的启动脚本优化2 ROS2多节点启动案例2.1 C架构2.2 Python架构 3 其他格式的启动文件3.1 .yaml启动3.2 .xml启动 0 专栏介绍 本专栏旨在通过对ROS2的系统学习&#xff0c;掌握ROS2底层基本分布式原理&#xff0c;并具有机器人建模和应用ROS2进行实际项目的…

采用java18+vue语言+springboot开发的家政上门服务平台源码,(平台管理端+用户端+服务端全套源码)

采用java18vue语言springboot开发的家政上门服务平台源码&#xff0c;&#xff08;平台管理端用户端服务端全套源码&#xff09; 家政管理平台系统是运用现代计算机和网络技术&#xff0c;集信息网、服务网为一体&#xff0c;对社区家政需求信息汇集整理、综合处理&#xff0c;…

【无人机】基于排队论系统、三角模型和马尔可夫链构建航空交通系统综合模型附matlab代码

目录 研究背景:研究目标:研究思路:研究内容:研究步骤:代码框架研究背景: 随着无人机技术的不断发展和应用,无人机在航空交通系统中的角色变得越来越重要。然而,随着无人机数量的增加,如何高效地管理和调度无人机的交通成为一个挑战。为了解决这个问题,研究者们开始利…

GPT-4o:未来语言模型的典范

​​​​​​​在人工智能的快速发展中&#xff0c;GPT-4o作为GPT系列的最新成员&#xff0c;以其卓越的性能和创新功能&#xff0c;成为了业界关注的焦点。 技术架构 GPT-4o假设拥有1000亿个参数&#xff0c;是GPT-4参数数量的两倍。这一庞大的模型规模&#xff0c;使得GPT-4…

重生之 SpringBoot3 入门保姆级学习(11、日志的进阶使用)

重生之 SpringBoot3 入门保姆级学习&#xff08;11、日志的进阶使用&#xff09; 3.2.4 文件输出3.2.5 日志文档的归档与切割 3.2.4 文件输出 配置 application.properties # 日志文件名 如果不写路径默认就是在项目根路径建立 demo.log 文件 推荐写法 D:\\demo.log 路径 文…

OSError: [Errno 117] Structure needs cleaning

一 问题描述 OSError: [Errno 117] Structure needs cleaning: /tmp/pymp-wafeatri 我重新使用SSH登录也会提示这个类似问题 二 解决方法 2.1 尝试删除报错的文件 &#xff08;想直接看最终解决方法的可忽略此处&#xff09; sudo rm -rf /tmp/pymp-wafeatri 此种方法只能保证…

docker image分析利器之dedockify

Dedockify 是一个用于逆向Docker 镜像并生成相应 Dockerfile 的工具。 它的主要功能是通过解析 Docker 镜像的metadata(也就是history)&#xff0c;重建出用于生成该镜像的 Dockerfile。 开源仓库地址: https://github.com/mrhavens/Dedockify 主要功能 逆向工程 Docker 镜像…

CISCN 2023 初赛 被加密的生产流量

题目附件给了 modbus.pcap 存在多个协议 但是这道题多半是 考 modbus 会发现 每次的 Query 末尾的两个字符 存在规律 猜测是base家族 可以尝试提取流量中的数据 其中Word Count字段中的22871 是10进制转16进制在转ascii字符串 先提取 过滤器判断字段 tshark -r modbus.pcap …

jenkins插件之plot

plot是一个生成图表的插件&#xff0c;这里我用于可视化phploc统计的数据 插件安装 进入 Dashboard --> 系统管理 --> 插件管理 --> Available plugins 搜索plot安装生成phploc分析数据 Dashboard --> 您的项目 --> Configuration点击 Build Steps点击 增加构…

振弦采集仪在岩土工程固结沉降监测中的应用研究

振弦采集仪在岩土工程固结沉降监测中的应用研究 岩土工程固结沉降是指土体在受到外力作用下&#xff0c;由于土体颗粒之间的重排结构&#xff0c;导致土体体积缩小和沉降的过程。固结沉降的监测对于岩土工程的设计和施工具有重要的意义&#xff0c;而振弦采集仪作为一种先进的…

物联网——TIM定时器、PWM驱动呼吸灯、舵机和直流电机

定时器概念&#xff08;常用于输出PWM波形&#xff0c;驱动电机&#xff09; 时间脉冲数时钟周期&#xff1b; 这里的脉冲数6553665536&#xff0c;支持定时器级联&#xff0c;从而延长定时 定时器类型 基本定时器原理图&#xff08;UI:更新中断&#xff0c; U:更新事件&#…

入门flask:Python后端开发的首选框架

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;从零开始学习弗拉斯克 二、弗拉斯克的微框架哲学 三、弗拉斯克的核心…

知识维权维权不是低价治理的唯一方法

控价对于品牌来说确实是一个重要的环节&#xff0c;它旨在维护品牌形象和市场秩序&#xff0c;防止渠道出现低价、窜货等不正当竞争行为。整个控价过程确实需要包括前期的数据监测、治理动作以及后期的数据分析&#xff0c;以确保控价的全面性和有效性。 在治理低价链接方面&a…

kali自带--DNS路由--信息搜集

目录 DNS信息搜集 whois fierce dnsenum 路由信息搜集 DNS信息搜集 whois whois 域名 --域名注册的时候填的基本信息. fierce 域名的多级域名? 搜索引擎-谷歌搜索 whois 枚举/递归查询 dnsenum dnsenum 域名 -f 文件名 路由信息搜集 icmp经常ping不通--所以kali出了个tcp的…

Pytorch 叶子节点和非叶子节点的理解

1.为什么要区分叶子节点和非叶子节点&#xff1f; 为了节省内存。在pytorch的计算图里只有两种元素&#xff1a;数据&#xff08;tensor&#xff09;和 运算&#xff08;operation&#xff09;。其中数据可分为&#xff1a;叶子节点&#xff08;leaf node&#xff09;和非叶子…

vue 笔记03

目录 01 vue 对象本身的属性和方法 02 computed计算属性的使用 03 filter过滤器的使用 04 使用key属性管理重复元素(虚拟dom原理) 05 MVC 和 MVVM 06 双向数据绑定原理 01 vue 对象本身的属性和方法 vue构造函数传入的是options对象 可以通过vue对象的$option获取 vm.$op…