巨杉Tech | 巨杉資料庫的並發 malloc 實現

2021-02-21 巨杉資料庫

本文由巨杉資料庫北美實驗室資深資料庫架構師撰寫,主要介紹巨杉資料庫的並發malloc實現與架構設計。原文為英文撰寫,我們提供了中文譯本在英文之後。


SequoiaDB Concurrent malloc Implementation
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.
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.
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 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.
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).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.

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.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 如何解決其資料庫引擎中的動態內存分配問題。

GNU C 庫 (glibc) 使用 ptmalloc,它是從 dlmalloc 派生的具有線程相關改進的分配器。內存被分配為塊,這是 8byte 對齊的數據結構,其中包含標頭和可用內存。這意味著內存塊管理至少有 8 或 16byte 的開銷。未分配的內存按相似的大小分組,並由塊的雙向連結列表維護。

jemalloc 最初由 Jason Evans 於2005年開發,此後已被 FreeBSD,Facebook,Mozilla Firefox,MariaDB,Android 等採用。jemalloc 是通用的 malloc(3) 實現,主要特點是避免碎片化和可擴展的並發支持。為了避免鎖競爭,jemalloc 為每個 CPU 使用單獨的內存池「區域」,並且將線程分配給區域以處理 malloc 請求。

TCMalloc 是 Google 開發的 malloc。通過利用線程本地存儲進行小的分配,它減少了多線程程序的鎖爭用。對於較大的分配,可以將 mmap 或 sbrk 與細粒度且高效的自旋鎖一起使用。它還具有垃圾收集功能,用於死線程的本地存儲。對於小對象分配,TCMalloc 僅需要8個字節對象的百分之一的空間開銷,這非常節省空間。這是一個測試,用於比較 jemalloc 和 tcmalloc 的性能。該測試涉及500次迭代以執行1000個內存分配,然後釋放這1000個內存。如圖所示,它們兩者的性能十分接近。

在 SequoiaDB  中(以 SequoiaDB v3.4 作為例子),它實現了自己專有的內存分配器,該分配器高效且針對 SequoiaDB 資料庫引擎中的內存使用量身定製。儘管 jemalloc 和 tcmalloc 都是出色的通用內存分配器,但它們無法解決 SequoiaDB 內部遇到的所有挑戰。例如,跟蹤內存請求的能力是 SequoiaDB 引擎的一項重要要求,而現有的第三方內存分配器缺少此功能。圖2顯示了 SequoiaDB 內存模型的體系結構。共有三層-線程,池和 OSS(作業系統服務)。

OSS 層提供了 malloc API,該 API 向底層作業系統請求內存。這也是 PoolLayer 從中獲取內存的位置。

Pool Layer 是全局內存池,其中包含不同大小的段。段是從 OSS 層分配的連續內存塊。每個段分為固定大小的塊。默認情況下,有32位元組,64、128…8092位元組的塊大小。超過8092位元組最大塊大小閾值的請求將由 OSS 層處理。

線程層是線程本地緩存,每個線程都有其自己的專用緩存,因此可以無鎖方式完成內存分配。內存塊按其塊大小分組在一起,使用連結列表實現。從 Pool Layer 請求內存塊並將其緩存到配置的閾值。對於超過此閾值的內存,它們將釋放回 Pool Layer 並可以由其他線程重用。

此設計有助於限制整體內存佔用。此外,每個線程都有一個彈性大塊,用於服務超過最大塊大小閾值的請求。因此,在大多數情況下,可以在線程層中滿足請求,這既高效又快速。

 

 

此外,SequoiaDB 內存模型還具有內置的內存調試功能,可以檢測內存損壞。它還具有跟蹤功能,可以跟蹤從哪裡請求內存。最重要的是,它是完全可配置的,並允許根據客戶的工作量和環境自定義部署。

參與任一活動,堅持學習並通過考試即可獲得巨杉學院認證的SCDA證書與專屬定製禮品~

