91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(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)是一款基于計(jì)算存儲(chǔ)分離架構(gòu),兼容Cassandra生態(tài)的云原生NoSQL數(shù)據(jù)庫;它依靠共享存儲(chǔ)池實(shí)現(xiàn)了強(qiáng)一致,保證數(shù)據(jù)的安全可靠。核心特點(diǎn)是:存算分離、低成本、高性能。

問題描述

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

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

分析&驗(yàn)證

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

確定內(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)存變化曲線,發(fā)現(xiàn)其堆內(nèi)內(nèi)存仍保持相對(duì)穩(wěn)定,未出現(xiàn)一直持續(xù)上漲,但期間內(nèi)核的整體內(nèi)存仍然在持續(xù)上漲,兩者的增長曲線不符。即問題應(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)存增長趨勢(shì)相近,初步懷疑該問題是由堆外內(nèi)存導(dǎo)致。加之glibc歸還內(nèi)存的條件苛刻,即內(nèi)存不易及時(shí)釋放,內(nèi)存碎片多,猜測(cè)問題和gblic有關(guān)系。當(dāng)內(nèi)存碎片過多,空閑內(nèi)存浪費(fèi)嚴(yán)重,最終進(jìn)程內(nèi)存的最大使用量會(huì)出現(xiàn)超過預(yù)期計(jì)劃最大值的可能,甚至出現(xiàn)OOM。

tcmalloc內(nèi)存管理

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

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

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

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

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

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

2.再次分析該系統(tǒng)調(diào)用madvise失敗原因。通過給內(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)存為LOCKED狀態(tài),和該狀態(tài)相關(guān)的有代碼調(diào)用mlock系統(tǒng)方法、系統(tǒng)的ulimit配置。分析相關(guān)代碼未發(fā)現(xiàn)異常點(diǎ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ù)期增長的內(nèi)存需要進(jìn)一步分析。內(nèi)存相關(guān)問題和程序相關(guān)性較強(qiáng)。系統(tǒng)的關(guān)鍵配置需謹(jǐn)慎,要評(píng)估其影響。同時(shí)排查了類似的所有配置。

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

后端增加可動(dòng)態(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)控?cái)?shù)據(jù)庫運(yùn)行期間的內(nèi)存狀態(tài),確保數(shù)據(jù)庫平穩(wěn)高性能運(yùn)行。

