【OceanBase诊断调优】—— 4013 内存爆问题的排查

ops/2024/10/21 0:11:20/

本文介绍 4013 内存爆问题的排查。

内存爆的类型

内存爆主要分为五类,可以通过关键词 OOPS 确定内存爆的类型。

内存爆的类型日志信息(关键字为 [OOPS])
SINGLE_ALLOC_SIZE_OVERFLOWsingle alloc size large than 4G is not allowed(alloc_size: %ld)
CTX_HOLD_REACH_LIMITctx memory has reached the upper limit(ctx_name: %s, ctx_hold: %ld, ctx_limit: %ld, alloc_size: %ld)
TENANT_HOLD_REACH_LIMITtenant memory has reached the upper limit(tenant_id: %lu, tenant_hold: %ld, tenant_limit: %ld, alloc_size: %ld)
SERVER_HOLD_REACH_LIMITserver memory has reached the upper limit(server_hold: %ld, server_limit: %ld, alloc_size: %ld)
PHYSICAL_MEMORY_EXHAUSTphysical memory exhausted(os_total: %ld, os_available: %ld, server_hold: %ld, errno: %d, alloc_size: %ld)

可以在内存爆的时间点(比如 20230730142424792),搜索 OOPS 日志,确定属于哪个类型的内存爆。

grep '\[OOPS\]' observer.log.20230730142424792

租户内存爆

检查是否存在 msg 信息,表示特定租户的内存爆。

yu688-68uty67y-7gy7768-hu8ut9

此处 msg 表示 1008 租户的内存爆了,需要进一步查看该租户下哪个 CTX_ID 的占用偏高。

