一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

科技說(shuō)i ? 來(lái)源:科技說(shuō)i ? 作者:科技說(shuō)i ? 2022-12-02 09:13 ? 次閱讀

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

背景介紹

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

問(wèn)題描述

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

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

分析&驗(yàn)證

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

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

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

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

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

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)存增長(zhǎng)趨勢(shì)相近,初步懷疑該問(wèn)題是由堆外內(nèi)存導(dǎo)致。加之glibc歸還內(nèi)存的條件苛刻,即內(nèi)存不易及時(shí)釋放,內(nèi)存碎片多,猜測(cè)問(wèn)題和gblic有關(guān)系。當(dāng)內(nèi)存碎片過(guò)多,空閑內(nèi)存浪費(fèi)嚴(yán)重,最終進(jìn)程內(nèi)存的最大使用量會(huì)出現(xiàn)超過(guò)預(yù)期計(jì)劃最大值的可能,甚至出現(xiàn)OOM。

tcmalloc內(nèi)存管理

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

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

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

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

1.先設(shè)置cache的容量為6GB,然后將讀請(qǐng)求壓起來(lái),使cache的6GB容量填滿(mǎn)

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

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

代碼位置:

pYYBAGOIraKAFw1_AAB8HgoiHF0667.png

報(bào)錯(cuò)日志信息:

poYBAGOIramAeofYAABlttAwRyM875.png

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

2.再次分析該系統(tǒng)調(diào)用madvise失敗原因。通過(guò)給內(nèi)核的該方法打patch,發(fā)現(xiàn)其失敗原因是因?yàn)閭魅氲牡刂穳K對(duì)應(yīng)的內(nèi)存狀態(tài)是LOCKED狀態(tài)。導(dǎo)致系統(tǒng)調(diào)用失敗,報(bào)錯(cuò)為非法參數(shù)。

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

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

解決&總結(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ù)留一定容量,對(duì)于不符合預(yù)期增長(zhǎng)的內(nèi)存需要進(jìn)一步分析。內(nèi)存相關(guān)問(wèn)題和程序相關(guān)性較強(qiáng)。系統(tǒng)的關(guān)鍵配置需謹(jǐn)慎,要評(píng)估其影響。同時(shí)排查了類(lèi)似的所有配置。

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

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

結(jié)語(yǔ)

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

審核編輯:湯梓紅

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

    關(guān)注

    7

    文章

    3885

    瀏覽量

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

    關(guān)注

    3

    文章

    2754

    瀏覽量

    18020
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    華為GaussDB助力統(tǒng)計(jì)現(xiàn)代化改革

    2023年8月至2024年5月,華為GaussDB助力國(guó)家統(tǒng)計(jì)局順利完成第五次全國(guó)經(jīng)濟(jì)普查(簡(jiǎn)稱(chēng)“五經(jīng)普”)單位清查和普查登記數(shù)據(jù)采集處理
    的頭像 發(fā)表于 02-12 10:59 ?341次閱讀

    避坑指南:服務(wù)器數(shù)據(jù)庫(kù)購(gòu)買(mǎi)方法全攻略

    服務(wù)器數(shù)據(jù)庫(kù)購(gòu)買(mǎi)方法包含:先明確業(yè)務(wù)需求與數(shù)據(jù)庫(kù)類(lèi)型,再挑選信譽(yù)好、技術(shù)支持強(qiáng)的服務(wù)提供商,接著根據(jù)需求配置數(shù)據(jù)庫(kù)實(shí)例及選擇付費(fèi)方式。購(gòu)
    的頭像 發(fā)表于 01-15 10:05 ?360次閱讀

    分布式數(shù)據(jù)庫(kù)有哪些類(lèi)型

    分布式數(shù)據(jù)庫(kù)有哪些類(lèi)型?分布式數(shù)據(jù)庫(kù)主要類(lèi)型包括:關(guān)系型分布式數(shù)據(jù)庫(kù)、非關(guān)系型分布式數(shù)據(jù)庫(kù)
    的頭像 發(fā)表于 01-15 09:43 ?322次閱讀

    構(gòu)建數(shù)據(jù)庫(kù)解決方案,基于華為 Flexus X 實(shí)例容器化 MySQL 主從同步架構(gòu)

    華為企業(yè)上節(jié),F(xiàn)lexus X 實(shí)例特惠開(kāi)啟,助力企業(yè)輕松構(gòu)建高性能數(shù)據(jù)庫(kù)系統(tǒng)。專(zhuān)業(yè)團(tuán)隊(duì)技術(shù)支持,確保部署無(wú)憂(yōu),運(yùn)維高效。選擇華為
    的頭像 發(fā)表于 01-07 17:22 ?426次閱讀
    構(gòu)建<b class='flag-5'>數(shù)據(jù)庫(kù)</b>解決方案,基于<b class='flag-5'>華為</b><b class='flag-5'>云</b> Flexus X 實(shí)例容器化 MySQL 主從同步架構(gòu)

    數(shù)據(jù)庫(kù)是哪種數(shù)據(jù)庫(kù)類(lèi)型?

    數(shù)據(jù)庫(kù)是一種部署在虛擬計(jì)算環(huán)境中的數(shù)據(jù)庫(kù),它融合了計(jì)算的彈性和可擴(kuò)展性,為用戶(hù)提供高效、靈活的數(shù)據(jù)庫(kù)服務(wù)。
    的頭像 發(fā)表于 01-07 10:22 ?345次閱讀

    華為榮登Gartner?數(shù)據(jù)庫(kù)挑戰(zhàn)者象限

    近日,全球知名的信息技術(shù)研究與顧問(wèn)公司Gartner?正式發(fā)布了其備受矚目的2024年度《數(shù)據(jù)庫(kù)管理系統(tǒng)魔力象限報(bào)告》。在這份權(quán)威報(bào)告中,華為憑借其卓越的表現(xiàn)成功入選挑戰(zhàn)者象限,彰
    的頭像 發(fā)表于 12-31 13:57 ?405次閱讀

    托管可以操作數(shù)據(jù)庫(kù)嗎?安全性如何

    托管可以操作數(shù)據(jù)庫(kù)。在托管環(huán)境中,開(kāi)發(fā)者可以通過(guò)使用服務(wù)提供商提供的API或SDK來(lái)連接并操作
    的頭像 發(fā)表于 12-11 13:35 ?276次閱讀

    數(shù)據(jù)庫(kù)主機(jī)哪個(gè)好一點(diǎn)?

    數(shù)據(jù)庫(kù)主機(jī)哪個(gè)好一點(diǎn)?主機(jī)和數(shù)據(jù)庫(kù)各有優(yōu)勢(shì),選擇哪個(gè)更好取決于具體需求。
    的頭像 發(fā)表于 12-04 13:50 ?348次閱讀

    數(shù)據(jù)庫(kù)服務(wù)器哪個(gè)便宜一些?

    服務(wù)器的價(jià)格區(qū)間相對(duì)更廣泛,因?yàn)橛脩?hù)可以根據(jù)實(shí)際需求選擇不同配置和性能的服務(wù)器。而數(shù)據(jù)庫(kù)的價(jià)格則更多地依賴(lài)于數(shù)據(jù)庫(kù)類(lèi)型和規(guī)格。在相同配置下,
    的頭像 發(fā)表于 11-12 10:55 ?463次閱讀

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

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

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

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

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

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

    Oracle數(shù)據(jù)恢復(fù)—異常斷電后Oracle數(shù)據(jù)庫(kù)庫(kù)報(bào)錯(cuò)的數(shù)據(jù)恢復(fù)案例

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

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

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

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

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