OceanBase 集群运行中,有时候会出现有的模块占用内存极高,但是日志又没有明显的泄露现象,这时候就需要想办法抓取内存碎片。本文讲述如何抓取这部分内存碎片。
适用版本
OceanBase 数据库 V2.x 和 V3.x 版本。
操作步骤
在 OceanBase 数据库的部署目录,新增
etc/dump.config文件, 写入 dump 内存信息的范围。# 输出全部内存的元数据 echo'dump chunk all'>etc/dump.config # 输出指定租户ID、context的内存元数据, echo'dump chunk tenant_id=$tenant_id,ctx_id=$ctx_id'>etc/dump.config如果要指定
tenant_id和ctx_id,可以分别从以下系统表中查看。select tenant_id from __all_tenant where tenant_name='xxx'; select ctx_id from __all_virtual_memory_info where ctx_name='xxx';使用
kill -62 $pid命令向 observer 进程发送搜集命令,其中$pid为 observer 进程的 pid。搜集的信息保存在log/memory_meta文件中。该命令为一次性搜集,不需要人工干预来停止执行。下载 memory_meta_parser 工具来解析
memory_meta文件。# 下载memory_meta_parser工具 git clone git@gitlab.alibaba-inc.com:nijia.nj/memory_meta_parser.git # 解析memory_meta文件 ./parse.sh$memory_meta_file查询临时数据库文件
tmp.db。# 执行 sqlite3tmp.db 进入客户端 sqtite3tmp.db # 查询 chunk, block, object 三张表, 这三张表中保存着所需的内存元数据 select * from chunk; select * from block; select * from object;