范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

内核不中断前提下,Gaussdb(DWS)内存报错排查方法

  本文分享自华为云社区《Gaussdb(DWS)内存报错排查方法-云社区-华为云》,作者: fighttingman。
  Gaussdb内存布局
  内存上下文memoryContext内存结构
  一、内存问题定位方法
  分析场景1:数据库日志出现ERROR:memory is temporarily unavailable
  从报错信息可以找到是哪个节点的内存不足,例如 dn_6003_6004: memory is temporarily unavailable , 这个就是dn_6003的内存不足了1.从日志分析
  观察对应dn的日志,是否为"reaching the database memory limitation",表示为数据库的逻辑内存管理机制保护引起,需要进一步分析数据库的视图;若为"reaching the OS memory limitation",表示为操作系统内存分配失败引起,需要查看操作系统参数配置及内存硬件情况等。
  1)reaching the database memory limitation情况实例----debug_query_id=76279718689098154, memory allocation failed due to reaching the database memory limitation. Current thread is consuming about 10 MB, allocating 240064 bytes. ----debug_query_id=76279718689098154, Memory information of whole process in MB:max_dynamic_memory: 18770, dynamic_used_memory: 18770, dynamic_peak_memory: 18770, dynamic_used_shrctx: 1804, dynamic_peak_shrctx: 1826, max_sctpcomm_memory: 4000, sctpcomm_used_memory: 1786, sctpcomm_peak_memory: 1786, comm_global_memctx: 0, gpu_max_dynamic_memory: 0, gpu_dynamic_used_memory: 0, gpu_dynamic_peak_memory: 0, large_storage_memory: 0, process_used_memory: 22105, cstore_used_memory: 1022, shared_used_memory: 2605, other_used_memory: 0, os_totalmem: 257906, os_freemem: 16762.
  此时,作业76279718689098154准备申请240064 bytes内存,dynamic_used_memory内存值为18770MB,二者之和大于max_dynamic_memory(18770MB),超出数据库限制,内存申请失败。
  在811之后的版本还会打印top3的memoryContext内存占用,示例如下----debug_query_id=72339069014641088, sessId: 1670914731.140604465997568.coordinator1, sessType: postgres, contextName: ExprContext, level: 5, parent: FunctionScan_140604465997568, totalSize: 950010640, freeSize: 0, usedSize: 950010640 ----debug_query_id=72339069014641053, pid=140604465997568, application_name=gsql, query=select * from pv_total_memory_detail, state=retrying, query_start=2022-12-13 14:59:22.059805+08, enqueue=no waiting queue, connection_info={"driver_name":"gsql","driver_version":"(GaussDB 8.2.0 build bc4cec20) compiled at 2022-12-13 14:45:14 commit 3629 last mr 5138 debug","driver_path":"/data3/x00574567/self/gaussdb/mppdb_temp_install/bin/gsql","os_user":"x00574567"} ----debug_query_id=72339069014641088, sessId: 1670914731.140604738627328.coordinator1, sessType: postgres, contextName: ExprContext, level: 5, parent: FunctionScan_140604738627328, totalSize: 900010080, freeSize: 0, usedSize: 900010080 ----debug_query_id=72339069014641057, pid=140604738627328, application_name=gsql, query=select * from pv_total_memory_detail, state=retrying, query_start=2022-12-13 14:59:22.098775+08, enqueue=no waiting queue, connection_info={"driver_name":"gsql","driver_version":"(GaussDB 8.2.0 build bc4cec20) compiled at 2022-12-13 14:45:14 commit 3629 last mr 5138 debug","driver_path":"/data3/x00574567/self/gaussdb/mppdb_temp_install/bin/gsql","os_user":"x00574567"} ----debug_query_id=72339069014641088, sessId: 1670914731.140603779163904.coordinator1, sessType: postgres, contextName: ExprContext, level: 5, parent: FunctionScan_140603779163904, totalSize: 890009968, freeSize: 0, usedSize: 890009968 ----debug_query_id=72339069014641058, pid=140603779163904, application_name=gsql, query=select * from pv_total_memory_detail, state=retrying, query_start=2022-12-13 14:59:22.117463+08, enqueue=no waiting queue, connection_info={"driver_name":"gsql","driver_version":"(GaussDB 8.2.0 build bc4cec20) compiled at 2022-12-13 14:45:14 commit 3629 last mr 5138 debug","driver_path":"/data3/x00574567/self/gaussdb/mppdb_temp_install/bin/gsql","os_user":"x00574567"} ----allBackendSize=34, idleSize=7, runningSize=7, retryingSize=20
  重要字段解释:
  sessId:线程启动时间+线程标识(字符串信息为timestamp.threadid)
  sessType:线程名称
  contextName:memoryContext名字
  totalSize:内存占用大小,单位Byte
  freeSize:当前memoryContext释放内存总数,单位Byte
  usedSize:当前memoryContext已使用的内存总数,单位Byte
  application_name:连接到该后端的应用名
  query:查询语句
  enqueue:排队情况
  allBackendSize:总线程个数,idleSize:idle线程个数,runningSize:活跃的线程个数,retryingSize:重试的线程个数
  数据库还会在复杂作业中进行检查,查看复杂作业预估内存是否超过实际使用内存,如果存在,则打印下列信息,供分析。----debug_query_id=76279718689098154, Total estimated Memory is 15196 MB, total current cost Memory is 16454 MB, the difference is 1258 MB.The count of complicated queries is 17 and the count of uncontrolled queries is 1.
  上述信息表示全部复杂作业预计使用内存15196 MB,实际使用16454 MB,超出1258 MB。
  复杂作业共17个,其中有1个作业实际使用内存超过预计内存。----debug_query_id=76279718689098154, The abnormal query thread id 140664667547392.It current used memory is 13618 MB and estimated memory is 1102 MB.It also is the query which costs the maximum memory.
  上述信息表示,异常线程id为140664667547392,该线程预估消耗内存1102MB,实际消耗13618MB。----debug_query_id=76279718689098154, It is not the current session and beentry info : datid<16389>, app_name, query_id<76279718688746485>, tid<140664667547392>, lwtid<173496>, parent_tid<0>, thread_level<0>, query_string.
  上述信息进一步显示内存使用超过预估内存的作业信息的sql信息,其中datid表示数据库的OID,app_name表示application name,query_string表示查询sql。----debug_query_id=76279718689098154, WARNING: the common memory context "HashContext" is using 1059 MB size larger than 989 MB.----debug_query_id=76279718689098154, WARNING: the common memory context "VecHashJoin_76279718688746485_6" is using 12359 MB size larger than 10 MB.
  上述信息表示超限的memcontext,76279718689098154号查询中,memory context预设值的最大值为989MB,实际使用了1059 MB。
  2)reaching the OS memory limitation
  当GaussDB内存使用符合GUC中相关参数限制,但操作系统可用内存不足时,会出现与1.1中类似的日志信息,格式如下----debug_query_id=%lu, FATAL: memory allocation failed due to reaching the OS memory limitation. Current thread is consuming about %d MB, allocating %ld bytes. ----debug_query_id=%lu, Please check the sysctl configuration and GUC variable max_process_memory. ----debug_query_id=%lu, Memory information of whole process in MB:"                             "max_dynamic_memory: %d, dynamic_used_memory: %d, dynamic_peak_memory: %d, dynamic_used_shrctx: %d, dynamic_peak_shrctx: %d, max_sctpcomm_memory: %d, sctpcomm_used_memory: %d, sctpcomm_peak_memory: %d, comm_global_memctx: %d, gpu_max_dynamic_memory: %d, gpu_dynamic_used_memory: %d, gpu_dynamic_peak_memory: %d, large_storage_memory: %d, process_used_memory: %d, cstore_used_memory: %d, shared_used_memory: %d, other_used_memory: %d, os_totalmem: %d, os_freemem: %d
  其中,os_totalmem是当前OS中的总内存,即"free"命令中的total信息。os_freemem是当前OS中的可用内存,即"free"命令中的free信息。
  第一条日志中"allocating %ld bytes"中的待申请的内存大于第三条日志中"os_freemem"项,且数据库可运行,无其他异常,则符合预期,说明OS内存不足。2. 实例每个实例的内存使用情况,查询pgxc_total_memory_detail
  内存报错后,语句使用的内存就会释放,当时占用内存高的语句可能会因为报错,导致现场没有了,查询内存视图查询不到的情况with a as (select *from pgxc_total_memory_detail where memorytype="dynamic_used_memory"), b as(select * from pgxc_total_memory_detail wherememorytype="dynamic_peak_memory"), c as (select * from pgxc_total_memory_detailwhere memorytype="max_dynamic_memory"), d as (select * frompgxc_total_memory_detail where memorytype="process_used_memory"), e as (select* from pgxc_total_memory_detail where memorytype="other_used_memory"), f as(select * from pgxc_total_memory_detail where memorytype="max_process_memory")select a.nodename,a.memorymbytes as dynamic_used_memory,b.memorymbytes asdynamic_peak_memory,c.memorymbytes as max_dynamic_memory,d.memorymbytes asprocess_used_memory,e.memorymbytes as other_used_memory,f.memorymbytes asmax_process_memory from a,b,c,d,e,f where a.nodename=b.nodename andb.nodename=c.nodename and c.nodename=d.nodename and d.nodename=e.nodename ande.nodename=f.nodename order by a.nodename;
  在查询这个视图也有可能会因为内存不足报memory is temporarily unavailable,导致视图查不出来,此时需要将disable_memory_protect设置为off。
  set disable_memory_protect=off; 之后在查询视图就不会报错。
  通过上边这视图可以找到集群中哪个节点的内存使用有异常,之后连接那个节点通过pv_session_memory_detail视图找到有问题的memorycontext。SELECT * FROM pv_session_memory_detail ORDER BY totalsize desc LIMIT 100;
  结合pg_stat_activity视图可以找到哪个语句使用的memcontext最多。select sessid, contextname, level,parent, pg_size_pretty(totalsize) as total ,pg_size_pretty(freesize) as freesize, pg_size_pretty(usedsize) as usedsize, datname,query_id, query from pv_session_memory_detail a , pg_stat_activity b where split_part(a.sessid,".",2) = b.pid order by totalsize desc limit 100;
  紧急恢复EXECUTE DIRECT ON(cn_5001) "SELECT pg_terminate_backend(139780156290816)";二、内存占用高的场景分析1.空闲连接过多导致内存占用
  先确认是哪个实例的内存占用高,确认方法如上查询pgxc_total_memory_detail,之后连上那个cn或者dn查询如下sqlselect b.state, sum(totalsize) as totalsize, sum(freesize) as freesize, sum(usedsize) as usedsize from pv_session_memory_detail a , pg_stat_activity b where split_part(a.sessid,".",2) = b.pid group by b.state order by totalsize desc limit 100;
  如果是上图的idle状态的totalsize占用很多内存,可以尝试清理idle状态的空闲连接释放内存
  解决措施:清理idle状态的空闲连接CLEAN CONNECTION TO ALL FORCE FOR DATABASE xxxx;
  clean connection 只能清理pg_pooler_status中 in_used是f状态的空闲连接,不能清理in_used状态为t的连接,in_used为t 一般是执行了pbe语句导致cn和dn的空闲连接不能释放导致
  如果上边方法清理不掉,只能尝试清理cn和客户端的连接,之后在执行clean connection清理cn和dn之间的连接,可以尝试在cn上找到是idle状态的空闲连接,此操作会断掉cn和客户端的连接,需要和客户确认是否可以执行select "execute direct on ("||coorname||") ""select pg_terminate_backend("||pid||")"";" from pgxc_stat_activity where usename not in ("Ruby", "omm") and state="idle";
  将select的结果依次执行。2.语句占用内存过多,如果第一个步骤中的第一个语句查询的是active状态的语句内存占用多,说明是正在执行语句占用的内存多导致的
  查询下边的语句找到内存占用多的语句select b.state as state, a.sessid as sessid, b.query_id as query_id, substr(b.query,1,100) as query, sum(totalsize) as totalsize, sum(freesize) as freesize, sum(usedsize) as usedsize from pv_session_memory_detail a , pg_stat_activity b where split_part(a.sessid,".",2) = b.pid and usename not in ("Ruby", "omm") group by state,sessid,query_id,query order by totalsize desc limit 100;
  找到语句后,根据query_id去对应的cn上进行查杀这个异常sql3.dynamic_used_shrctx内存使用较多
  dynamic_used_shrctx是共享内存上下文使用的内存,也是通过MemoryContext分的,在线程之间共享。通过pg_shared_memory_detail视图查看select * from pg_shared_memory_detail order by totalsize desc limit 10;
  一般共享内存上下文分配和语句有关的, contextname都会带有线程号或者query_id,根据query_id或者线程号进行查杀异常sql,除此之外共享内存上下文一般是内核中各个模块使用的内存,比如topsql,需要排查内存使用是否合理,以及释放机制。4. 内存视图pv_total_memory_detail 中,dynamic_used_memory > max_dynamic_memory的情况
  1)GUC参数disable_memory_protect为on的时候
  2)分配内存的时候,debug_query_id为0
  3)内核在执行关键代码段的时候
  4)内核Postmaster线程内的内存分配
  5)在事务回滚阶段
  以上情况都是内核保证操作不能中断采取的特殊处理,理论上用户执行的sql使用的内存(dynamic_used_memory) 是不会大范围的超过max_dynamic_memory的内存的
  关注#华为云开发者联盟# 点击下方,第一时间了解华为云新鲜技术~
  华为云博客_大数据博客_AI博客_云计算博客_开发者中心-华为云

