0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

華為云數(shù)據(jù)庫GaussDB(for Cassandra)揭秘:內(nèi)存異常增長的排查經(jīng)

科技說i ? 來源:科技說i ? 作者:科技說i ? 2022-12-02 09:13 ? 次閱讀

內(nèi)存異常增長的排查經(jīng)歷

背景介紹

華為云數(shù)據(jù)庫GaussDB(for Cassandra)是一款基于計算存儲分離架構(gòu),兼容Cassandra生態(tài)的云原生NoSQL數(shù)據(jù)庫;它依靠共享存儲池實現(xiàn)了強一致,保證數(shù)據(jù)的安全可靠。核心特點是:存算分離、低成本、高性能。

問題描述

GaussDB(for Cassandra)自研架構(gòu)下遇到一些挑戰(zhàn)性問題,比如cpu過高,內(nèi)存泄漏,內(nèi)存異常增長,時延高等問題,這些也都是開發(fā)過程中遇到的典型問題。分析內(nèi)存異常增長是一個比較大的挑戰(zhàn),內(nèi)存的異常增長對于程序來說是一個致命的問題,因為其可能觸發(fā)OOM,進(jìn)程異常宕機,業(yè)務(wù)中斷等結(jié)果,所以對內(nèi)存進(jìn)行合理的規(guī)劃使用及控制就顯得尤為重要。通過調(diào)整cache容量,bloom過濾器大小,以及memtable大小等等,實現(xiàn)性能提升,讀寫時延改善等效果。

在線下測試過程中發(fā)現(xiàn)內(nèi)核在長時間運行后,內(nèi)存只增不減,出現(xiàn)異常增長的情況,懷疑可能存在內(nèi)存泄漏。

分析&驗證

首先根據(jù)內(nèi)存使用,將內(nèi)存分為堆內(nèi)和堆外兩個部分,分別進(jìn)行該兩塊內(nèi)存的分析。確定有問題的內(nèi)存是堆外內(nèi)存,進(jìn)一步對堆外內(nèi)存分析。引入更高效的內(nèi)存管理工具tcmalloc,解決內(nèi)存異常增長問題。下面為具體分析驗證過程。

確定內(nèi)存異常區(qū)域

使用jdk的jmap命令和Cassandra的監(jiān)控(配置jvm.memory.*監(jiān)控項)等方法,每隔1min采集jvm的堆內(nèi)內(nèi)存及進(jìn)程整體內(nèi)存。

啟動測試用例,直到內(nèi)核的整體內(nèi)存達(dá)到上限。分析采集到的堆內(nèi)內(nèi)存和進(jìn)程內(nèi)存變化曲線,發(fā)現(xiàn)其堆內(nèi)內(nèi)存仍保持相對穩(wěn)定,未出現(xiàn)一直持續(xù)上漲,但期間內(nèi)核的整體內(nèi)存仍然在持續(xù)上漲,兩者的增長曲線不符。即問題應(yīng)該發(fā)生在堆外內(nèi)存。

堆外內(nèi)存分析驗證

glibc內(nèi)存管理

使用pmap命令打印進(jìn)程的內(nèi)存地址空間分布,發(fā)現(xiàn)有大量的64MB的內(nèi)存塊和許多內(nèi)存碎片,該現(xiàn)象與glibc的內(nèi)存分配方式有關(guān)。堆外內(nèi)存的使用和進(jìn)程整體的內(nèi)存增長趨勢相近,初步懷疑該問題是由堆外內(nèi)存導(dǎo)致。加之glibc歸還內(nèi)存的條件苛刻,即內(nèi)存不易及時釋放,內(nèi)存碎片多,猜測問題和gblic有關(guān)系。當(dāng)內(nèi)存碎片過多,空閑內(nèi)存浪費嚴(yán)重,最終進(jìn)程內(nèi)存的最大使用量會出現(xiàn)超過預(yù)期計劃最大值的可能,甚至出現(xiàn)OOM。

tcmalloc內(nèi)存管理

引入tcmalloc內(nèi)存管理器,代替glibc的ptmalloc內(nèi)存管理方式。減少過多的內(nèi)存碎片,提高內(nèi)存使用效率,本次分析驗證采用gperftools-2.7源碼進(jìn)行tcmalloc的編譯。運行相同的測試用例,發(fā)現(xiàn)內(nèi)存仍在持續(xù)上漲,但是上漲幅度較之前降低,通過pmap打印出該內(nèi)存地址分布情況,發(fā)現(xiàn)之前的小內(nèi)存塊和內(nèi)存碎片顯著減小,說明該工具有一定優(yōu)化效果,印證了前面提到內(nèi)存碎片過多的猜測。

