0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

华为云数据库GaussDB(for Cassandra)揭秘:内存异常增长的排查经

科技说i 来源:科技说i 作者:科技说i 2022-12-02 09:13 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

内存异常增长的排查经历

背景介绍

华为云数据库GaussDB(for Cassandra)是一款基于计算存储分离架构,兼容Cassandra生态的云原生NoSQL数据库;它依靠共享存储池实现了强一致,保证数据的安全可靠。核心特点是:存算分离、低成本、高性能。

问题描述

GaussDB(for Cassandra)自研架构下遇到一些挑战性问题,比如cpu过高,内存泄漏,内存异常增长,时延高等问题,这些也都是开发过程中遇到的典型问题。分析内存异常增长是一个比较大的挑战,内存的异常增长对于程序来说是一个致命的问题,因为其可能触发OOM,进程异常宕机,业务中断等结果,所以对内存进行合理的规划使用及控制就显得尤为重要。通过调整cache容量,bloom过滤器大小,以及memtable大小等等,实现性能提升,读写时延改善等效果。

在线下测试过程中发现内核在长时间运行后,内存只增不减,出现异常增长的情况,怀疑可能存在内存泄漏。

分析&验证

首先根据内存使用,将内存分为堆内和堆外两个部分,分别进行该两块内存的分析。确定有问题的内存是堆外内存,进一步对堆外内存分析。引入更高效的内存管理工具tcmalloc,解决内存异常增长问题。下面为具体分析验证过程。

确定内存异常区域

使用jdk的jmap命令和Cassandra的监控(配置jvm.memory.*监控项)等方法,每隔1min采集jvm的堆内内存及进程整体内存。

启动测试用例,直到内核的整体内存达到上限。分析采集到的堆内内存和进程内存变化曲线,发现其堆内内存仍保持相对稳定,未出现一直持续上涨,但期间内核的整体内存仍然在持续上涨,两者的增长曲线不符。即问题应该发生在堆外内存。

堆外内存分析验证

glibc内存管理

使用pmap命令打印进程的内存地址空间分布,发现有大量的64MB的内存块和许多内存碎片,该现象与glibc的内存分配方式有关。堆外内存的使用和进程整体的内存增长趋势相近,初步怀疑该问题是由堆外内存导致。加之glibc归还内存的条件苛刻,即内存不易及时释放,内存碎片多,猜测问题和gblic有关系。当内存碎片过多,空闲内存浪费严重,最终进程内存的最大使用量会出现超过预期计划最大值的可能,甚至出现OOM。

tcmalloc内存管理

引入tcmalloc内存管理器,代替glibc的ptmalloc内存管理方式。减少过多的内存碎片,提高内存使用效率,本次分析验证采用gperftools-2.7源码进行tcmalloc的编译。运行相同的测试用例,发现内存仍在持续上涨,但是上涨幅度较之前降低,通过pmap打印出该内存地址分布情况,发现之前的小内存块和内存碎片显著减小,说明该工具有一定优化效果,印证了前面提到内存碎片过多的猜测。

但是内存异常增长的问题仍然存在,有点像是tcmalloc的回收不及时或者不回收导致。实际上tcmalloc的内存回收是比较"reluctant"的,主要是为了当再次需要内存申请时可以直接使用,减少系统调用次数,提高性能。基于此原因,下来进行手动调用其释放内存接口releasefreememory。发现效果不明显,原因暂时未知(可能确实存在没待释放的空闲内存)。

手动触发tcmalloc的releasefreememory接口

为验证该问题,通过设置cache容量的方式进行。

1.先设置cache的容量为6GB,然后将读请求压起来,使cache的6GB容量填满

2.修改cache的容量为2GB,为快速是内存释放,手动调用tcmalloc的releasefreememory接口,发现没有效果,推测采用tcmalloc之后,内存仍然一直上涨不下跌的原因可能与该接口的有关。

