首页 > 系统相关 >DWS临时内存不可用报错: memory temporarily unavailable

DWS临时内存不可用报错: memory temporarily unavailable

时间:2023-10-27 11:26:01浏览次数:40  
标签:DWS temporarily totalsize dynamic session 报错 内存 memory 线程

本文分享自华为云社区《DWS临时内存不可用报错: memory temporarily unavailable》,作者:漫天。

1、定位报错的DN/CN

当出现memory temporarily unavailable报错时,首先根据报错信息确认具体是哪个cn/dn报的,如果报错信息没有类似dnxxxx_xxxx这样的信息,就是cn报的,需要去每个cn的日志里排查是哪个cn。

2、DWS813以前的版本内存报错定位

通过free -g或者top命令查看操作系统内存使用情况,确认是操作系统内存耗尽导致,还是cn/dn的内存使用达到限制,导致内存可不用报错。如果没有现场,需要查看操作系统的内存监控。

如果是cn/dn的内存使用达到限制,可以按照以下步骤定位:

步骤一:分析内存视图 pv_total_memory_detail(实例级别内存视图)

select * from pv_total_memory_detail ;

判断(1)如果dynamic_peak_memory大于max_dynamic_memory,说明是cn/dn dynamic内存使用达到上限,导致内存可不用报错。PS:要求历史上dynamic_peak_memory 没有超过max_dynamic_memory,即dynamic_peak_memory 首次超过max_dynamic_memory时,该判断方式有效。

判断(2)dynamic_used_memory接近max_dynamic_memory,大概率是cn/dn dynamic内存使用达到上限,导致内存可不用报错。

判断(3)比较dynamic_used_memory、dynamic_used_shrctx、sctpcomm_used_memory大小,如果dynamic_used_shrctx非常大,说明多线程共享的动态内存太大,如果sctpcomm_used_memory非常大,说明通信库使用的内存非常大,如果dynamic_used_shrctx和sctpcomm_used_memory都很小,说明session占用的内存最多。

步骤二:分析内存视图 pv_session_memory_detail(会话级别内存视图)和活跃会话视图 pg_stat_activity

执行如下SQL-X,查看每个session占用的内存大小:

-- 查看每个session占用的内存大小
select split_part(pv_session_memory_detail.sessid,'.',2) pid,pg_size_pretty(sum(totalsize)) total_size,count(*) context_count from pv_session_memory_detail group by pid order by sum(totalsize) desc;

如果SQL-X查询结果中,某个session占用内存特别高,说明该session上执行的SQL占用内存过高,可以找到对应的SQL,杀掉该语句并进行整改:

-- 查看语句占用内存大小
select b.state, a.sessid, b.query_id, substr(b.query,1,80) as query, sum(totalsize) as totalsize, sum(freesize), sum(usedsize) from pv_session_memory_detail a, pg_stat_activity b where split_part(a.sessid,'.',2) = b.pid group by state,sessid,query_id,query order by totalsize desc limit 100;
​
-- 到对应的CN节点查杀对应的线程
select pg_terminate_backend(pid);

如果SQL-X查询结果中,每个session占用内存都不大,但session总量大,大概是空闲线程太多导致dynamic内存较高。

-- 查看idle线程数量
SELECT count(*) FROM pg_stat_activity WHERE state='idle';
​
-- 查看各个线程状态的内存使用
select 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;
​
-- 查询各个应用的内存使用
select b.application_name, 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.application_name order by totalsize desc limit 100;
​
-- 查询各个用户的内存使用
select b.usename, sum(totalsize) as totalsize from pv_session_memory_detail a, pg_stat_activity b where split_part(a.sessid,'.',2) = b.pid group by b.usename order by totalsize desc limit 30;
​
-- 查看各类型等待线程的数量
select wait_status,wait_event,count(*) from pg_thread_wait_status group by 1,2 order by 3 desc;

如果是空闲用户线程导致dynamic内存高,可以临时清理下空闲用户线程:

gsql -d postgres -p 25308 -c "clean connection to all for database xxx;"

如果是空闲stream线程导致dynamic内存高,可以将参数max_stream_pool改小(stream线程池的作用是缓存stream线程,stream线程是用来进行dn之间数据的传输,一般多表join的时候stream线程会较多),减小max_stream_pool的影响是短查询的性能会降低,对复杂查询几乎没影响。

3、DWS813及以后的版本内存报错定位

可以使用813以前版本的定位方式,也可以使用下面的方式。

