【巨杉数据库SequoiaDB】巨杉Tech | 巨杉数据库的并发 malloc 实现

本文由巨杉数据库北美实验室资深数据库架构师撰写,主要介绍巨杉数据库的并发malloc实现与架构设计。原文为英文撰写,我们提供了中文译本在英文之后。

SequoiaDB Concurrent malloc Implementation

Introduction

In a C/C++ application, the dynamic memory allocation function malloc(3) can have a significant impact on the application’s performance. For multi-threaded applications such as a database engine, a sub-optimal memory allocator can also limit the scalability of the application. In this paper, we will discuss several popular dynamic memory allocator, and how SequoiaDB addresses the dynamic memory allocation problem in its database engine.

dlmalloc/ptmalloc

The GNU C library (glibc) uses ptmalloc, which is an allocator forked from dlmalloc with thread-related improvement. Memories are allocated as chunks, which is 8-byte aligned data structure containing a header and usable memory. This means there is at least an 8 or 16 byte overhead for memory chunk management. Unallocated memory is grouped by similar sizes and maintained by a double-linked list of chunks.

jemalloc

Originally developed by Jason Evans in 2005, jemalloc has since been adopted by FreeBSD, Facebook, Mozilla Firefox, MariaDB, Android and etc. jemalloc is a general purpose malloc(3) implementation that emphasizes fragmentation avoidance and scalable concurrency support. In order to avoid lock contention, jemalloc uses separate memory pool “arenas” for each CPU, and threads are assigned to an arena to handle malloc requests.

tcmalloc

TCMalloc is a malloc developed by Google. It reduces lock contention for multi-threaded programs by utilizing thread-local storage for small allocations. For large allocations, mmap or sbrk can be used along with fine grained and efficient spinlocks. It also has garbage-collection for local storage of dead threads. For small objects allocation, TCMalloc requires just one-percent space overhead for 8-byte objects, which is very space-efficient.

Here is a test done to compare the performance of jemalloc and tcmalloc. The test involves 500 iterations of performing 1000 memory allocation, then free these 1000 memory. As seen both of them have very similar performance.

SequoiaDB Implementation

In SequoiaDB 3.4, it implements its own proprietary memory allocator, which is highly efficient and tailored for the memory usage within the SequoiaDB database engine. While jemalloc and tcmalloc are both excellent general purpose memory allocator, they cannot address all the challenges that are encountered within SequoiaDB. For example, the ability to trace memory requests is an important requirement in SequoiaDB engine, and this feature is lacking in existing third-party memory allocators. Figure 2 shows the architecture of the SequoiaDB memory model. There are three layers - thread, pool and OSS (Operating System Services).

?

OSS Layer

The OSS layer provides malloc API which requests memory from the underlying operating system. This is also where the pool layer gets the memory from.

Pool Layer

The pool layer is a global memory pool which contains segments of different size. A segment is a contiguous memory block that is allocated from the OSS Layer. Each segment is divided into fixed-size chunks. By default there are 32-byte, 64, 128…8092-byte chunk-size. Requests above the 8092-byte max chunk-size threshold will be serviced by the OSS layer.

Thread Layer

The thread layer is a thread-local cache, with each thread having its own private cache, therefore memory allocation can be done in a lock-free manner. Memory chunks are grouped together by their chunk size, implemented using a linked-list. Memory chunks are requested and cached from the pool layer up to a configured threshold. For memories exceeding this threshold, they are released back to the pool layer, and can be reused by other threads. This design helps limit the overall memory footprint. In addition, each thread has a single elastic-big-block, which is used to service requests above max chunk-size threshold. Therefore, in most cases requests can be fulfilled in the thread layer, which is efficient and fast.

In addition, the SequoiaDB memory model also has built-in memory-debugging capability to detect memory corruption. It also has a trace feature which can track down where memories are being requested from. On top of that, it is fully configurable, and allow deployment to be customized according to customers workload and environment.

以下为中文译本

介绍

在 C / C ++ 应用程序中,动态内存分配函数 malloc(3) 会对应用程序的性能产生重大影响。对于诸如数据库引擎之类的多线程应用程序,优化不足的内存分配器也会限制应用程序的可伸缩性。在本文中,我们将讨论几种流行的动态内存分配器,以及 SequoiaDB 如何解决其数据库引擎中的动态内存分配问题。

dlmalloc/ptmalloc

GNU C 库 (glibc) 使用 ptmalloc,它是从 dlmalloc 派生的具有线程相关改进的分配器。内存被分配为块,这是 8byte 对齐的数据结构,其中包含标头和可用内存。这意味着内存块管理至少有 8 或 16byte?的开销。未分配的内存按相似的大小分组,并由块的双向链接列表维护。

