首页 > 系统相关 >OceanBase -内存-内存泄漏

OceanBase -内存-内存泄漏

时间:2024-08-23 10:40:52浏览次数:12  
标签:泄漏 OceanBase 抓取 OB 内存 模块 内存模块

 

内存泄漏是指OB的某个租户内的某个内存模块占用内存过大,排查内存泄漏问题需要明确如下2个思路:

 

1,到底有没有发生泄漏:如果某个租户的某个内存模块的内存占用非常大,但是没有任何人干预的情况下,这个内存模块的内存自行降低,这是泄漏吗?一般我们不认为这是泄漏,某个内存模块使用的内存增加但是能自动恢复一般说明是某些行为导致了内存的增加,这些行为结束后,内存可以成功释放,不是泄漏,泄漏是指即使这些行为结束,内存模块的内存占用依然居高不下(有时会一直增加不会下降),这种一般才是泄漏

2,发生泄漏如何排查:明确某个内存模块发生泄漏后,按照如下文档进行内存泄漏的堆栈的抓取和排查:
《使用OB Memory Leaker诊断OB内存模块问题》


使用该方法抓取内存泄漏堆栈,需要明确如下几点:
1,在memleak的抓取开启期间,内存模块是否处于继续增长的状态,如果在抓取memleak期间,异常的内存模块内存大小无明显变化,则抓取不成功
抓取memleak会略微影响ob的性能,但是感知不明显,需要和甲方进行说明。

2,内存泄漏为什么要抓堆栈?

3,抓了堆栈之后,就能定位泄漏原因了吗?

4,如果是sql导致内存泄漏,如何定位造成内存泄漏的sql呢?

 

《使用OB Memory Leaker诊断OB内存模块问题》

 

发生原因
由于OBServer内核的原因,导致OBServer的某一个模块(Mod)的内存消耗持续增长,内存增长的情况可以通过OB的虚表__all_virtual_memory_info监控到。从现象上怀疑这个模块有内存泄露的情况,需要进一步理解和诊断OB内核的哪一部分代码路径在分配内存,分析是否符合预期。


解决办法:
1. 通过__all_virtual_memory_info 找到内存不断增长的模块,并将模块的名字记录成mod1;
2. 通过alter system set leak_mod_to_check='mod1' 开启mod模块的内存分配监控。比如说想要捕获libeasy context中OB_TEST2_PCODE 模块的内存的代码路径,可以用一下SQL进行开启:
过alter system set leak_mod_to_check='OB_TEST2_PCODE'
3. 重现问题(必须重建问题后停止抓取memleak,不然抓取无效),监控mod1的内存使用(通过observer.log 或者__all_virtual_memory_info), 观察到问题重现,mod1内存一直上涨;
4. select * from __all_virtual_mem_leak_checker_info order by alloc_count; 有内容后将结果保留成文本格式;
5. 在开启内存监控追踪功能后发现目标模块mod1内存增长, 且步骤4可以看到该模块的内存分配代码路径(为地址hex值,这意味着已经捕捉到了内存增长(泄露)的凶手,此时可以通过SQL将内存分配监控停下来: alter system set leak_mod_to_check= '';
6. 将步骤3中的back_trace字段内容拷贝出来,尝试用 addr2line -pCfe $observer $back_trace打印出来栈信息: 例如
addr2line -pCfe /home/admin/oceanbase/bin/observer $back_trace
7. 将步骤3,4,6步骤中的内容发回来OB技术支持进行分析诊断。

 

 

 

---- 以上内容来自某大神笔记,如有侵权,请联系删除

标签:泄漏,OceanBase,抓取,OB,内存,模块,内存模块
From: https://www.cnblogs.com/bayaim/p/18375478

相关文章

  • OceanBase 日常运维-问题分类
    ---- 2.x/3.x常见问题排查思路----2024年8月23日10:15:26第一、全链路诊断:  CPU问题:内存问题(-4030、-4013):内存泄漏:CORE问题:链接类问题(异常断链、连接不上等):SQL执行相关(失败、慢等):备份恢复问题:长事务与悬挂事务:切主问题(有主改选、无主选举):CLOG盘满:UNIT迁移和缩容:合并:......
  • CPU和内存如何交互的
    CPU和内存之间通过总线进行交互,主要包括以下几个方面:一、指令读取CPU需要执行指令时,会向内存发送地址信号,指定要读取指令的存储位置。内存根据地址信号,将相应存储单元中的指令数据通过数据总线传送给CPU。CPU接收到指令后,对其进行译码和执行。二、数据存取当CPU需......
  • C中的内存分配模型
    在C语言中,内存分配主要分为以下几个区域:一、栈(Stack)存储内容:局部变量:在函数内部声明的变量,包括自动变量和函数参数。函数调用信息:当函数被调用时,会在栈上分配空间来存储函数的返回地址、参数和局部变量。特点:内存由编译器自动管理,分配和释放非常高效。空间相对较......
  • 【HW系列+技战法】内存马的Webshell联合对抗技战法
    原创BeatRex的成长记录一、技战法概述二、Webshell对抗手段2.1落地文件型Webshell检测与对抗2.1无文件型内存马检测与对抗2.3Webshell免杀对抗一、技战法概述Webshell是黑客经常使用的一种后门,其目的是获得服务器的执行操作权限,常见的Webshell编写语言为A......
  • JESD79-5C_v1.30-2024 JEDEC DDR5 SOLID STATE TECHNOLOGY ASSOCIATION 最新内存技术
    JESD79-5C_v1.30-2024JEDECDDR5SOLIDSTATETECHNOLOGYASSOCIATION最新DDR5内存技术规范​JEDEC技术协会公布新DDR5内存规范、更稳定、安全,支持PRAC新技术下载: https://download.csdn.net/download/tgs2033/89661013样本下载:链接:https://pan.baidu.com/s/13-Ioep......
  • 不同平台下对进程资源进行限制(CPU与内存)
    不同平台下对进程资源进行限制(CPU与内存)因实际工作中发现,如果不对某些进程硬件资源进行限制,可能某个进程会把操作系统资源耗尽,导致操作系统死机等问题出现。于是就想,是否有什么方法可以限制指定进程内存使用上限,避免其无上限申请内存。WindowsWindows平台可通过作业对......
  • 【C语言进阶】数据如何安家?C语言内存中的存储艺术深度解析
    ......
  • 内存的操作
    我们对于内存的操作借助于string.h这个库提供的内存操作函数。内存填充头文件:#include<string.h>函数原型:void*memset(void*s,intc,size_tn);函数功能:填充s开始的堆内存空间前n个字节,使得每个字节值为c。函数参数:void*s:待操作内存首地址。intc:填充的字节数据......
  • 引发C++程序内存泄漏的常见原因分析与排查方法总结
    目录1、概述2、内存泄漏与程序的位数3、调用哪些接口去动态申请内存?4、引发内存泄漏的常见原因总结4.1、通过malloc/new等动态申请的内存,在使用完后,没有调用free/delete去释放(也可能是调用了上面讲到的HeapAlloc或VirtualAlloc等API接口)4.2、函数调用者调用内部申请内存......
  • IPC对象通信方式---共享内存 | 网络通信 -编程
    共享内存共享内存机制其允许两个或多个进程共享一个给定的存储区,这一段存储区可以被两个或两个以上的进程映射至自身的地址空间中,一个进程写入共享内存的信息,可以被其他使用这个共享内存的进程,通过一个简单的内存读取错做读出,从而实现了进程间的通信。是内核预留的内存空间,最......