但是內(nèi)存異常增長的問題仍然存在,有點像是tcmalloc的回收不及時或者不回收導(dǎo)致。實際上tcmalloc的內(nèi)存回收是比較"reluctant"的,主要是為了當(dāng)再次需要內(nèi)存申請時可以直接使用,減少系統(tǒng)調(diào)用次數(shù),提高性能?;诖嗽?,下來進(jìn)行手動調(diào)用其釋放內(nèi)存接口releasefreememory。發(fā)現(xiàn)效果不明顯,原因暫時未知(可能確實存在沒待釋放的空閑內(nèi)存)。

手動觸發(fā)tcmalloc的releasefreememory接口

為驗證該問題,通過設(shè)置cache容量的方式進(jìn)行。

1.先設(shè)置cache的容量為6GB,然后將讀請求壓起來,使cache的6GB容量填滿

2.修改cache的容量為2GB,為快速是內(nèi)存釋放,手動調(diào)用tcmalloc的releasefreememory接口,發(fā)現(xiàn)沒有效果,推測采用tcmalloc之后,內(nèi)存仍然一直上漲不下跌的原因可能與該接口的有關(guān)。

3.在releasefreememory接口內(nèi)部的多個地方記錄日志,然后啟動進(jìn)程再次測試,發(fā)現(xiàn)一處報錯是在進(jìn)行系統(tǒng)調(diào)用madvise時有出現(xiàn)失敗。

代碼位置:

pYYBAGOIraKAFw1_AAB8HgoiHF0667.png

報錯日志信息

poYBAGOIramAeofYAABlttAwRyM875.png

1.通過該處的調(diào)用失敗,分析代碼。發(fā)現(xiàn)tcmalloc的內(nèi)存釋放邏輯是“round-robin”,即中間有一個span釋放失敗,則后續(xù)待釋放的span被終止,releasefreememory邏輯調(diào)用結(jié)束。這個就和前面的現(xiàn)象吻合,執(zhí)行完releasefreememory接口后基本沒有效果,發(fā)現(xiàn)每次都是在釋放了幾十MB時,因為該接口的調(diào)用失敗導(dǎo)致釋放邏輯終止。

2.再次分析該系統(tǒng)調(diào)用madvise失敗原因。通過給內(nèi)核的該方法打patch,發(fā)現(xiàn)其失敗原因是因為傳入的地址塊對應(yīng)的內(nèi)存狀態(tài)是LOCKED狀態(tài)。導(dǎo)致系統(tǒng)調(diào)用失敗,報錯為非法參數(shù)。

3.內(nèi)存為LOCKED狀態(tài),和該狀態(tài)相關(guān)的有代碼調(diào)用mlock系統(tǒng)方法、系統(tǒng)的ulimit配置。分析相關(guān)代碼未發(fā)現(xiàn)異常點。查詢系統(tǒng)ulimit配置,發(fā)現(xiàn)max locked memory為unlimited。修改其配置為16MB,重啟Cassandra進(jìn)程,再次測試,發(fā)現(xiàn)內(nèi)存釋放效果顯著。

4.繼續(xù)運行測試,發(fā)現(xiàn)內(nèi)存持續(xù)上漲的情況消失。在業(yè)務(wù)持續(xù)存在的情況下,內(nèi)存會上漲到最高,不再上漲,保持平穩(wěn),符合內(nèi)存計劃使用量。業(yè)務(wù)壓力減少甚至停止后,內(nèi)存出現(xiàn)緩慢下降趨勢。

解決&總結(jié)

1.引入tcmalloc工具,優(yōu)化內(nèi)存管理。比較優(yōu)秀的內(nèi)存管理器有Google的tcmalloc和Facebook的jemalloc等

2.修改系統(tǒng)的max locked memory參數(shù)配置。

合理分配進(jìn)程需要使用內(nèi)存的最大值,并預(yù)留一定容量,對于不符合預(yù)期增長的內(nèi)存需要進(jìn)一步分析。內(nèi)存相關(guān)問題和程序相關(guān)性較強。系統(tǒng)的關(guān)鍵配置需謹(jǐn)慎,要評估其影響。同時排查了類似的所有配置。

增加releasefreememory的命令,后端進(jìn)行調(diào)用,優(yōu)化tcmalloc hold內(nèi)存不釋放問題。不過releasefreememory命令的執(zhí)行會鎖整個pageHeap,可能導(dǎo)致內(nèi)存分配請求被hang,所以需要小心執(zhí)行。

