问题现象:
集群出现很多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,因此出现内存不足问题。

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相符。

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