GaussDB(DWS)CBB組件之SysCache、RelCache、PartCache內存管控介紹

      網友投稿 846 2025-03-31

      在之前的文章中,詳細介紹了Cache的工作原理:當用戶連續執行SQL時,DWS內核會將該SQL所需要用到的元數據加載到SysCache、RelCache和PartCache中,以犧牲內存空間為代價,減少磁盤操作,提高查詢性能。然而DWS內存空間并非無窮大,為保證數據庫的高可用性,需要在內存空間緊張時主動清理Cache緩存,以有效釋放內存占用。因此,這里產生了一個tradeoff:

      何時失效Cache?

      失效哪些Cache?

      在本文中,我們將圍繞這兩個問題進行分析,介紹DWS是如何實現Cache內存管控的。

      GaussDB(DWS)CBB組件之SysCache、RelCache、PartCache內存管控介紹

      原始的內存降低手段--全失效

      圖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小時內刪除侵權內容。

      上一篇:txt轉換成excel的教程
      下一篇:excel取余(excel取余函數)
      相關文章
      亚洲首页在线观看| 国产成人精品日本亚洲专区| 亚洲中文字幕无码一区| 亚洲国产精品一区二区九九| 亚洲AV永久无码精品一福利| 亚洲中文字幕久久无码| 亚洲成_人网站图片| 香蕉大伊亚洲人在线观看| 色在线亚洲视频www| 国产亚洲精品成人AA片| 亚洲一卡一卡二新区无人区| 亚洲精品二三区伊人久久| 亚洲1区1区3区4区产品乱码芒果 | 亚洲国产精品一区二区九九| 国产亚洲福利精品一区二区| 国产成人亚洲综合a∨| 日韩亚洲国产综合久久久| 国产亚洲人成在线播放| 亚洲国产精品成人| 亚洲综合色视频在线观看| 超清首页国产亚洲丝袜| 亚洲一区精品无码| 亚洲AV日韩精品久久久久久久| 久久久久亚洲AV片无码| 久久精品九九亚洲精品| 亚洲区视频在线观看| 亚洲天堂免费在线| 国产精品亚洲av色欲三区| 亚洲国产免费综合| 国产亚洲精品va在线| 亚洲图片一区二区| 亚洲影视自拍揄拍愉拍| 亚洲精品国产suv一区88 | 国产精品手机在线亚洲| 亚洲午夜无码片在线观看影院猛| 亚洲女同成av人片在线观看| 亚洲产国偷V产偷V自拍色戒| 久久水蜜桃亚洲av无码精品麻豆| 亚洲国产成人91精品| 亚洲第一第二第三第四第五第六 | 亚洲理论精品午夜电影|