相關焦點

  • 巨杉分享 | 巨杉資料庫在數據湖中的應用實踐
    為此,「巨杉最具價值專家SVP」技術交流會特別邀請巨杉北美實驗室核心成員Danny Chen ,講解數據湖的技術原理與巨杉資料庫在數據湖中的應用實踐。從架構演進來說,數據湖可以理解為一個storage即存儲區域,存放內容多為原始數據,也叫做裸數據。
  • 巨杉Tech | SequoiaDB高可用原理詳解
    ,並詳細介紹巨杉分布式資料庫的高可用實現。通過對本文的閱讀,小夥伴們能夠了解到傳統資料庫的高可用實現方式,包括;主備結構和集群架構;了解到大名鼎鼎的RAFT算法;然後最重要的,巨杉分布式資料庫是如何實一致性的,如何保證在集群環境中實現數據不錯不丟。資料庫系統存儲了一個IT系統的業務數據,可以說是IT系統的大腦。
  • 巨杉內核筆記 | MVCC多版本控制原理
    本文主要介紹巨杉資料庫SequoiaDB分布式事務隔離性中的隔離級別,以及MVCC多版本並發控制機制解決並發處理過程中出現幻讀的實現原理。巨杉資料庫SequoiaDB 通過對只讀操作訪問的數據記錄實行不同的加鎖協議來實現不同的隔離級別。一般來說,隔離級別越高,只讀操作的請求鎖定就越嚴格,鎖的持有時間越長。
  • 巨杉Tech | SequoiaS3 原理及最佳實踐
    SequoiaS3是基於巨杉資料庫實現的一種對象存儲服務,具備可擴展、數據高可用、安全、高性能等特性。
  • 巨杉資料庫完成數億元D輪融資,深藍資本擔任獨家財務顧問
    具體展開,公司產品SequoiaDB 巨杉資料庫是一款金融級分布式關係型資料庫,其自研的原生分布式存儲引擎支持完整 ACID,具備彈性擴展、高並發和高可用特性,兼容 MySQL、PostgreSQL、MongoDB和 SparkSQL 等8種訪問形式。巨杉資料庫的多模數據引擎還為客戶提供結構化、半結構化、以及非結構化的一體化數據管理能力。
  • IBM Power8&巨杉資料庫算法挑戰賽火熱來襲!
    巨杉資料庫與IBM POWER8,作為新一代大數據平臺和硬體的代表,聯合主辦本次「POWER8 & 巨杉資料庫算法挑戰賽」,旨在希望參賽的開發者通過比賽,能夠切身體會到POWER8與巨杉資料庫的優勢。
  • 巨杉資料庫成功入選「2020中國企業服務獨角獸TOP50」
    巨杉資料庫憑藉科創成果和客戶認可成功入選「2020中國企業服務獨角獸TOP50榜單」,體現了巨杉資料庫的科創實力和價值,也充分證明了巨杉資料庫在金融級資料庫領域的地位。後疫情時代下,以技術創新為驅動的新基建為各行各業帶來了先進的生產力。巨杉資料庫作為金融級分布式資料庫,始終堅持以客戶為中心、以技術為底蘊、以市場為導向的價值觀,不斷推動金融機構數位化轉型。
  • 巨杉Tech | 使用 SequoiaDB + Docker + Nodejs 搭建 Web 伺服器
    SequoiaDB 巨杉資料庫於3.2.1版本正式推出了 Docker 容器化部署方案,本文將會基於 SequoiaDB 巨杉資料庫與 Nodejs 的 Docker 鏡像搭建一個簡易的 Web 伺服器。我們將會搭建一個三分區三副本的高可用 SequoiaDB 巨杉資料庫。同時,我們將會創建一個SequoiaDB 巨杉資料庫的 MySQL 實例,用以提供 Nodejs 作為數據源。
  • 構建中國雲生態 | 華雲數據與巨杉資料庫完成產品兼容互認證 攜手推動信創產業可持續發展
    巨杉資料庫自2011年成立以來,專注資料庫產品研發,堅持從零開始打造原生分布式資料庫引擎。2017年巨杉資料庫與阿里雲同年入選Gartner報告,成為首家入選Gartner報告的國產獨立資料庫廠商,連續三年入榜Gartner全球權威報告。
  • 巨杉系列工具 | 集群分析工具sdbtop
    近期,巨杉資料庫正式推出了完整的 SequoiaDB 工具包,作為輔助工具,更好地幫助大家使用和運維管理分布式資料庫
  • 巨杉資料庫王濤:區塊鏈觀點兩極分化,程式設計師應關注其技術本質
    像在比特幣當前的代碼實現中,CTxMemPool對象中存在大量的持有全局鎖函數。由於UTXO需要追蹤每一個coin的花費流程,在內存中形成一個巨大的樹狀模型,因此絕大部分需要跟蹤交易的操作都需要對內存池進行全局鎖定,導致執行效率相對低下。相比起傳統資料庫緩衝池的數據頁模型,比特幣的UTXO實現方式有待進行大量優化和提升。
  • 【SDCC講師專訪】巨杉資料庫創始人兼CTO王濤:SequoiaDB為何要開源?
    CSDN:兩年前,你創立了巨杉資料庫,是什麼樣的緣由讓你走上創業之路的?為何取名叫「巨杉」有什麼特別的意義嗎?王濤:IBM的近十年工作時間,我對整個資料庫技術和行業有了比較深刻的認識。而在IBM這樣的大公司當中,創新的阻力不只是來自於外部,公司內部對於顛覆性的創新也有很多阻礙。
  • 巨杉Tech | 十分鐘快速搭建 Wordpress 博客系統
    默認情況下,Wordpress一般在後臺使用MySQL關係型資料庫存儲所有的博文及回復。本文將展示如何使用 SequoiaDB 巨杉分布式資料庫替換MySQL,成為Wordpress博客系統的後臺關係型資料庫。 通過閱讀本文,用戶可以了解到如何使用SequoiaDB巨杉資料庫的MySQL實例無縫替換標準MySQL資料庫。
  • 巨杉資料庫 CTO 王濤:新一代分布式資料庫
    今天非常榮幸能夠參與這次「2019數據技術嘉年華」大會,我是巨杉資料庫的CTO 王濤,今天我匯報的主題是:「新一代分布式資料庫」。分布式資料庫也並不是最近幾年剛興起的詞語,我自己原來做IBM  DB2的,可能很多人不知道DB2是支持分布式事務的關係型資料庫。IBM  DB2從上世紀90年代開始做分布式資料庫,同時也支持分布式事務。
  • 微服務和資料庫到底是什麼關係?
    巨杉資料庫,適合微服務的分布式資料庫正如同巨杉對於分布式資料庫的技術定位和目標,巨杉資料庫SequoiaDB本身就是以分布式存儲底座與上層的資料庫實例兩層來進行構建的事實上,傳統單點資料庫的容量瓶頸,僅僅是分布式資料庫所解決的問題之一。更重要的是在未來微服務化應用開發以及雲化平臺的趨勢下,應用不再以「煙囪式」的中間件加資料庫模式進行構建,而是採用數千甚至上萬的微服務程序構建成的複雜網狀模型。因此,分布式資料庫需要能夠滿足上層應用的彈性擴展、高並發、高吞吐量、與靈活敏捷的需求。
  • 資料庫領域頂會SIGMOD背後的故事,這篇文章全部告訴你~
    SIGMOD頂級學術會議對促進資料庫領域學者和開發者開展更深層次的國際交流與合作,進一步提高我國資料庫領域的研究水平有重要作用。華為和巨杉資料庫作為中國企業,將以最高鑽石贊助級別與微軟共同贊助本次SIGMOD大會和編程大賽。 同時,SIGMOD大會、SIGACT和SIGART聯合,贊助了關於資料庫系統理論方面的年度ACM資料庫系統原理研討會(PODS)會議。
  • 巨杉Tech | 磁碟故障後SequoiaDB如何實現在線恢復
    資料庫的安裝目錄(資料庫安裝目錄可以通過查看 /etc/default/sequoiadb 文件中 INSTALLDIR 配置的路徑)為 /opt/sequoiadb ,SequoiaDB 資料庫的作業系統管理用戶為 sdbadminn,用戶組為 `sdbadmingroup`。
  • 構建中國雲生態 | 華雲數據與海量數據完成產品兼容性互認證 搭建更加專業、多元的雲資料庫管理生態體系
    十幾年來,秉承「專注做好資料庫」的初心,專注於資料庫產品研發、銷售和服務,經過多年自主研發,先後發布了第一代資料庫產品AtlasDB資料庫, 和第二代產品Vastbase資料庫,為多家大中型客戶提供產品和服務,涵蓋了電信、交通、能源、金融、政府、健康、工業製造等重點行業。
  • 2021年9月國產資料庫大事記
    目前,以國產圖資料庫為核心的新型資料庫,已經悄然在一些重要的行業開始了國產化替代的嘗試和探索,而在《條例》和信創政策的雙加持下,有望加速國產化替代的速度。9月1日,用友網絡一行到訪優炫軟體調研。雙方就資料庫技術及戰略合作進行深入交流。9月1日,《中國證券報》刊發《優炫軟體董事長梁繼良:未來三五年國產資料庫滲透率料大幅提升》報導。