春季旅游消费强势复苏春风起,春日暖,春花次第开,中国多地迎来踏春好时节。赏花成为春季旅游的热门主题,以赏花为主线的旅游产品也正在成为乡村振兴的新力量。跨省春游的高峰也已全面开启。铁路上海站的春游运输从天赐踏青趣,礼悦美好春光!本文内容为广告具体折扣信息商品价格,以店内为准营业时间周一至周日09302130(本文图片部分来自网络,如有侵权请联系我们删除)南充天赐名店怎么去?门店地址A馆南充市顺庆区文化路7兰桂坊不止夜店和酒吧,跟随纯味香港享受神户和牛的美味兰桂坊是香港美食美酒时尚生活方式的代名词,除了各色夜店酒吧,这里还聚集了众多兼具个性与品质的餐饮场所,同样吸引着络绎不绝的潮流人士前来打卡。美食评论家李纯恩在最近一期的纯味香港中,湖南汝城文塔县城标识性建筑省保单位据统计,仅湖南省就有列入文保单位的古塔200多座,而实际数量要远远超过这个数。今天参观的这座古塔叫文塔,因中国古塔之中文塔太多,因塔地处汝城县城中故又叫汝城文塔。闲话,古代中国文塔面对5999起的OPPOfindx6Pro,雷军小米13U如何定价?生死局!小米13U和OPPOX6PRO到底如何选?这是一个艰难的决定。米粉很为难,手持小米10Pro,都3年了,电池后壳都换好几回了,要换新旗舰。影像很重要,配置也要旗舰。本来一直等13u卢伟冰再出奇招,新机有16GB1TB内存组合,网友1999交个朋友随着发布会的时间越来越近,RedmiNote12Turbo的各种配置也已经曝光了。让人没想到的是,除了会全球首发第二代骁龙7处理器,Note12Turbo还有很多让我们意想不到的惊小朋友用电动牙刷好吗?深挖三大伤牙危害弊病关于儿童口腔护理问题,是近几年家长们非常关注的问题。据权威统计,如今儿童龋齿率已经高达78。而儿童电动牙刷作为专业的口腔清洁工具,因为清洁能力优于传统手动牙刷,备受家长们关注。但家iOS微信正式版发布,朋友圈按钮变了iOS微信更新了!微信iOS8。0。34正式版发布,经测发现,本次更新有几处细微的小改动。1通讯录界面调整在通讯录界面中,原本小标题的灰色间隔背景,已全部统一改成白色,不再有明显的为啥越来越多华为老用户换机时,开始选择小米OV,3点原因想不到头条创作挑战赛作为科技企业,华为无疑是一家伟大的公司,毕竟华为当年在5G通信芯片制造领域都做出了较大的贡献。前几年华为手机还大火的时候,身边的人都不约而同选择从苹果换成了华为手机,为何我从iPhone13Pro换回小米11?这两大体验让我彻底放弃iPhone前言我目前在用两款手机,主力机是iPhone13Pro,备用机是小米11,13Pro才刚买两周,结果实际体验和我预期差距较大,最终又换回了小米11,这是为什么呢?iPhone13P千万别翻男朋友的手机点击右上方关注,解锁每天新故事。昨晚正在刷剧,朋友林一突然发来微信最近受够了,女朋友总是喜欢翻我手机,你说,我们明明在同一个公司上班,同居在一起,我根本没隐藏什么秘密,回家还要被她
达尔优A84pro键盘,这才是高端键盘该有的样子!随着电竞行业在我国的高速发展,越来越多的年轻人在下班和学习之余,都是会选择玩一下游戏来放松一些的。说句实在话,电脑游戏对比于手机游戏而言,还是有一定的优势的,毕竟电脑屏幕更大,能够超导材料行业专题研究苍穹下的破晓之光(报告出品方作者中航证券,邓轲)一超导材料发展综述1。1诞生和理论发展人们对超导材料的探究得益于低温物理学的发展,而超导材料的诞生则源于人们对金属电阻与温度之间的关系探索。超导,全过年啦!楚雄彝族年假期这样玩来源云南日报12月22日冬至日楚雄将迎来一年一度的彝族年彝族年源于世界上最古老历法之一的彝族十月太阳历,是楚雄彝族最重要最隆重的传统民族节日。彝族年,彝语称为库斯,意思是彝族的新年自欺欺人屋外的风干吼了一个冬天了,像被粘稠的痰卡住了一样,吼得不爽利,嘶哑嘶哑的。屋内的我也在干咳着,已经一个礼拜了,嗓子针刺地疼,浑身酸痛,不像风一样肆无忌惮,想吼就吼,我蜷缩在被窝里,顺丰掉队,遭遇中年危机封面图来源顺丰集团微博再好的公司,也不可能永远一帆风顺,比如中国快递业的领头羊顺丰。财报数据显示,2022年前三季度公司实现营收1991。47亿元,同比增长46。58净利润为44。缘分到了,选择放手,慢慢放下缘分到了,选择放下,慢慢放下。人生苦短,何必再自寻烦恼。痛苦往往来自于自己,你总是不肯放下,执着于过去,不愿走出来。缘分到了,就选择放手。而不是沉湎于过去,只有你一个人痛苦,你一定不一样的股票牛市令人生厌的地产牛市12月16日,中央经济工作会议通稿终于落地,核心要点有两部分一对当下的经济研判很悲观二重点工作在于内需。会议指出,当前我国经济恢复的基础尚不牢固,需求收缩供给冲击预期转弱三重压力仍散文人生苦短,要懂得做好自己作者子墨时光不老,却是瘦了季节,指缝太宽,禁不住时光的流淌,不经意间,又是一年年末。这一年,好的坏的都经历了,感谢时光善待,也感恩岁月赠我薄凉,亦赐我温暖。同时也感谢自己,经受困难旅行中,那些让我看一眼就沦陷的美丽湖泊大家在旅行中,有没有遇见过让你一眼就沦陷的湖泊美景?今天,我们就来聊聊那些美丽的湖泊们。小草先抛砖引玉,分享两个我自己旅行途中遇见的最喜爱的湖泊。纳木错属地西藏纳木错位于西藏,是青湖南一小岛,藏有3亿多年前的溶洞,里面的石柱更是世界之最2022生机大会溶洞,大家应该都见过吧,有些景区出名就是因为溶洞的。但是在湖南有一处地方,本身是个小岛,没什么可看的,但因为有一个三亿两千多万年前的溶洞,吸引了很多中外游客的目光,菏泽,我们如此热爱这座城市!嗨,菏泽丨我们如此热爱这座城市丨如果你认真对待这座城市它也会温暖且包容的报之所爱于是,爱上它就不需要什么理由了爱就完了!!!曹州牡丹园成武文亭湖伯乐广场单县浮龙湖百寿坊鄄城孙膑旅游