大數據“復活”記
1182
2025-03-31
1.簡介
GaussDB的動態內存使用方法是基于Postgres提供的內存上下文管理。在此基礎上,GaussDB引入邏輯內存管理機制,控制進程內存使用,避免出現系統OOM問題,同時提供多項視圖來追蹤內存的使用情況。引入jemalloc開源庫,替換glibc中的內存分配和釋放,減少內存碎片,提升多線程內存分配的性能。
2.GaussDB的內存布局
GaussDB在原生的PG內存上下文機制上引入了第三方開源庫jemalloc,jemalloc通過接管malloc的內存申請,提升了內存申請的效率。可以看到GaussDB的內粗你可以分為5大塊,共享內存通過mmap等方式直接申請OS內存,memcontext、列存、通信庫申請的內存都是通過原生PG的內存上下文管理機制申請內存,在此基礎上引入了邏輯內存管理,統計了這些動態內存的大小,監控內存的使用,組后一部分則是直接通過malloc等申請的內存,對這部分內存計入others內存使用。
3.memcontext布局
GaussDB是基于原生的PG內存上下文來進行內存管理,與之前直接申請系統內存相比,這種內存上下文的好處是可以減少內存泄漏,通過這種方式可以記錄內存的使用情況,可以很輕松的釋放內存上下文的所有內容。在實際的使用過程中,每一個進程都有一個屬于自己的內存上下文,每一個內存上下文都是一個節點,各個節點之間組織成樹的結構,每一個根節點都有自己的孩子節點,當釋放父節點的時候對應的孩子節點也會釋放,這樣就可以避免內存泄漏了。
4.內存管理視圖
GaussDB通過GUC參數disable_memory_protect參數是否開啟邏輯內存管理,默認是打開的。邏輯內存管理通過引入幾個視圖監控內存的使用情況,增加內存問題定位手段,常用的視圖包括
Select * from pv_total_memory_detail; 觀察總的內存 ?
Select * from pv_session_memory_detail order by totalsize desc; 查詢哪個內存上下文比較高
Select * from pg_shared_memory_detail; 共享內存上下文占用
Select * from pg_stat_activity; 查看當前活躍的作業
其中比較重要的視圖是pv_total_memory_detail,這個視圖統計了當前實例節點各個模塊的內存使用情況:
視圖 pv_total_memory_detail查詢數據庫進程內存使用,便于分析內存失敗后問題;各字段含義如下;
max_process_memory: 實例可用最大內存,GUC參數max_process_memory相同;OM會自動計算給出
process_used_memory: 實例正在使用的物理內存;操作系統命令top中的RES數值相同
max_dynamic_memory: 實例可以動態申請的最大內存大小,由 max_process_memory – max_shared_memory – max_cstore_memory計算獲得
dynamic_used_memory: 邏輯內存記賬中,所有內存分配的當前數值,包括所有內存上下文和通信庫動態分配的內存;達到 max_dynamic_memory數值時,報錯:memory is temporarily unavailable
dynamic_peak_memory: 邏輯內存機制的最大數值,從節點啟動至今
dynamic_used_shrctx: 邏輯內存記賬中,僅共享內存上下文內存分配的當前數值;屬于dynamic_used_memory的一部分
dynamic_peak_shrctx: 邏輯內存記賬中,共享內存上下內存分配的最大數值
max_shared_memory: 實例中共享內存預占內存的大小,包含shared_buffers,比該數值大(還有其他數據結構也是共享內存)
shared_used_memory:實例中共享內存正在使用的大小,操作系統top的SHR數值;行存情況下,該數值較大
max_cstore_memory/ cstore_used_memory : 實例中列存儲預占/正在使用的內存,用于數據緩存,GUC參數cstore_buffers相同
cstore_used_memory : 實例中列存儲正在使用的內存,內部統計獲得
max_sctpcomm_memory: 通信庫允許使用的內存大小,由GUC參數comm_usable_memory設置
sctp_used_memory: 通信庫正在使用的內存統計
sctp_peak_memory: 通信庫最大使用的內存
other_used_memory:不在統計之內的內存,由 process_used_memory – dynamic_used_memory – shared_used_memory – cstore_used_memory獲得;通常不超過2G,若過大,則說明存在第三方組件的內存分配出現泄漏
數據倉庫服務 GaussDB(DWS)
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。