3.在releasefreememory接口内部的多个地方记录日志,然后启动进程再次测试,发现一处报错是在进行系统调用madvise时有出现失败。

代码位置:

pYYBAGOIraKAFw1_AAB8HgoiHF0667.png

报错日志信息:

poYBAGOIramAeofYAABlttAwRyM875.png

1.通过该处的调用失败,分析代码。发现tcmalloc的内存释放逻辑是“round-robin”,即中间有一个span释放失败,则后续待释放的span被终止,releasefreememory逻辑调用结束。这个就和前面的现象吻合,执行完releasefreememory接口后基本没有效果,发现每次都是在释放了几十MB时,因为该接口的调用失败导致释放逻辑终止。

2.再次分析该系统调用madvise失败原因。通过给内核的该方法打patch,发现其失败原因是因为传入的地址块对应的内存状态是LOCKED状态。导致系统调用失败,报错为非法参数。

3.内存为LOCKED状态,和该状态相关的有代码调用mlock系统方法、系统的ulimit配置。分析相关代码未发现异常点。查询系统ulimit配置,发现max locked memory为unlimited。修改其配置为16MB,重启Cassandra进程,再次测试,发现内存释放效果显著。

4.继续运行测试,发现内存持续上涨的情况消失。在业务持续存在的情况下,内存会上涨到最高,不再上涨,保持平稳,符合内存计划使用量。业务压力减少甚至停止后,内存出现缓慢下降趋势。

解决&总结

1.引入tcmalloc工具,优化内存管理。比较优秀的内存管理器有Google的tcmalloc和Facebook的jemalloc等

2.修改系统的max locked memory参数配置。

合理分配进程需要使用内存的最大值,并预留一定容量,对于不符合预期增长的内存需要进一步分析。内存相关问题和程序相关性较强。系统的关键配置需谨慎,要评估其影响。同时排查了类似的所有配置。

增加releasefreememory的命令,后端进行调用,优化tcmalloc hold内存不释放问题。不过releasefreememory命令的执行会锁整个pageHeap,可能导致内存分配请求被hang,所以需要小心执行。

后端增加可动态配置tcmalloc_release_rate的参数,来调整tcmalloc将内存交还给操作系统的频率。该值的合理范围是[0-10],0表示永远不交还,值越大,表示交还的频率越高,默认值是1。

结语