后端增加可動態(tài)配置tcmalloc_release_rate的參數(shù),來調(diào)整tcmalloc將內(nèi)存交還給操作系統(tǒng)的頻率。該值的合理范圍是[0-10],0表示永遠(yuǎn)不交還,值越大,表示交還的頻率越高,默認(rèn)值是1。

結(jié)語

本文通過分析開發(fā)過程中遇到的內(nèi)存增長問題,使用更優(yōu)秀的內(nèi)存管理工具,以及更細(xì)粒度的內(nèi)存監(jiān)控,更直觀的監(jiān)控數(shù)據(jù)庫運行期間的內(nèi)存狀態(tài),確保數(shù)據(jù)庫平穩(wěn)高性能運行。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)庫
    +關(guān)注

    關(guān)注

    7

    文章

    3752

    瀏覽量

    64233
  • 華為云
    +關(guān)注

    關(guān)注

    3

    文章

    2391

    瀏覽量

    17248
收藏 人收藏

    評論

    相關(guān)推薦

    數(shù)據(jù)庫數(shù)據(jù)恢復(fù)—通過拼接數(shù)據(jù)庫碎片恢復(fù)SQLserver數(shù)據(jù)庫

    一個運行在存儲上的SQLServer數(shù)據(jù)庫,有1000多個文件,大小幾十TB。數(shù)據(jù)庫每10天生成一個NDF文件,每個NDF幾百GB大小。數(shù)據(jù)庫包含兩個LDF文件。 存儲損壞,數(shù)據(jù)庫
    的頭像 發(fā)表于 10-31 13:21 ?95次閱讀
    <b class='flag-5'>數(shù)據(jù)庫</b><b class='flag-5'>數(shù)據(jù)</b>恢復(fù)—通過拼接<b class='flag-5'>數(shù)據(jù)庫</b>碎片恢復(fù)SQLserver<b class='flag-5'>數(shù)據(jù)庫</b>

    數(shù)據(jù)庫可以租用嗎?完整租用流程來了

    數(shù)據(jù)庫是可以租用的,這是一種合法且便捷的數(shù)據(jù)存儲和管理方式。數(shù)據(jù)庫服務(wù)提供商提供的各種服
    的頭像 發(fā)表于 10-28 09:54 ?91次閱讀

    數(shù)據(jù)庫服務(wù)中的IP地址管理

    ? “門牌號”(IP地址)可以確保確??蛻舳四軌驕?zhǔn)確找到并訪問數(shù)據(jù)庫服務(wù)器。不僅如此,還有一些方面都可以看出IP地址的重要性。? 1、連接管理:通過IP地址,用戶可以輕松連接到數(shù)據(jù)庫服務(wù)器,執(zhí)行
    的頭像 發(fā)表于 10-22 10:00 ?136次閱讀

    科技報到:大模型時代下,向量數(shù)據(jù)庫的野望

    科技報到:大模型時代下,向量數(shù)據(jù)庫的野望
    的頭像 發(fā)表于 10-14 17:18 ?187次閱讀

    Oracle數(shù)據(jù)恢復(fù)—異常斷電后Oracle數(shù)據(jù)庫報錯的數(shù)據(jù)恢復(fù)案例

    Oracle數(shù)據(jù)庫故障: 機房異常斷電后,Oracle數(shù)據(jù)庫報錯:“system01.dbf需要更多的恢復(fù)來保持一致性,數(shù)據(jù)庫無法打開
    的頭像 發(fā)表于 09-30 13:31 ?212次閱讀
    Oracle<b class='flag-5'>數(shù)據(jù)</b>恢復(fù)—<b class='flag-5'>異常</b>斷電后Oracle<b class='flag-5'>數(shù)據(jù)庫</b>啟<b class='flag-5'>庫</b>報錯的<b class='flag-5'>數(shù)據(jù)</b>恢復(fù)案例

    一文詳解企業(yè)上數(shù)據(jù)庫是干嘛的

    業(yè)上數(shù)據(jù)庫是企業(yè)將其數(shù)據(jù)庫系統(tǒng)從傳統(tǒng)的本地數(shù)據(jù)中心遷移到由第三方服務(wù)提供商管理的遠(yuǎn)程服務(wù)器上的過程。這樣做的目的通常是為了提高
    的頭像 發(fā)表于 09-13 11:49 ?262次閱讀

    恒訊科技分析:數(shù)據(jù)庫rds和redis區(qū)別是什么如何選擇?

    數(shù)據(jù)庫RDS(Relational Database Service)和Redis是兩種不同類型的數(shù)據(jù)庫服務(wù),它們有各自的特點和適用場景: 1、數(shù)據(jù)模型:RDS是一種關(guān)系型
    的頭像 發(fā)表于 08-19 15:31 ?294次閱讀

    DTCC2024前瞻:天翼數(shù)據(jù)庫專家共話TeleDB發(fā)展藍(lán)圖

    數(shù)據(jù)庫是IT基礎(chǔ)設(shè)施領(lǐng)域重要的組成部分,天翼緊跟數(shù)據(jù)庫行業(yè)技術(shù)方向與創(chuàng)新趨勢,強化核心技術(shù)的自研實力,助力企業(yè)釋放數(shù)據(jù)價值。在8月22日-24日的第15屆中國
    的頭像 發(fā)表于 08-19 14:53 ?283次閱讀
    DTCC2024前瞻:天翼<b class='flag-5'>云</b><b class='flag-5'>數(shù)據(jù)庫</b>專家共話TeleDB發(fā)展藍(lán)圖

    華為GaussDB數(shù)據(jù)庫基礎(chǔ)版發(fā)布:旗艦性能、價格下降超60%

    高性價比:相比企業(yè)版,華為 GaussDB 基礎(chǔ)版價格大幅下調(diào)(降幅達(dá) 60%-70%),且支持全場景數(shù)據(jù)壓縮,具有“超高壓縮比”,性能影響僅為 5%-10%,存儲成本降低 50%。
    的頭像 發(fā)表于 05-07 14:21 ?541次閱讀

    華為多模數(shù)據(jù)庫 GeminiDB 架構(gòu)與應(yīng)用實踐直播問答實錄

    多模數(shù)據(jù)庫作為一種新興的數(shù)據(jù)管理解決方案,正在受到越來越多的關(guān)注。而華為多模數(shù)據(jù)庫 GeminiDB 基于云原生
    的頭像 發(fā)表于 04-08 18:25 ?1121次閱讀

    選擇 KV 數(shù)據(jù)庫最重要的是什么?

    經(jīng)常有客戶提到 KV 數(shù)據(jù)庫,但卻偏偏“不要 Redis”。比如有個做安全威脅分析平臺的客戶,他們明確表示自己對可靠性要求非常高,需要的不是開源 Redis 這種內(nèi)存緩存,而是 KV 數(shù)據(jù)庫
    的頭像 發(fā)表于 03-28 22:11 ?656次閱讀
    選擇 KV <b class='flag-5'>數(shù)據(jù)庫</b>最重要的是什么?

    GaussDB(for Redis) 特性揭秘:多租戶管理

    華為 GaussDB(for Redis)持續(xù)完善企業(yè)級增強特性,是名副其實的 "Redis Plus" ,其中很經(jīng)典的企業(yè)級特性是 多租戶能力 ,支持添加只讀賬號、讀寫賬號,且具備強大的 DB
    的頭像 發(fā)表于 03-28 22:06 ?712次閱讀
    <b class='flag-5'>GaussDB</b>(for Redis) 特性<b class='flag-5'>揭秘</b>:多租戶管理

    oracle數(shù)據(jù)庫alert日志作用

    Oracle數(shù)據(jù)庫alert日志的作用、結(jié)構(gòu)和重要內(nèi)容。 一、alert日志的作用 異常檢測和排查:alert日志能夠記錄數(shù)據(jù)庫引擎和實例發(fā)生的異常
    的頭像 發(fā)表于 12-06 10:08 ?1158次閱讀

    Java怎么排查oom異常

    量的應(yīng)用中。要排查OOM異常,需要經(jīng)過以下幾個步驟: 理解OOM異常的原因:OOM異常通常有以下幾個原因:內(nèi)存泄露、
    的頭像 發(fā)表于 12-05 13:47 ?1189次閱讀

    NoSQL 數(shù)據(jù)庫如何選型

    什么是NoSQL數(shù)據(jù)庫?為什么要使用NoSQL數(shù)據(jù)庫?鍵值數(shù)據(jù)庫內(nèi)存鍵值數(shù)據(jù)庫文檔數(shù)據(jù)庫列式數(shù)據(jù)庫
    的頭像 發(fā)表于 11-26 08:05 ?425次閱讀
    NoSQL <b class='flag-5'>數(shù)據(jù)庫</b>如何選型