Guass内存问题定位

举报
张谱继 发表于 2024/12/20 10:01:09 2024/12/20
【摘要】 --实时session情况select m.used_mem,pid,sessionid,datname,usename,application_name,client_addr,xact_start,query_start,(now() - xact_start)::text as xact_runtime,"query"from gs_session_memory m join pg_...

--如果报错则使用pv_session_memory_detail ,或者 gs_session_memory_detail

1。实时的内存使用情况

--实时session情况
select	m.used_mem,pid,sessionid,datname,usename,application_name,client_addr,xact_start,query_start,(now() - xact_start)::text as xact_runtime,"query"
from 	gs_session_memory m
	join pg_stat_activity a on(split_part(m.sessid, '.', 2) = a.sessionid)
where pid <> pg_backend_pid()
	order by m.used_mem desc limit 20;


--1. 全局内存信息概况 MB
select * from gs_total_memory_detail;
--1.1 全局内存使用百分比
select t.*,decode(max1,null,null,0,'-',round(used/max1*100,2)||'%') pct
from(
	select
		nodename,typename,max(memorytype) memorytype,
		max(case when memorytype like '%max_%' then memorymbytes else null end ) max1,
		max(case when memorytype not like '%max_%' and memorytype not like '%peak_%' then memorymbytes else null end ) used,
		max(case when memorytype like '%peak_%' then memorymbytes else null end ) peak
	from
		(select nodename,memorytype,memorymbytes,replace(replace(replace(memorytype, 'used_', ''), 'max_', ''), 'peak_', '') as typename from pg_total_memory_detail)
	group by
		nodename,
		typename
	order by max1 desc nulls last, peak desc nulls last, used desc) t;


--2. 全局内存上下文内存使用详情
select * from gs_shared_memory_detail;
--2.1 按上下文统计
select contextname, sum(totalsize)/1024/1024 total_mb, sum(freesize)/1024/1024 free_mb, count(*) count from gs_shared_memory_detail group by contextname order by total_mb desc limit 10; 


--3. 线程级内存上下文内存使用详情
select * from gs_thread_memory_context;
--3.1 按上下文统计
select contextname, sum(totalsize)/1024/1024 total_mb, sum(freesize)/1024/1024 free_mb, count(*) count from gs_thread_memory_context group by contextname order by total_mb desc limit 10;
--3.2 指定pid,按上下文统计
select contextname, sum(totalsize)/1024/1024 total_mb, sum(freesize)/1024/1024 free_mb, count(*) count from gs_thread_memory_context where split_part(threadid, '.', 2)  = 140539511895808 group by contextname order by total_mb desc limit 10;

--4. session级内存上下文使用详情,仅在线程池模式开启时生效
select * from gs_session_memory_context;
--  按照上下文,看seesion内存消耗高的点
select contextname, count(*), sum(totalsize)/1024/1024, sum(usedsize)/1024/1024 from gs_session_memory_detail group by 1 order by 3 desc limit 10;

--4.1 指定Session的上下文情况
select * from gs_session_memory_context where  split_part(sessid, '.', 2)=797338;
--4.2 指定Session的上下文的详细消耗
select * from gs_session_memory_detail where  split_part(sessid, '.', 2)=797338;
select * from gs_session_memory_detail where  split_part(sessid, '.', 2)=797338 and contextname='CachedPlanQuery';
--4.3 指定session的上下文统计内存消耗情况,并计数,比如CachedPlanQuery的数量可以判断缓存了多少个查询
select contextname, pg_size_pretty(sum(totalsize)) total, pg_size_pretty(sum(freesize)) free, count(*) count 
from gs_session_memory_detail 
where split_part(sessid, '.', 2) = 605980 
group by contextname order by sum(totalsize) desc limit 10;  
----------------------------------------------------------------------------

--确定内存上下文之后,以CachedPlan为例,查询视图gs_get_session_memctx_detail,确定内存堆积的代码位置。即memctx层级关系
select * from gs_get_session_memctx_detail('CachedPlanQuery');

----------------------------------------------------------------------------

2. 历史内存消耗情况

--历史内存消耗情况
--gs_get_history_memory_detail可以获得数据库在过去所有时间段的内存使用超过90%时的内存使用详情
select * from gs_get_history_memory_detail(NULL) order by memory_info desc limit 10;
--选取其中一个log文件,执行如下查询语句即可阅览log内容,记载了全局的内存概况与全局级内存上下文,线程级内存上下文,session级内存上下的top20内存上下文占用详情
select * from gs_get_history_memory_detail('mem_log-2023-03-10_205125.log');

3. WDR报告

--获取WDR报告
select * from snapshot.snapshot;
select generate_wdr_report(772, 774, 'all', 'cluster',null);

4. 针对Gauss Session 维度 SQL执行计划缓存的进一步讨论

执行计划缓存是有数据库连接属性确定的,如下属性,占用的是java端驱动的内存,非数据库的,详细参考:使用JDBC连接数据库

prepareThreshold:Integer类型。该值决定着PreparedStatement对象在执行多少次以后使用服务端已经准备好的statement。默认值是5,意味着在执行同一个PreparedStatement对象时,在第五次以及以上执行时不再向服务端发送parse消息对statement进行解析,而使用之前在服务端已经解析好的statement。

preparedStatementCacheQueries:Integer类型。该参数确定了每个连接的cache缓存Statement对象生成query的最大个数。默认值为256,若Statement对象生成query个大于256则会将最近最少使用的query从缓存中丢弃。0表示禁用缓存。

preparedStatementCacheSizeMiB:Integer类型,该参数确定了每个连接的cache缓存Statement对象所生成query的最大值(以兆字节为单位),默认情况下是5。若缓存了超过5MB的query,则最近最少使用的查询缓存将被丢弃。0表示禁用缓存。

想要确定当前连接已经缓存的SQL 多少以及多大 可通过 查看:  select count(1),sum(totalsize)/1024/1024 total, sum(usedsize)/1024/1024 used from gs_session_memory_detail where  split_part(sessid, '.', 2)=815216 and contextname='CachedPlanQuery';

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。