如何計算和優化追加寫引擎中GC的寫放大

名詞解釋

  • append寫
    一種基於journal的順序追加寫的數據記錄方式,類似ZFS的ZIL,ext4的journal.

  • GC
    garbage colletion 是指在append寫過程中對覆蓋寫產生的垃圾數據的回收過程。

GC過程中寫放大的計算

不同層次的寫放大

  • journal級別
    統計前端用戶有效數據的寫入量total_user_io,和包含了這部分數據且對接了分佈式一致性協議、支持索引而設計的journal 的寫入總量total_journal_io,計算 total_journal_io/total_user_io 。這裏主要的開銷是封裝用戶IO,把它組織成相應日誌而添加的journal 頭尾的開銷。

  • 存儲引擎級別

統計前端用戶有效數據的寫入量total_user_io,和經過存儲引擎對外寫入的總量total_engine_io,計算 total_enigne_io/total_user_io 。這裏主要的開銷包括:

  1. 存儲引擎GC的開銷;
  2. 索引數據落盤的開銷;
  • 磁盤級別
    統計前端用戶有效數據的寫入量total_user_io,和爲了記錄這些數據,host端發往磁盤的寫請求的總量total_host_io,計算 total_host_io/total_user_io。total_host_io可以通過ioutil工具或/proc/diskstat文件獲取。在分佈式場景下,這裏主要的開銷除了上面的開銷之外還包括:

    1. 基於分佈式一致性協議,所有索引信息定期落盤的開銷;
    2. 記錄邏輯卷和複製組映射關係的元數據落盤的開銷;
  • SSD級別
    統計前端用戶有效數據的寫入量total_user_io,和SSD內部發往NAND的吸入總量total_nand_io,計算 total_nand_io/total_user_io 。這裏主要的開銷除了上面的開銷之外,還包括 SSD 內部寫放大的開銷。後者可以通過nvmecli或者其原生庫統計到。

GC設計的考慮因素

GC的優化點主要目的就是提供給用戶儘可能多的有效IO,同時降低IO延遲。上面各個層次的寫放大統計值是衡量存儲引擎設計的一個重要指標。實際GC的設計需要考慮當前可用容量大小、數據碎片化程度、SSD磨損程度靜態因素,還需要兼顧用戶IO模式、SSD內部任務調度等動態因素。下面假設其他調節不變的情況下,逐一考慮每個影響因素。

當前可用容量

在大規模分佈式系統中,可用容量在不同的層次有不同的設計考量。

  • 集羣級別
    如果集羣整體可用容量充足可以減緩GC;反之儘快GC。針對個別節點可用空間不足,這些節點應該儘快通過節點間的容量均衡去釋放空間,而不應該加速GC。因爲在空間不足的情況下,做GC的寫放大相當大。

  • 主機/磁盤級別
    同樣,如果容量充足可以在GC過程中高優做碎片整理,反之GC應該儘快釋放空間。

數據碎片化程度

基於索引可以統計出磁盤內所有區間的數據碎片化程度。越零碎的區域越應該在GC過程中先做碎片整理。

用戶IO模式

用戶的覆蓋寫越多,越應該避免GC過程中搬數據,而應該讓用戶的覆蓋寫自己無效掉之前的數據,然後刪去。

用戶的隨機寫越多,越應該做碎片整理。

在可用容量充足的情況下:當前用戶的請求越多,越應該避免GC,把帶寬讓給用戶;反之,可用積極GC,錯峯利用磁盤帶寬。

SSD磨損程度

極端情況下,如果SSD磨損得很厲害了,儘量避免搬數據;反之,可以根據需要做GC。

SSD內部任務調度

因爲SSD內部總的可用帶寬是一定的,因此GC可以儘量避開SSD內部週期任務執行的時機。

GC的優化方法

這個在其本人的其他博客有討論,參考:http://xiaqichao.cn/wordpress/?p=172
這裏簡單歸納幾點。

GC通常基於切片去做,通常需要考慮選取哪些切片做GC,以及如何做GC。

選取策略

可以考慮下面幾個因素綜合考慮哪些切片需要做GC:

  • 切片內有效數據的比例

  • 切片內數據的新舊程度

  • 切片內數據做過GC的歷史(次數)

  • 切片內數據的碎片化程度
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章