【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】OB
【 使用版本 】4.x
【问题描述】
1.为什么ob的ob_malloc接口自己实现了一套内存缓存,不直接使用ptmalloc/tcmalloc/jemmaloc,ob malloc相对于直接使用ptmalloc/tcmalloc/jemmaloc有什么性能或者利用率的优势吗?
2.看到了面对多线程竞争使用主分配区和非主分配区的设计,那ob malloc整体设计是不是类似ptmalloc?
3.现在代码应该是抛弃了之前的ob tc malloc,那主分配区和非主分配区的设计在高并发时性能时,应该不如之前的ob tc malloc吧,毕竟是有锁的?
【复现路径】问题出现前后相关操作
OceanBase数据库自研了一套libc风格的接口函数ob_malloc/ob_free/ob_realloc,这套接口会根据tenant_id、ctx_id、label等属性动态申请大小为size的内存块,并且为内存块打上标记,确定归属。这不仅方便了多租户的资源管理,而且对诊断内存问题有很大帮助。
你可以在github上看源码 看看设计接口
您的问题涉及到了 OceanBase 数据库内存管理的具体实现细节,特别是关于 ob_malloc
接口的设计理念及其相对于其他内存分配器如 ptmalloc、tcmalloc、jemalloc 的优势,以及其并发性能表现。下面我会根据已有的文档信息尽可能地回答您的问题:
-
为什么 OceanBase 实现了自己的内存分配器
ob_malloc
?OceanBase 选择实现自己的内存分配器主要是为了更好地适应其分布式数据库的特性,特别是在内存管理和高并发场景下的性能需求。 [1]
- 性能优化:OceanBase 的内存管理设计旨在支持高并发环境下的高效内存分配与回收。自定义的内存分配器可以根据 OceanBase 的具体应用场景进行优化,从而获得更好的性能。
- 内存利用率:考虑到 OceanBase 的多租户特性,自定义内存分配器可以更好地支持租户间的内存隔离和动态调整,提高内存利用率。
- 定制化需求:OceanBase 的内存分配器设计还考虑到了分布式数据库特有的需求,比如需要支持多租户内存隔离、内存统计等特性,这些是通用内存分配器难以满足的。
-
ob_malloc
是否类似 ptmalloc?ob_malloc
的设计确实借鉴了 ptmalloc 的一些思想,比如引入了主分配区和非主分配区的概念来减少锁的竞争,提高并发性能。 [1]- 主分配区 vs 非主分配区:这种设计允许每个线程有自己的局部内存池(非主分配区),只有当局部内存池不足时才会去主分配区申请内存,这样减少了全局锁的竞争,提高了并发性能。
-
与 ptmalloc 的区别:尽管有相似之处,但
ob_malloc
在细节上做了许多针对 OceanBase 特性的优化,比如支持租户级别的内存管理、内存统计等。
-
抛弃了 ob tc malloc 后,性能是否下降?
关于您提到的抛弃了 ob tc malloc 后性能变化的问题,虽然文档中没有直接提及这一点,但从设计理念上看,新的
ob_malloc
设计仍然致力于提升并发性能。 [1]-
并发性能:即使引入了锁机制,但通过合理的锁粒度控制和高效的内存分配策略,
ob_malloc
依然能够在高并发环境下保持良好的性能。 - 优化方向:OceanBase 的内存管理设计一直在不断演进,每次改进都是为了更好地平衡性能与资源利用率,因此即使引入了一些锁机制,也不一定会导致性能下降。
-
并发性能:即使引入了锁机制,但通过合理的锁粒度控制和高效的内存分配策略,
综上所述,OceanBase 的 ob_malloc
设计充分考虑了分布式数据库的特殊需求,通过一系列定制化的优化措施实现了高效、灵活的内存管理。如果您有关于特定技术细节的疑问,建议查阅 OceanBase 官方文档或联系技术支持获取更详细的解答。
检索到的文档如下:
如果是为了统计内存分配模块占用、多租户内存隔离和诊断的话,应该也可以直接用通用内存分配器,然后在上面做一层呀。我其实想知道ob_malloc有没有性能和内存使用率方面的优势,相比于通用内存分配器,有没有实际做过测试