Guass内存问题定位
--如果报错则使用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';
- 点赞
- 收藏
- 关注作者
评论(0)