大數據“復活”記
846
2025-03-31
在之前的文章中,詳細介紹了Cache的工作原理:當用戶連續執行SQL時,DWS內核會將該SQL所需要用到的元數據加載到SysCache、RelCache和PartCache中,以犧牲內存空間為代價,減少磁盤操作,提高查詢性能。然而DWS內存空間并非無窮大,為保證數據庫的高可用性,需要在內存空間緊張時主動清理Cache緩存,以有效釋放內存占用。因此,這里產生了一個tradeoff:
何時失效Cache?
失效哪些Cache?
在本文中,我們將圍繞這兩個問題進行分析,介紹DWS是如何實現Cache內存管控的。
原始的內存降低手段--全失效
圖1 Cache主動全失效流程圖
如圖所示,為Cache全失效流程圖,每個CN線程和DN線程在接收到新請求或事務開始時,將做一次Cache占用判斷,如果Cache占用超過256MB,則執行一次全失效,清空Cache。
該方法簡單粗暴,能有效降低內存占用,凡是內存超過256MB的線程都會得到清理,但有以下幾個問題:
該清理只在接收到新請求時才開始生效,若線程執行SQL過程較長,或SQL執行完畢以后,沒有后續SQL執行,內存占用有可能無法得到及時釋放。一旦該線程占用的內存資源無法釋放,可能導致其他線程發生OOM錯誤。
在這里,結合一個現場例子進行理解:
在局點XXX的環境中,用戶現場有個超大分區表,在用戶業務腳本執行分區表查詢操作后,單個線程的內存占用從0增長至200+MB,根據當時環境部署,一個節點包括一個CN進程和4個DN進程,也就是說共5個進程,每個進程都有200MB的內存無法及時回收,導致其他線程報OOM錯誤。
分析該問題的原因,共有兩點:
其一是,在線程執行SQL過程中,內存需要進行及時釋放,不要等到線程結束才統一釋放;其二是,線程執行SQL結束以后,重新回歸線程池,根據圖一中Cache內存釋放原理,此時回歸線程池以后,內存并沒有釋放,需要等到該線程開始執行其他SQL時,才能進行內存釋放。
Cache全失效對性能有一定影響,有可能失效掉訪問頻繁的Cache,降低性能。
在該方案中,內存失效方式比較暴力,不管Cache的訪問頻率,直接失效掉所有cache,然而這是不合理的,會影響性能。
比如,對于pg_class中pg_attribute記錄,該記錄必然會頻繁訪問,失效掉該記錄是不合理的,因為下一條SQL必然會加載該Cache。
為解決以上問題,我們在迭代過程中,逐漸實現了以下幾個Cache內存管控機制。
定時內存降低手段--idle線程內存回收
為解決a)中的問題,我們設計了idle線程內存回收機制,其主要工作原理如下:
圖2 內存清理信號發送流程圖
圖中左側和右側為兩個線程,其中左側線程在執行SQL過程中,在線程palloc內存過程中如果發生OOM錯誤,則該線程開始掃描其他線程的內存占用,對于內存占用超過64MB的線程,將發送內存清理信號,在其他線程(右側線程)接收到信號以后,若該線程處于空閑狀態,則執行內存清理。該方式有效解決了a)中線程結束后,無法清理的問題。
這里有幾個關鍵點:
在該內存釋放機制中,為避免信號發送過于頻繁,會在發送信號前將進行檢測,60s內最多發送一次信號,防止信號爆炸。
發送內存清理信號時機需要優化:其實該回收機制的主要目的是,在內存緊張時,主動通知(喚醒)其他idle線程執行內存清理,然而若等到palloc失敗才開始通知,可能此時已經嚴重阻塞業務執行,應該更早通知其他線程進行緩存清理。
待實現的內存降低手段--LRU / Global Cache
這兩種內存管控手段暫時還未實現,但作為內存管控方式之一,我們也可以單獨拿出來分析一下。
LRU:該內存管控主要目的是末尾淘汰不常用的緩存,對于SysCache,其本質上就是一個隊列;對于RelCache和PartCache,其實現邏輯是哈希表,通過對象的Oid進行哈希。綜合考慮SysCache、RelCache和PartCache,可以發現,LRU內存管控是可能的,但實現LRU的前提是:1)如何評價Cache使用率;2)LRU性能影響分析。
Global Cache:DWS當前Cache為ThreadLocal類型,也就是說,每個線程維護自身Cache,然而在用戶SQL任務并發較高的情況下,Cache會在線程間重復存儲,占用額外的內存。因此,Global Cache的想法應運而生,該想法的主要目標是,取消掉Cache線程間的存儲,所有Cache都通過指針,指向GlobalCache,以降低內存。然而,經過調查發現,Global Cache實現起來相對比較麻煩,其主要原因是,加鎖頻繁,在DDL頻繁的情況下,嚴重影響性能。
至此,DWS內核Cache內存管控手段已經介紹完畢,如果小伙伴還有其他內存降低想法,歡迎留言討論!
Gauss AP SQL 數據倉庫服務 GaussDB(DWS) 運維
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。