問津集 #1:Rethinking The Compaction Policies in LSM-trees

文章目錄

  • 引言
  • 正文
  • 結束語

引言

陪女朋友出門,我大概有兩個小時左右的空閑時間,遂帶上電腦,翻了下論文列表,選擇了這篇文章做一個簡讀。
因為這一年負責時序系統的存儲引擎和計算引擎演進,而Compaction又是串聯讀寫的核心組件,其Trade off就成了對于性能來講非常重要的事情,所以sigmod2025的這篇文章我一直很期待。

吐槽下知乎只有文章,想法(字數限制50)這兩種內容輸出的形式,我其實希望發一篇總結,但沒有文章那么正式,又比想法更加復雜,公司內部的知識平臺有筆記這種內容輸出形式,就很符合我的需求。

問了下LLM,得到的答案是這樣的:

  • 知乎的核心價值:作為中文互聯網高質量問答社區,其內容需具備公共討論價值長期復用性。問題(結構化問答)、文章(深度解析)、想法(輕量觀點)均服務于這一目標。
  • 筆記的潛在沖突:筆記通常偏向個人化、碎片化、非結構化內容(如摘抄、待辦清單),與知乎“公共知識庫”的定位不符,易稀釋內容質量。

仔細思考后發現我想輸出的內容仍舊屬于文章范疇,且具備公共討論價值和長期復用性,不單單是碎片化的個人內容,遂完成了這篇簡讀文章,但是沒有加入到從一到無窮大的專欄中,而是另起爐灶,重新創建一個專欄,收錄后續的非正式文章。

這半年其實算下來也有十幾篇有意思的論文我都寫了筆記,但是夠不上從一到無窮大的文章思考水平,遂全部在草稿箱吃灰,后續都可以放在問津集中來。

正文

Compaction is the key operation of the LSM-tree. Compacting aggressively leads to higher write amplification while reducing read amplification. Compacting lazily reduces write amplification but can hurt query performance.

文章的一個觀點很有意思,以前的工作主要集中在寫放大和讀放大之間的權衡上,假設更高的WA會導致較低的寫入性能。但是,LSM 樹應用程序通常會經歷穩定且適度的寫入流,并且它只優先考慮頂級刷新,以避免由于寫入停止而導致數據丟失。

例如,Meta已經證明,在實際工作負載中,最高寫入速度約為45 MB/s。鑒于現代 NVMe SSD 提供超過 2 GB/s 的寫入帶寬。論文的實驗表明,Compaction和查詢之間剩余 CPU 和 I/O 資源的分布不會影響 LSM 樹的寫入性能。因此Compaction策略的目標是優化查詢性能。

論文的實驗主要關注Compaction和查詢處于同機,所以需要聯合優化,因為Compaction和讀取作會爭奪來自同一剩余池的 CPU 和 I/O 資源。

所以,論文的實際建模為:給定穩定的 LSM 樹寫入流(以恒定的刷新速度),如何設計壓縮策略以最大化平均查詢吞吐量?

Compaction的本質是投入計算和 I/O 來減少sort run的數量,從而使未來的查詢能夠探測更少的sort run。但是,這種效果是暫時的,因為會不斷生成新的sort run。Compacion的未來收益取決于其對瞬時查詢吞吐量的影響以及該影響的持續時間。

論文還觀察到 Compaction的時機對于確定其影響的持續時間至關重要,在下一次Global Compaction(我們叫Full Compaction)之前執行Compaction越早,平均查詢吞吐量的后續收益就越大。這是因為較早的Compaction可以在較長的時間內減少查詢開銷,從而大大增加后續從Compaction中受益的查詢數量。

因此,理想的設計應該在不同時間采用不同的Compaction策略。這意味著同一level 的 sort run 應該具有不同的大小,因為它們是在不同的時間創建的,所以level的概念變得模糊,因為 LSM 樹不再具有相同大小的sort run。

自然積極的Compaction策略可以最大化查詢性能,但是其會占用資源,進而影響查詢。

這就是文章的核心思路:從投資的視角設計Compaction

We view compaction as a form of investment.
Compaction’s write amplification is the cost of the investment
and the increased instantaneous query throughput is the immediate return.
Maximizing average query performance means maximizing the accumulated return from each investment.
A compaction’s accumulated return might be less than the opportunity cost.

文章提出了EcoTune Algorithm:該策略在給定客戶端確定的恒定寫入速度的情況下,在Compaction中優化平均查詢吞吐量。

平均查詢性能通過Compaction的成本和累積回報來建模。Compaction的成本可以根據涉及的數據量輕模,并且每次壓縮的成本是獨立的。累積回報的建模比較復雜,因為需要考慮其查詢速度的即時改進以及這種改進將持續多長時間。

從立即回報到累積回報。最佳Compaction策略旨在最大化其累積收益,同時最大限度地降低其成本。文章分析了Compaction對查詢速度的直接影響與其成本之間的關系。在Compaction中,LSM 樹的數據布局和查詢吞吐量是動態變化的,因此壓縮的影響會隨著時間的推移而逐漸減弱。要分析Compaction的累積回報,還必須考慮其影響會持續多久。