審核編輯:湯梓紅

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

    關(guān)注

    7

    文章

    4018

    瀏覽量

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

    關(guān)注

    3

    文章

    2832

    瀏覽量

    19244
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    OpenTenBase核心貢獻(xiàn)者分享開源數(shù)據(jù)庫的破局之路

    “在開源數(shù)據(jù)庫已成一片‘紅?!漠?dāng)下,單純比拼‘快’或‘省’,已很難在開發(fā)者心中建立獨(dú)特的護(hù)城河?!監(jiān)penTenBase核心貢獻(xiàn)者、騰訊數(shù)據(jù)庫專家工程師李晉鋼這樣闡述他對(duì)當(dāng)前數(shù)據(jù)庫
    的頭像 發(fā)表于 12-29 14:00 ?414次閱讀

    華納香港服務(wù)器數(shù)據(jù)庫索引優(yōu)化策略

    在香港服務(wù)器環(huán)境中,數(shù)據(jù)庫索引優(yōu)化是提升整體性能的關(guān)鍵因素。隨著企業(yè)數(shù)據(jù)量的不斷增長,高效的索引管理能顯著提高查詢速度并降低服務(wù)器負(fù)載。本文將深入探討如何針對(duì)香港服務(wù)器(特別是其獨(dú)特的地理和法律要求
    的頭像 發(fā)表于 10-16 17:06 ?514次閱讀

    mysql數(shù)據(jù)恢復(fù)—mysql數(shù)據(jù)庫表被truncate的數(shù)據(jù)恢復(fù)案例

    ECS網(wǎng)站服務(wù)器,linux操作系統(tǒng),部署了mysql數(shù)據(jù)庫。工作人員在執(zhí)行數(shù)據(jù)庫版本更新測(cè)試時(shí),錯(cuò)誤地將本應(yīng)在測(cè)試執(zhí)行的sql腳本在生產(chǎn)
    的頭像 發(fā)表于 09-11 09:28 ?863次閱讀
    mysql<b class='flag-5'>數(shù)據(jù)</b>恢復(fù)—mysql<b class='flag-5'>數(shù)據(jù)庫</b>表被truncate的<b class='flag-5'>數(shù)據(jù)</b>恢復(fù)案例

    數(shù)據(jù)庫數(shù)據(jù)恢復(fù)—服務(wù)器異常斷電導(dǎo)致Oracle數(shù)據(jù)庫故障的數(shù)據(jù)恢復(fù)案例

    Oracle數(shù)據(jù)庫故障: 某公司一臺(tái)服務(wù)器上部署Oracle數(shù)據(jù)庫。服務(wù)器意外斷電導(dǎo)致數(shù)據(jù)庫報(bào)錯(cuò),報(bào)錯(cuò)內(nèi)容為“system01.dbf需要更多的恢復(fù)來保持一致性”。該Oracle數(shù)據(jù)庫
    的頭像 發(fā)表于 07-24 11:12 ?630次閱讀
    <b class='flag-5'>數(shù)據(jù)庫</b><b class='flag-5'>數(shù)據(jù)</b>恢復(fù)—服務(wù)器<b class='flag-5'>異常</b>斷電導(dǎo)致Oracle<b class='flag-5'>數(shù)據(jù)庫</b>故障的<b class='flag-5'>數(shù)據(jù)</b>恢復(fù)案例

    三款主流國產(chǎn)數(shù)據(jù)庫的技術(shù)特點(diǎn)

    隨著數(shù)字經(jīng)濟(jì)的快速發(fā)展和數(shù)據(jù)安全要求的提升,國產(chǎn)數(shù)據(jù)庫正迎來前所未有的發(fā)展機(jī)遇。在信創(chuàng)浪潮推動(dòng)下,達(dá)夢(mèng)數(shù)據(jù)庫、TiDB、華為高斯數(shù)據(jù)庫等國產(chǎn)
    的頭像 發(fā)表于 07-14 11:08 ?1144次閱讀

    數(shù)據(jù)庫數(shù)據(jù)恢復(fù)—MongoDB數(shù)據(jù)庫文件丟失的數(shù)據(jù)恢復(fù)案例

    MongoDB數(shù)據(jù)庫數(shù)據(jù)恢復(fù)環(huán)境: 一臺(tái)操作系統(tǒng)為Windows Server的虛擬機(jī)上部署MongoDB數(shù)據(jù)庫。 MongoDB數(shù)據(jù)庫故障: 工作人員在MongoDB服務(wù)仍
    的頭像 發(fā)表于 07-01 11:13 ?634次閱讀
    <b class='flag-5'>數(shù)據(jù)庫</b><b class='flag-5'>數(shù)據(jù)</b>恢復(fù)—MongoDB<b class='flag-5'>數(shù)據(jù)庫</b>文件丟失的<b class='flag-5'>數(shù)據(jù)</b>恢復(fù)案例

    數(shù)據(jù)庫數(shù)據(jù)恢復(fù)—SQL Server數(shù)據(jù)庫被加密如何恢復(fù)數(shù)據(jù)

    SQL Server數(shù)據(jù)庫故障: SQL Server數(shù)據(jù)庫被加密,無法使用。 數(shù)據(jù)庫MDF、LDF、log日志文件名字被篡改。
    的頭像 發(fā)表于 06-25 13:54 ?667次閱讀
    <b class='flag-5'>數(shù)據(jù)庫</b><b class='flag-5'>數(shù)據(jù)</b>恢復(fù)—SQL Server<b class='flag-5'>數(shù)據(jù)庫</b>被加密如何恢復(fù)<b class='flag-5'>數(shù)據(jù)</b>?

    泰國零售巨頭 CJ Express 借助 SAP 內(nèi)存數(shù)據(jù)庫實(shí)現(xiàn)高效數(shù)據(jù)管理

    泰國零售和食品分銷商 CJ Express 借助 SAP 內(nèi)存數(shù)據(jù)庫及 Datavard 解決方案,有效控制數(shù)據(jù)增長,提升系統(tǒng)性能并降低成本的成功案例。
    的頭像 發(fā)表于 06-13 11:04 ?609次閱讀
    泰國零售巨頭 CJ Express 借助 SAP <b class='flag-5'>內(nèi)存</b><b class='flag-5'>數(shù)據(jù)庫</b>實(shí)現(xiàn)高效<b class='flag-5'>數(shù)據(jù)</b>管理

    oracle數(shù)據(jù)恢復(fù)—oracle數(shù)據(jù)庫誤執(zhí)行錯(cuò)誤truncate命令如何恢復(fù)數(shù)據(jù)?

    oracle數(shù)據(jù)庫誤執(zhí)行truncate命令導(dǎo)致數(shù)據(jù)丟失是一種常見情況。通常情況下,oracle數(shù)據(jù)庫誤操作刪除數(shù)據(jù)只需要通過備份恢復(fù)數(shù)據(jù)
    的頭像 發(fā)表于 06-05 16:01 ?1029次閱讀
    oracle<b class='flag-5'>數(shù)據(jù)</b>恢復(fù)—oracle<b class='flag-5'>數(shù)據(jù)庫</b>誤執(zhí)行錯(cuò)誤truncate命令如何恢復(fù)<b class='flag-5'>數(shù)據(jù)</b>?

    SQLSERVER數(shù)據(jù)庫是什么

    SQL Server 是由微軟公司開發(fā)的一款 關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS) ,用于存儲(chǔ)、管理和檢索結(jié)構(gòu)化數(shù)據(jù)。它是企業(yè)級(jí)應(yīng)用中廣泛使用的數(shù)據(jù)庫解決方案之一,尤其適用于Windows平臺(tái),但也
    的頭像 發(fā)表于 05-26 09:19 ?1166次閱讀

    MySQL數(shù)據(jù)庫是什么

    MySQL數(shù)據(jù)庫是一種 開源的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS) ,由瑞典MySQL AB公司開發(fā),后被Oracle公司收購。它通過結(jié)構(gòu)化查詢語言(SQL)進(jìn)行數(shù)據(jù)存儲(chǔ)、管理和操作,廣泛應(yīng)用于Web
    的頭像 發(fā)表于 05-23 09:18 ?1188次閱讀

    HarmonyOS5服務(wù)技術(shù)分享--數(shù)據(jù)庫使用指南

    ? 華為數(shù)據(jù)庫(CloudDB)在HarmonyOS中的使用指南 ? ??嗨,開發(fā)者朋友們!?? 今天咱們來聊聊華為
    發(fā)表于 05-22 18:29

    不用編程不用聯(lián)網(wǎng),PLC和儀表直接對(duì)SQL接數(shù)據(jù)庫,有異常時(shí)還可先將數(shù)據(jù)緩存

    不用PLC編程也不用聯(lián)網(wǎng),還不用電腦,采用IGT-DSER智能網(wǎng)關(guān)實(shí)現(xiàn)PLC和儀表直接對(duì)SQL接數(shù)據(jù)庫。 跟服務(wù)端通訊有異常時(shí)還可以先將數(shù)據(jù)暫存,待故障解除后自動(dòng)重新上報(bào)到數(shù)據(jù)庫;也可
    發(fā)表于 04-12 10:47

    數(shù)據(jù)庫數(shù)據(jù)恢復(fù)——MongoDB數(shù)據(jù)庫文件拷貝后服務(wù)無法啟動(dòng)的數(shù)據(jù)恢復(fù)

    MongoDB數(shù)據(jù)庫數(shù)據(jù)恢復(fù)環(huán)境: 一臺(tái)Windows Server操作系統(tǒng)虛擬機(jī)上部署MongoDB數(shù)據(jù)庫。 MongoDB數(shù)據(jù)庫故障: 管理員在未關(guān)閉MongoDB服務(wù)的
    的頭像 發(fā)表于 04-09 11:34 ?863次閱讀
    <b class='flag-5'>數(shù)據(jù)庫</b><b class='flag-5'>數(shù)據(jù)</b>恢復(fù)——MongoDB<b class='flag-5'>數(shù)據(jù)庫</b>文件拷貝后服務(wù)無法啟動(dòng)的<b class='flag-5'>數(shù)據(jù)</b>恢復(fù)

    服務(wù)器數(shù)據(jù)庫購買流程匯總,小白也能輕松上手!

    服務(wù)器數(shù)據(jù)庫購買流程通常包括需求評(píng)估、供應(yīng)商選擇、配置與定價(jià)、注冊(cè)賬號(hào)、填寫訂單信息、支付費(fèi)用以及后續(xù)的設(shè)置與配置等步驟。其核心邏輯在于通過精準(zhǔn)匹配業(yè)務(wù)需求(如性能、存儲(chǔ)、合規(guī)性)與服務(wù)能力,完成資源選型、策略配置及成本優(yōu)化
    的頭像 發(fā)表于 03-05 10:58 ?709次閱讀