jemalloc

jemalloc 最初由 Jason Evans 于2005年开发,此后已被 FreeBSD,Facebook,Mozilla Firefox,MariaDB,Android 等采用。jemalloc 是通用的 malloc(3) 实现,主要特点是避免碎片化和可扩展的并发支持。为了避免锁竞争,jemalloc 为每个 CPU 使用单独的内存池“区域”,并且将线程分配给区域以处理 malloc?请求。

tcmalloc

TCMalloc 是 Google 开发的 malloc。通过利用线程本地存储进行小的分配,它减少了多线程程序的锁争用。对于较大的分配,可以将 mmap 或 sbrk 与细粒度且高效的自旋锁一起使用。它还具有垃圾收集功能,用于死线程的本地存储。对于小对象分配,TCMalloc 仅需要8个字节对象的百分之一的空间开销,这非常节省空间。

这是一个测试,用于比较 jemalloc 和 tcmalloc 的性能。该测试涉及500次迭代以执行1000个内存分配,然后释放这1000个内存。如图所示,它们两者的性能十分接近。

SequoiaDB的实现

在 SequoiaDB ?中(以 SequoiaDB v3.4 作为例子),它实现了自己专有的内存分配器,该分配器高效且针对 SequoiaDB 数据库引擎中的内存使用量身定制。尽管 jemalloc 和 tcmalloc 都是出色的通用内存分配器,但它们无法解决 SequoiaDB 内部遇到的所有挑战。例如,跟踪内存请求的能力是 SequoiaDB 引擎的一项重要要求,而现有的第三方内存分配器缺少此功能。图2显示了 SequoiaDB 内存模型的体系结构。共有三层-线程,池和 OSS(操作系统服务)。

?
?

OSS Layer

OSS 层提供了 malloc API,该 API 向底层操作系统请求内存。这也是 PoolLayer?从中获取内存的位置。

Pool Layer

Pool Layer 是全局内存池,其中包含不同大小的段。段是从 OSS 层分配的连续内存块。每个段分为固定大小的块。默认情况下,有32字节,64、128…8092字节的块大小。超过8092字节最大块大小阈值的请求将由 OSS?层处理。

Thread Layer

线程层是线程本地缓存,每个线程都有其自己的专用缓存,因此可以无锁方式完成内存分配。内存块按其块大小分组在一起,使用链接列表实现。从 Pool Layer 请求内存块并将其缓存到配置的阈值。对于超过此阈值的内存,它们将释放回 Pool Layer 并可以由其他线程重用。

此设计有助于限制整体内存占用。此外,每个线程都有一个弹性大块,用于服务超过最大块大小阈值的请求。因此,在大多数情况下,可以在线程层中满足请求,这既高效又快速。

此外,SequoiaDB 内存模型还具有内置的内存调试功能,可以检测内存损坏。它还具有跟踪功能,可以跟踪从哪里请求内存。最重要的是,它是完全可配置的,并允许根据客户的工作量和环境自定义部署。

原文地址:https://blog.51cto.com/13722387/2471030

时间: 2024-10-08 21:26:06

【巨杉数据库SequoiaDB】巨杉Tech | 巨杉数据库的并发 malloc 实现的相关文章

【巨杉数据库SequoiaDB】巨杉Tech | 四步走,快速诊断数据库集群状态

1.背景 SequoiaDB 巨杉数据库是一款金融级分布式数据库,包括了分布式 NewSQL.分布式文件系统与对象存储.与高性能 NoSQL 三种存储模式,分别对应分布式在线交易.非结构化数据和内容管理.以及海量数据管理和高性能访问场景. 集群一般会使用三副本方式以确保数据安全.假若集群发生因硬件故障等原因导致的节点故障或集群异常,数据库管理员应进行系统的分析和诊断,以确保集群正常工作,不会影响用户的正常使用.本文将与大家分享一下基本的 SequoiaDB 数据库诊断方法. 数据库集群诊断 1)

【巨杉数据库SequoiaDB】巨杉 Tech | 并发性与锁机制解析与实践

01 概述 数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性.加锁是实现数据库并发控制的一个非常重要的技术.当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁.加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作. OLTP 场景下通常要求具有很高的并发性.并发事务实际上取决于资源的使用状况,原则上应尽量减少

【巨杉数据库SequoiaDB】点燃深秋,巨杉数据库亮相DTC数据技术嘉年华大会