文章的一個觀點是:越早進行Compaction,累積的未來回報就越大。當 LSM 樹遠離Full Compaction時,將多個sort run壓縮為一個可以提高較長時間的查詢速度。當 LSM 樹接近Full compaction時,Compaction 產生的好處越小,因為新創建的sort run不會被長時間查詢。由于時間的影響,具有相同成本的兩個Compaction可能具有非常不同的累積收益。因此,在Compaction開始時,應該更積極地合并sort run。隨著接近 full Compaction,compacion 策略應該變得更加懶惰。

其策略設計的核心稱為Three-Level Generalization.

最佳壓縮策略的積極性應該隨著時間的推移而改變。換句話說,每個sort run的大小取決于其創建時間,而不是限制為 L 允許的大小。因此,沒有大小相等的sort run。由于level的概念來自 L 允許的大小,因此不再有level的定義。而是將 LSM 樹視為一組sort run,類似于RocksDB universal compaction。

因為合并小的sort run和之前一樣,因此我們根據sort run對查詢速度的影響將sort run重新劃分為三個邏輯級別:

  1. top level:多個相同大小的sort run
  2. main level:多個不同大小的sort run
  3. last level:一個sort run

在這里插入圖片描述
對于Three-Level Generalization,有三種后臺任務:

  1. flush from memory to the top level
  2. compaction from the top level to the main level (TMC)
  3. compaction within the main level (MLC).

EcoTune Algorithm就是在main level的壓縮策略,其對于最佳的定義是:兩次full compactions之間查詢的平均吞吐量最高。

算法的具體實現有興趣的讀者可以參考原論文的4.3節,這篇文章的目的是搞清楚問題和建模方法,具體的解決方法對于泛讀論文來講反而不太重要。

結束語

這篇論文對于Compaction其實不需要在意寫放大的觀察非常具有洞察力,在云環境下我們將Compaction,Ingester和查詢引擎完全分離的做法導致Compaction策略的思考與單機的Compaction完全不同。

而且當介質變成對象存儲時,寫放大很多時候也不是考慮的重點,因為讀寫帶寬是分離的,當存在帶寬風險時一般都會分桶,此時Compaction就更不應該將寫放大作為首要思考因素了,當然我們面對的問題和論文中的完全不一樣,但是其對問題建模的方式非常值得學習。

Investment View,只學計算機可沒法說出這樣的話,跨界的知識儲備對個人還是非常重要的,很多時候可以提供更為創新的視角。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/89782.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/89782.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/89782.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據產品結構:從數據接入到可視化的完整架構指南

在數據驅動決策的時代,一套高效的數據產品結構是企業挖掘數據價值的基礎。無論是巨頭企業自建的完整體系,還是中小企業依賴的第三方工具,其核心邏輯都是實現 “數據從產生到呈現” 的全鏈路管理。本文將拆解數據產品的五層架構,對…

python學智能算法(二十三)|SVM-幾何距離

引言 前序學習文章中,已經探究了電荷超平面的距離計算方法,相關文章為點與超平面的距離。 在這片文章中,我們了解到計算距離的公式: Fmin?i1...myi(w?xib)F\min_{i1...m}y_{i}(w\cdot x_{i}b)Fi1...mmin?yi?(w?xi?b) 計算…

[每日隨題11] 貪心 - 數學 - 區間DP

整體概述 難度:1000 →\rightarrow→ 1400 →\rightarrow→ 1600 P3918 [國家集訓隊] 特技飛行 標簽:貪心 前置知識:無 難度:橙 1000 題目描述: 輸入格式: 輸出格式: 樣例輸入:…

Elasticsearch 9.x 搜索執行流程(源碼解讀)

1. 搜索執行流程概述 Elasticsearch的搜索執行是一個分布式過程,涉及協調節點和數據節點之間的多階段交互 #mermaid-svg-QGh2GjrUKcs5jzQp {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QGh2GjrUKcs5jzQp .error…

暑期訓練8

E. G-C-D, Unlucky!題目要求判斷是否存在一個長度為 n 的數組 a,使得p[i] 是 a[0..i] 的前綴 GCDs[i] 是 a[i..n-1] 的后綴 GCD思路前綴 GCD 非遞增后綴 GCD 非遞減首尾 GCD 一致橋梁條件成立對于每個位置 i,gcd(p[i], s[i1]) 必須等于整個數組的 GCD&am…

深入解析Hadoop HDFS高可用性:原理、故障切換與元數據同步

Hadoop HDFS高可用性(HA)概述在分布式存儲領域,Hadoop分布式文件系統(HDFS)作為Hadoop生態系統的核心存儲組件,其高可用性(HA)設計一直是架構師們關注的焦點。傳統HDFS架構中,NameNode作為單一主節點管理整個文件系統的元數據,這種…

Freertos源碼分析:任務創建/刪除

任務創建/刪除流程1.簡介FreeRTOS 中任務創建通過 xTaskCreate() 或 xTaskCreateStatic() 實現。動態創建(xTaskCreate)會自動分配任務棧和TCB(任務控制塊),靜態創建(xTaskCreateStatic)需用戶預…

warning: _close is not implemented and will always fail

相關問題: 一、undefined reference to _exit undefined reference to ‘end‘ warning: _close is not implemented and will always fail 一、環境: ubuntu24.04實體機、 arm-none-eabi-gcc gcc version 13.2.1 20231009 (15:13.2.rel1-2) 二…

MyBatis之緩存機制詳解

MyBatis之緩存機制詳解一、MyBatis緩存的基本概念1.1 緩存的核心價值1.2 MyBatis的兩級緩存體系二、一級緩存(SqlSession級別緩存)2.1 工作原理2.2 實戰案例:一級緩存演示2.2.1 基礎用法(默認開啟)2.2.2 一級緩存失效場…

云服務器搭建自己的FRP服務。為什么客戶端的項目需要用Docker啟動,服務端才能夠訪問到?

簡單回答:在云服務器搭建FRP服務時,客戶端項目用Docker啟動并非必需,而是因為Docker的特性簡化了配置: Docker通過端口映射(如-p 本地端口:容器端口)能固定項目對外暴露的端口,減少本地端口沖突…

6 STM32單片機的智能家居安防系統設計(STM32代碼+手機APP設計+PCB設計+Proteus仿真)

系列文章目錄 文章目錄 系列文章目錄前言1 資料獲取與演示視頻1.1 資料介紹1.2 資料獲取1.3 演示視頻 2 系統框架3 硬件3.1 主控制器3.2 顯示屏3.3 WIFI模塊3.4 DHT11溫濕度傳感器3.5 煙霧/燃氣傳感器模塊:MQ-23.6 火焰傳感器3.7 門磁模塊MC-38 4 設計PCB4.1 安裝下…

DevOps落地的終極實踐:8大關鍵路徑揭秘!

本文來自騰訊藍鯨智云社區用戶: CanWay當前,DevOps因其能夠降低IT運營成本、提高軟件質量并加快上市時間的能力而在全球范圍內引起廣泛關注。它打破了傳統軟件開發與運營的界限,消除了新功能發布延遲和軟件質量下降的障礙。DevOps通過實施持續集成、持續…

react - 根據路由生成菜單

后端返回菜單的格式menuList:[{index: true,name: "",component: "../views/Home",meta: { title: "首頁", requiresAuth: true,roles:[user]},},{path: "/admin",name: "admin",meta: { title: "管理頁", roles:…

Window延遲更新10000天配置方案

1.點擊"開始"菜單,搜索"注冊表編輯器",點擊"打開"。2.找到"\HKEY LOCAL MACHINE\SOFTWARE\Microsoft\WindowsUpdate\Ux\Settings"路徑。3.右面空白處右鍵新建一個32位值,命名為FlightSettingsMaxPau…

【OD機試】人民幣轉換

題目描述 將阿拉伯數字金額轉換為中文大寫金額格式,需遵循以下規則: 1、 前綴要求:中文大寫金額前必須標明“人民幣”字樣。 2、 用字規范:使用壹、貳、叁、肆、伍、陸、柒、捌、玖、拾、佰、仟、萬、億、元、角、分、零、整等字樣。 3、 “整”字規則: 金額到“元”為止…

在ajax中什么時候需要將返回值類型做轉換

$.ajax({url: TMSPROC0050/deleteData?accidentIds accidentIds.join(,),type: DELETE,dataType: json,success: function(result) {$(#accidentGrid).datagrid(reload);$.messager.show({title: 成功,msg: result.message})},error: function(result) {$.messager.alert({ti…

Helm常用命令大全(2025最新版)

文章目錄Helm常用命令大全(2025最新版)一、基礎命令與環境配置版本與幫助信息安裝與升級HelmLinux系統安裝版本升級注意事項二、倉庫管理命令倉庫基礎操作OCI倉庫支持(v3.8新特性)三、Chart操作命令Chart創建與打包Chart搜索與下載…

gitlab+jenkins

文章目錄架構gitlab和jenkins安裝jenkins配置gitlab配置jenkins與gitlab聯動參考架構 gitlab和jenkins安裝 部署docker 部署jenkins 啟動jenkins 用戶:admin,對應的密碼如下 點擊安裝自定義推薦的插件 安裝gitlab插件 jenkins配置 配置pipline…

Redis字符串操作指南:從入門到實戰應用

Redis作為一款高性能的鍵值存儲數據庫,其字符串(String)類型是最基礎也最常用的數據類型。它不僅能存儲簡單的文本信息,還能應對數字計算、二進制數據等多種場景,靈活且高效。接下來,我們就全方位剖析Redis…

SQLite 數據庫字段類型-詳細說明,數據類型詳細說明。

SQLite 數據類型 SQLite字段類型詳細說明,包含存儲類、親和類型、布爾類型、日期時間類型的存儲方式、取值范圍及核心特性。 創建 SQLite3 表時可使用的各種數據類型名稱,同時也介紹了相應的親和類型。 一、核心存儲類(Storage Classes&am…