步骤一:查看报错日志

813及以上版本会打印出debug的信息,可以通过搜关键字abnormal来找到当时使用最高的语句,找到thread id,再查找thread id 找到对应query id

步骤二:查看topsql

上一步可以找到占用内存最大的sql,如果该sql占用内存确实很大,通过topsql查找对应的query id,从而找到对应的SQL语句,并通过unique_sql_id找到同一类型的SQL,进行分析整改。

如果不是某个sql占用内存太高导致,分析方法和813以前的版本一样。

另外,813及以后的版本可以使用如下方式清理空闲用户线程:

-- 清理空闲用户线程,每次清1/4
-- 显示清理了多少,还剩多少
select * from pgxc_clean_free_conn;

点击关注,第一时间了解华为云新鲜技术~

 

标签:DWS,temporarily,totalsize,dynamic,session,报错,内存,memory,线程
From: https://www.cnblogs.com/huaweiyun/p/17791817.html

相关文章

  • 解决报错Invalid bound statement (not found)
    解决报错Invalidboundstatement(notfound)问题描述:在玩mybatis-plus的时候,在测试类写了一个测试批量插入的方法,结果就报错:它的意思是无效的跳转com.melo.mapper.ProductMapper下的方法batchInsert可是我的小红鸟和小蓝鸟都可以正常跳转,检查了mapper名称也没问题,就上网......
  • 使用NvicatPremium时,Mysql数据库插入数据时,报错1064
    使用navicatPremium新版本时,插入数据,显示错误1064-YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear''choose'('ChooseNo','SNo','CNo','......
  • httprunner2.5.7+python3安装报错解决
    1.执行hrun-V报错:ImportError:cannotimportname'Iterable'from'collections'将fromcollectionsimportIterable修改成fromcollections.abcimportIterable 2.执行hrun-V报错:ImportError:cannotimportname'soft_unicode'from'......
  • Pycharm安装第三方库时报错 no such option: --build-dir
    参考资料Link:https://blog.csdn.net/weixin_56321113/article/details/122737501 一、遇到的问题pycharm2020.1python3.9pip22.1无论安装任何第三方包都会报错 nosuchoption:--build-dir 二、问题原因pycharm依赖于--build-dir安装第三方库,但pipinstall中......
  • Django启动时不报错解决方案
    项目启动时有报错,但是无法知道具体信息:[root@Masternew_project]#python3manage.pyrunserverWatchingforfilechangeswithStatReloaderExceptioninthreaddjango-main-thread:Traceback(mostrecentcalllast):File"/usr/local/python3/lib/python3.8/thread......
  • H3C G3服务器硬盘报错后立即自动rebuilding处理
    2023-10-0722:16:40RAID_Array触发 严重 TransitiontoCriticalfromlesssevere---PCIeslot:22023-10-0722:19:36 HDD_F02_Status DriveSlot(Bay) 触发 正常 Rebuild/Remapinprogress2023-10-0901:20:59 HDD_F02_Status DriveSlot(Bay) 解除 正常 Rebuild/Remapin......
  • Keil5编译器报错:ARMLMD_LICENSE_FILE unset~解决
    keilMDK版本更新到最新版本是V5.38。由于V5.38不支持编译器5,并且将默认编译器设置为编译器6,所以我安装了编译器5(Arm编译器版本5,V5.06更新7),带有独立补丁。然后将编译器5添加到keil,设置编译器5为默认编译器,但是keil无法构建项目,构建输出部分打印如下,:ARMLMD_LICENSE_FILE:unset......
  • pytest报错UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc3 in position 1
    报错UnicodeDecodeError:'utf-8'codeccan'tdecodebyte0xc3inposition11:invalidcontinuationbyte代码运行时,报错 可以看出是编码的问题,根据提示,有可能是__init__.py文件的问题,通过查看源代码:尝试改变"utf-8"为“gbk"路径:C:\python3.8\Lib\site-packages\inic......
  • VS添加SunnyUI控件时报错:创建组件UILabel失败
    在引用中将sunnyui和sunnyui.common移除在引用中重新从本地引用上面两个dll文件......
  • 给react native 添加transform translateY动画报错:Transform with key of "translateY
    初学reactnative,想实现一个相机扫描功能时,报错,报错描述如标题这是我的主要逻辑代码constfadeAnim=useRef(newAnimated.Value(0)).current;constmove=()=>{fadeAnim.setValue(0);Animated.timing(fadeAnim,{toValue:200,duration:20......