2019年11月15日,第九届数据技术嘉年华大会在北京隆重召开,本次大会以 "开源 ? 智能 ? 云数据 - 自主驱动发展 创新引领未来" 为主题,探索数据价值,共论智能未来.SequoiaDB 巨杉数据库作为领先的金融级分布式关系型数据库,为大家带来新一代分布式数据库的发展趋势和特性,也通过分享巨杉的丰富金融级实践经验,帮助大家充分了解分布式数据库当前的应用场景. ****分布式数据库发展趋势 在上午主会场的分享中,巨杉数据库联合创始人王涛,为大家带来了题为"新一代分布式数

【巨杉数据库SequoiaDB】巨杉?具系列之一 | ?对象存储?具sdblobtool

近期,巨杉数据库正式推出了完整的SequoiaDB 工具包,作为辅助工具,更好地帮助大家使用和运维管理分布式数据库.为此,巨杉技术社区还将持续推出工具系列文章,帮助大家了解巨杉数据库丰富的工具矩阵. 本文作为系列第一篇,将分享巨杉数据库大数据存储工具 sdblobtool 的基本介绍和应用实践.巨杉工具矩阵 一.对象存储与自建存储对比通俗地讲,自建存储就是自己购买服务器设备存储文件,通过运维人员手工进行文件的上传下载.而对象存储,则是使用不同的存储形态来存储文件.目前,对象存储独立的存储形态有三

【巨杉数据库SequoiaDB】巨杉数据库 v5.0 Beta版 正式发布

2020年疫情的出现对众多企业运营造成了严重的影响.面对突发状况,巨杉利用长期积累的远程研发协作体系,仍然坚持进行技术创新,按照已有规划--推进研发工作,正式推出了巨杉数据库(SequoiaDB) v5.0 Beta版. 我们也在这里向大家介绍一下,SequoiaDB v5.0 版本中将会包含哪些激动人心的功能和特性. ARM架构的官方支持 从 3.2 版本开始,SequoiaDB 已经在有限版本中支持 ARM 芯片服务器与国产操作系统.从 SequoiaDB v5.0 开始,我们正式官方支持飞

【巨杉数据库SequoiaDB】为“战疫” 保驾护航,巨杉在行动

2020年,我们经历了一个不平静的新春,在这场大的"战疫"中,巨杉数据库也积极响应号召,勇于承担新一代科技企业的社会担当,用自己的行动助力这场疫情防控阻击战! 赋能"战疫"快速响应 巨杉数据库目前服务许多政府部门应用平台,其中在广州市电子政务中心,就管理了全市近1500万人口的海量医保社保相关数据.医保.社保是抗击疫情工作的"弹药库",也是市民面对疫病的"定心丸". 目前,服务该业务的巨杉数据库集群,在2020年实现系统0错误

【巨杉数据库SequoiaDB】限额开放!巨杉数据库中级工程师认证计划正式开启!

课程背景和规划介绍 巨杉大学的学习和认证包括SCDA(巨杉数据库认证技术专员),SCDP(巨杉数据库中级工程师认证),SCDE(巨杉数据库高级工程师认证),SCDD(巨杉数据库认证开发者)等计划,未来还将持续推出针对行业用户.数据库运维.开发者和开源社区爱好者更多学习计划,共同拓展行业广度和技术深度. 巨杉大学的 SCDP(巨杉数据库中级工程师认证)计划,直接上手操作使用,直观体验分布式数据库功能技术.在线交互学习测试,根据代码验证测试结果,帮助大家快速掌握分布式数据库运维管理. Talk is

【巨杉数据库SequoiaDB】助力金融科技升级,巨杉数据库闪耀金融展

11月4日,以"科技助创新 开放促改革 发展惠民生"为主题的2019中国国际金融展和深圳国际金融博览会在深圳会展中心盛大开幕. 金融分布式数据库成为关注焦点巨杉数据库作为金融行业广泛应用的自研分布式数据库产品,亮相金融展,成为本次展会金融科技领域的焦点之一.同时,在展会的"金融科技发展趋势研讨会"上,巨杉数据库分享了"自研金融级分布式数据库应用与实践"专题,介绍巨杉数据库8年的自研技术发展历程以及深耕银行8年以来的规模应用场景案例.金融科技是技术

MySQL数据库(6)_MySQL数据库总结

sql语句规范 sql是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言. 在使用它时,只需要发出"做什么"的命令,"怎么做"是不用使用者考虑的.SQL功能强大.简单易学.使用方便,已经成为了数据库操作的基础,并且现在几乎所有的数据库均支持sql. <1> 在数据库系统中,SQL语句不区分大小写(建议用大写) .但字符串常量区分大小写.建议命令大写,表名库名小写: