KingbaseES OOM 可能原因彙總

2022-10-11 02:48:07 字數 2023 閱讀 4767

不久前,遇到過乙個問題。kingbasees資料庫主機系統觸發oom現象是資料庫程序被kill, 資料庫進入crash然後restart(when restart_after_crash=on).

導致oom的原因很多, 當然要具體情況,具體分析。從資料庫層面分析記憶體分為共享記憶體(shared buffer)和私有記憶體(例如catalog cache,relcache等)。目前版本還不支援檢視shared buufer詳細使用情況(這類功能往往需要外掛程式實現)。所以本例僅對會話私有記憶體占用過大進行歸類。最常見的原因彙總如下, 以及對應的規避方法。

1、分割槽表特別多, 分割槽的catalog cache占用大量記憶體(連線會話可能會讀入每個子分割槽的結構到catalog cache),特別需要注意explain裡面資訊並不代表relcache裡的資訊。

- 避免方法: 使用kingbaseesv8r6以上的高版本(高版本會解決分割槽裁剪問題),或不要設定過多分割槽。

2、業務使用了大量長連線, 總連線數過多,並且沒有設定連線的生命週期, 連線時間越長, 連線總數越多,訪問的元資料可能積累越多, 導致每個會話的私有記憶體非常大。

- 避免方法1: 降低應用連線到資料庫的總連線數, 並且設定連線的生命週期(例如, 乙個連線最多使用15分鐘後自動釋放),避免出現某些連線占用大量私有記憶體。

- 避免方法2: 使用連線池。

3、資料庫例項未使用hugepage, 導致page table占用較大記憶體,最終引起oom.

- 避免方法: 檢查系統是否開啟hugepage,建議開啟hugepage。

5、設定了較大的work_mem, 並且有大量sql使用了hash agg或hash join, 導致記憶體消耗過多,當然還容易產生過多臨時檔案。

- 避免方法: 調小work_mem,業務層減少此類sql請求的併發量。

- 注意,可能某些版本已經支援enable_hashagg_disk, 可以開啟防止記憶體不足時無法使用hashagg。

6、資料庫有效能問題, 遇到應用程式配置的連線池上限較大, 導致同一時期向資料庫請求了大量連線, 最終耗費大量記憶體引起oom.

- 避免方法1: 降低應用到資料庫的總連線數, 並且設定連線的生命週期(例如, 乙個連線最多使用15分鐘後自動釋放).

- 避免方法2: 設定連線上限。

- 避免方法3: 找到低效topsql並優化.

7、如果是分割槽數量導致的問題, 首先要分析是什麼分割槽型別.

如果是hash分割槽, 通常乙個長連線的每次sql請求的資料定位到的分割槽是不同的子分割槽, 連線使用久了就會hold所有的子分割槽的元資料, 占用記憶體大.

如果是按時間的範圍分割槽,, 每次sql請求的基本上都是當前時期的子分割槽, 所以長連線hold的分割槽數量不會太多, 記憶體消耗問題可能性低.

- 如果是hash分割槽產生的記憶體消耗問題怎麼辦? 除了前面提到的6點方法, 還有2種方法,- 1、通過業務層改造減少分割槽數量也能減少記憶體消耗.- 2、業務層整合資料庫的hash演算法, 把和不同分割槽相關的資料操作分配到不同的執行緒, 不同的執行緒使用不同的資料庫連線,這樣每個連線只會用到某些特定的子分割槽, 不會導致每個連線都hold所有分割槽表.

其實對於kingbasees資料庫,如果業務型別多為排序併發的sql為主。那麼建議給資料庫所在伺服器分配大記憶體,256gb以上。因為每個session都會用到work_mem記憶體,如果work_mem設定為100mb,總共有2000個session上限,那麼這部分記憶體的上限就是100*2000。這是非常恐怖的數值,當然這種極端情況很少發生。如果單個會話work_mem記憶體用滿就會用到磁碟排序,如果io擁擠會對資料庫效能有嚴峻考驗。

綜上所述,我們需要在合理範圍內把伺服器記憶體分配給資料庫使用,並嚴格把控資料庫的記憶體使用情況,避免記憶體耗盡。

沒錯,當oom發生後,我們可以找到一些蛛絲馬跡。

由於oom發的是kill -9的訊號,被kill的程序根本無法記錄當時正在執行的query或者當時的狀態。

如果我們需要在oom後,還能找到被oom程序當時執行的query,在請求時(語句分析和計畫後)就記錄下它在執行什麼(開啟log_statement='all'),超過track_activity_query_size長度的query都被截斷。

規則引用筆記 可能更新可能不更新

建立了idisposable型別的本地物件,但該物件不會被釋放,除非對物件的所有引用都超出範圍。預設情況下,此規則會分析整個 庫,但這是可配置的。可使用using語句來包裝實現idisposable的物件。以這種方式包裝的物件將自動在using塊的末尾釋放。但是,以下情況不應或不能使用using語句...

ubuntu wireshark可能碰到的問題

第乙個問題 lua error during loading string usr share wireshark init.lua 45 dofile has been disabled解決辦法 sudo vim etc wireshark init.lua dofile console.lua ...

走走可能更健康

經過三個月的努力,幫助另一家公司及團隊完成了乙個網際網路產品。雖然,產品不是很漂亮,ui互動還有小瑕疵,但已經滿足了基本的商業目標,實現了基本的商業模式。回顧,這個新的團隊,我接手時有42人,團隊人際關係矛盾突出,士氣低迷,管理混亂,商業外部壓力巨大。經過溝通及整理,現有團隊為84人,管理基本體系建...