【内存】idle线程过多导致memory is temporarily unavailable

问题现象:

集群出现很多dn报内存不可用问题,导致大批作业中断。

ERROR: dn_6217_6218 memory is temporarily unavailable

DETAIL: Failed on request of size 54720 bytes under queryid 43341056.

定位过程:

1)分析内存视图pv_total_memory_detail,发现动态使用内存最大值dynamic_peak_memory 10675MB, 大于 max_dynamic_memory 10499,因此出现内存不足问题。

image.png

2)动态内存主要有session使用的动态内存、多线程共享的动态内存和通信库使用内存组成

 

其中多线程共享的动态内存峰值 dynamic_peak_shrctx 926MB、通信库使用的内存峰值sctpcomm_peak_memory 801MB,而总的动态内存dynamic_peak_memory 10675MB,分析可知动态内存中主要由session占用达8948MB。

 

3)查看pv_session_memory_detail视图

 

select split_part(pv_session_memory_detail.sessid,’.’,2),sum(totalsize),count(*) from pv_session_memory_detail group by split_part(pv_session_memory_detail.sessid,’.’,2) order by sum(totalsize) desc;

 

查询后发现进程中存在千余session,单session使用内存最大不足900MB,但因session总量大,客户业务正在运行,使得占用的总值高。

 

查看dn /proc/pid/status信息,确认进程中含有1059线程,与pv_session_memory_detail相符。

image.png

4)查看idle线程数量

SELECT count(*) FROM pg_stat_activity WHERE state=’idle’;

返回结果700+

5)结论

Dn中总共1000余线程,idle线程700+,idle线程过多,虽然有利于连接复用,但会持有过多资源。

应急措施:

清理idle线程。

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

清理后,查看结果

SELECT count(*) FROM pg_stat_activity WHERE state=’idle’;

返回结果0

查看pv_total_memory_detail视图,dynamic_used_memory 2G+,大幅下降。

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/bigdata/316615.html

(0)
上一篇 6天前
下一篇 6天前

相关推荐

发表回复

登录后才能评论