1.1 分析租户的内存元信息,确定高内存占用的 CTX_ID

  1. 分析租户的内存元信息,确定高内存占用的 CTX_ID

    通过关键词 malloc_allocator.*tenant: 1008 可以获取租户的内存元信息(limitholdcache_hold),-A 可以显示更多的内存元信息的细节,包括该租户下各 CTX 的内存占用,以及租户线程的 PM 信息。

    78yh60-ju6967uy-78yh5oi8-79u6o89

    上述内存元信息显示 DEFAULT_CTX_IDDEFAULT_CTX_IDRPC_CTX_ID 占用比较高,需要进一步分析这些 CTX_ID 下占用最高的几个内存模块。

  2. CTX 的内存元信息分析

    查找和分析 DEFAULT_CTX_IDDEFAULT_CTX_IDRPC_CTX_ID 的内存元信息。

    以 DEFAULT_CTX_ID 举例 。

    68u560-dre65tuy-67r9oi8-68y589

    通过关键词 1008 ctx_id= DEFAULT_CTX_ID 可以获取 1008 租户的 DEFAULT_CTX_ID 的内存元信息(holdusedlimit、内存碎片清理信息),-A 可以显示该 CTX_ID 的各内存模块的内存占用。发现疑似导致内存爆的模块后,找模块 owner 进行最后的确定。

    CTX_ID 的内存元信息中 used与 hold 相差很大。

    686hty-uiy73tuy-ju32i8-cw7989

    存在二种可能(内存碎片、MEMORY 日志统计延时),可以通过查看内存爆所在的多个时刻的 CTX_ID 的内存元信息确定。

    68hr0-78hg5uy-jky99oi8-6y8ho89

    • 内存碎片。

      内存爆触发内存碎片清理机制,washed_size 会显著变大,hold 会减小到与 used 差不多大。

    • MEMORY 日志统计延时。

      • washed_size 变化幅度很小,可能会出现 used 大于 hold 的现象。一般是由内存快速膨胀导致的,需要找到内存膨胀模块。

      • 在内存爆所在时间段,搜索 CTX_ID 的 used 明显比较大的 MEMORY 日志,跟前后时刻的 MEMORY 日志进行比对,内存占用增幅最大的模块很可能就是内存膨胀模块。

        0ry40-f25ds9iuy-546g9oi8-byr43t89

      • 如果找不到 used 较大的 MEMROY 日志,需要等待复现(用脚本定时打印该 CTX_ID 中占用最高的几个内存模块,并且输出 alloc_bytes 最大的堆栈。

    当无明显占用较大的内存模块的情况

    • 确定占用最高的几个内存模块是否有已知内存问题未修复。

    • 占用最高的几个内存模块,是否有陌生的模块。

    有明显占用较大的内存模块。

    直接锁定占用最高的内存模块。

  3. kvcache 内存异常。

未发现占用较大的 CTX_ID,并且租户的大部分内存都是 kvcache,说明租户内存不足时挤占 kvcache 的内存失败了,需要确定失败的原因。

  1. 搜索关键词 T1008.*tenant sync wash failed, cache memblock info,其中 ref_count 不为 2 表示这块内存被应用层 hold 住了,status 不为 2 表示这块内存正在被 cache 使用。如果存在 ref_count 和 status 都为 2 的内存,则说明存在 bug,需要存储方面的分析。

    57fq30-ug56asy-t6ewi8-g68s9

  2. 搜索关键词 tenant_id.*1008 cache memory info,发现 cache_size 占用最大的模块,找 owner 分析占用是否符合预期。

    gr5a8u0-gh789iuy-hu6sei8-5h0549

OBServer 内存爆

  • 一般是500租户超卖导致的,可以先获取 500 租户的内存元信息,按照 租户内存爆 这一节的步骤来确定导致 OBServer 内存爆的模块。

  • 搜索关键词 CHUNK_MGR,确定 OBServer 是否存在大量缓存,若存在大量缓存则可能是 OBServer 缓存未设上限,导致 OBServer hold 的内存接近 memory_limit,此时申请大于 4M 的内存会失败。可以通过设置配置项 memory_chunk_cache_size 释放缓存。

  • 500 租户的内存占用符合预期,查看全部业务租户的内存元信息。

    • 全部业务租户的总 limit 超过了 memory_limit - system_memory,很可能是租户扩缩容时存在 BUG,或者其他问题。

    • 全部业务租户的总 limit 符合预期,可能是业务租户的规格设置过大,可以适当调小快速恢复业务。

CTX_ID 内存爆

按照 CTX 的内存元信息分析 这一节的步骤来确定导致 OBServer 内存爆的模块。

物理内存耗尽

常见原因是超卖机器的物理内存,一台机器上部署多个 OBServer,或者 OBServer 的 memory_limit 接近机器的物理内存。可以结合 tsar --mem 在内存爆时刻的日志进行验证。

无 OOPS 日志

  • 通过 CHUNK_MGR 日志确定是否是 OBServer 内存爆,若是 OBServer 内存爆则按照 OBServer 内存爆 这一节来排查问题。

  • 通过全部租户的内存元信息确定是否是租户内存爆,若是,则按照 租户内存爆 这一节来排查问题。

适用版本

OceanBase 数据库所有版本。


http://www.ppmy.cn/ops/18945.html

相关文章

MQ面试题

为什么要使用消息队列? 优点:解耦、异步、流量削峰 缺点:可用性降低、复杂性提高、一致性问题 为什么选择了RabbitMQ而不是其它的MQ? kafka是以吞吐量高而闻名,不过其数据稳定性一般,而且无法保证消息有…

建造者模式(装修公司装修套餐)

目录 定义 装修公司装修套餐 物料接⼝ 吊顶(ceiling) ⼀级顶 ⼆级顶 涂料(coat) 多乐⼠ ⽴邦 地板(floor) 德尔 圣象 地砖(tile) 东鹏 ⻢可波罗 代码实现 定义装修包接⼝ 装修包实现 建造者⽅法 测试验证 定义 建造者模式所完成的内容就是通过将多个简单对…

SQL 之 小技巧总结

一、如何查询一个字段数据中是否包含特定字符 eg:查看是否包含逗号(“,”) SELECT * FROM table_name WHERE column_name LIKE %,%;这里,% 是通配符,表示任意数量的任意字符。‘%,%’ 表示查询column_name中包含逗号…

flask_apscheduler 定时任务框架

简介 Flask_apscheduler是一个在Flask框架中使用的APScheduler库的扩展。APScheduler是一个用于调度任务的Python库,可以在指定的时间间隔调度函数、方法或任意可调用对象的执行。 Flask_apscheduler对APScheduler进行了集成,使得在Flask应用中可以简便…

Vue全局添加水印

1.创建warterMark.js /*水印配置*/ //声明 let watermark {} //水印配置 let setWatermark (str1, str2, str3) > {let id 1.23452384164.123412415// 移除水印 判断if (document.getElementById(id) ! null) {document.body.removeChild(document.getElementById(id)…

Web3D在电商行业的应用:开启沉浸式购物新纪元!

随着科技的不断进步,电子商务领域也在不断探索新的技术手段,以提供更加优质、便捷的购物体验。其中,Web3D技术的兴起,为电子商务带来了革命性的变化,开启了沉浸式购物的新纪元。 Web3D技术是一种在网页上呈现三维立体图…

计算机网络实验——学习记录五(TCP协议2)

一、TCP协议重传机制 TCP协议是一种面向连接、可靠的传输层协议。为了保证数据的可靠传输,TCP采用数据包重传的机制来应对网络传输过程中可能出现的丢包、错包和乱序等问题。 TCP协议的重传包括超时重传、快速重传、带选择确认SACK的重传和重复SACK重传四种。 二、…

Linux下基本指令-掌握

目录 为什么要学命令行 Linux下基本指令-掌握 ls 指令 pwd命令 cd 指令 touch指令 mkdir指令(重要): rmdir指令 && rm 指令(重要): man指令(重要): cp指…