本文通过分析开发过程中遇到的内存增长问题,使用更优秀的内存管理工具,以及更细粒度的内存监控,更直观的监控数据库运行期间的内存状态,确保数据库平稳高性能运行。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据库
    +关注

    关注

    7

    文章

    3993

    浏览量

    67736
  • 华为云
    +关注

    关注

    3

    文章

    2804

    浏览量

    19091
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    数据库数据恢复—服务器异常断电导致Oracle数据库故障的数据恢复案例

    Oracle数据库故障: 某公司一台服务器上部署Oracle数据库。服务器意外断电导致数据库报错,报错内容为“system01.dbf需要更多的恢复来保持一致性”。该Oracle数据库
    的头像 发表于 07-24 11:12 436次阅读
    <b class='flag-5'>数据库</b><b class='flag-5'>数据</b>恢复—服务器<b class='flag-5'>异常</b>断电导致Oracle<b class='flag-5'>数据库</b>故障的<b class='flag-5'>数据</b>恢复案例

    泰国零售巨头 CJ Express 借助 SAP 内存数据库实现高效数据管理

    泰国零售和食品分销商 CJ Express 借助 SAP 内存数据库及 Datavard 解决方案,有效控制数据增长,提升系统性能并降低成本的成功案例。
    的头像 发表于 06-13 11:04 431次阅读
    泰国零售巨头 CJ Express 借助 SAP <b class='flag-5'>内存</b><b class='flag-5'>数据库</b>实现高效<b class='flag-5'>数据</b>管理

    HarmonyOS5服务技术分享--数据库使用指南

    ? 华为数据库(CloudDB)在HarmonyOS中的使用指南 ? ​​嗨,开发者朋友们!​​ 今天咱们来聊聊华为
    发表于 05-22 18:29

    不用编程不用联网,PLC和仪表直接对SQL接数据库,有异常时还可先将数据缓存

    不用PLC编程也不用联网,还不用电脑,采用IGT-DSER智能网关实现PLC和仪表直接对SQL接数据库。 跟服务端通讯有异常时还可以先将数据暂存,待故障解除后自动重新上报到数据库;也可
    发表于 04-12 10:47

    华为 GaussDB 助力国家统计局, 开启统计现代化改革新篇章

    2023 年 8 月至 2024 年 5 月,华为 GaussDB 助力国家统计局顺利完成第五次全国经济普查(简称“五普”)单位清查和普查登记
    的头像 发表于 02-12 16:49 2942次阅读

    华为GaussDB助力统计现代化改革

    2023年8月至2024年5月,华为GaussDB助力国家统计局顺利完成第五次全国经济普查(简称“五普”)单位清查和普查登记数据采集处理
    的头像 发表于 02-12 10:59 685次阅读

    如何保障服务器数据库的安全与稳定

    在数字化时代,服务器数据库承载着企业和个人的海量关键数据,其安全与稳定至关重要。一旦出现安全漏洞或稳定性问题,可能导致数据丢失、业务中断等严重后果。以下是一些保障
    的头像 发表于 02-12 10:37 602次阅读

    数据库要购买服务器吗?答案在这里

    数据库通常无需用户购买服务器,由提供商负责底层硬件维护。用户可通过Web界面或API配置和管理数据库,根据需求选择合适的类型、规格和策略。在特殊情况下,如性能或安全需求无法满足,用户可能需自建
    的头像 发表于 01-17 09:55 531次阅读

    避坑指南:服务器数据库购买方法全攻略

    服务器数据库购买方法包含:先明确业务需求与数据库类型,再挑选信誉好、技术支持强的服务提供商,接着根据需求配置数据库实例及选择付费方式。购
    的头像 发表于 01-15 10:05 792次阅读

    分布式数据库有哪些类型

    分布式数据库有哪些类型?分布式数据库主要类型包括:关系型分布式数据库、非关系型分布式数据库
    的头像 发表于 01-15 09:43 871次阅读

    构建数据库解决方案,基于华为 Flexus X 实例容器化 MySQL 主从同步架构

    华为企业上节,Flexus X 实例特惠开启,助力企业轻松构建高性能数据库系统。专业团队技术支持,确保部署无忧,运维高效。选择华为
    的头像 发表于 01-07 17:22 952次阅读
    构建<b class='flag-5'>数据库</b>解决方案,基于<b class='flag-5'>华为</b><b class='flag-5'>云</b> Flexus X 实例容器化 MySQL 主从同步架构

    数据库是哪种数据库类型?

    数据库是一种部署在虚拟计算环境中的数据库,它融合了计算的弹性和可扩展性,为用户提供高效、灵活的数据库服务。
    的头像 发表于 01-07 10:22 804次阅读

    一般企业购买服务器带数据库吗?

    购买服务器是否带数据库,这主要取决于所选择的服务提供商及其具体的套餐或服务内容。一般来说,服务器本身是一个提供计算能力、存储空间和网络连接资源的虚拟服务器,它本身并不直接包含
    的头像 发表于 01-06 10:25 721次阅读

    华为荣登Gartner®数据库挑战者象限

    近日,全球知名的信息技术研究与顾问公司Gartner®正式发布了其备受瞩目的2024年度《数据库管理系统魔力象限报告》。在这份权威报告中,华为凭借其卓越的表现成功入选挑战者象限,彰
    的头像 发表于 12-31 13:57 817次阅读

    托管可以操作数据库吗?安全性如何

    托管可以操作数据库。在托管环境中,开发者可以通过使用服务提供商提供的API或SDK来连接并操作
    的头像 发表于 12-11 13:35 566次阅读