DWS 内存问题定位三板斧

举报
trd8859 发表于 2020/05/29 17:09:48 2020/05/29
【摘要】 1 内存相关知识数据库节点中使用内存包括:存储引擎使用的缓存(参数shared_buffers(行存)和cstore_buffers(列存))通信库使用的缓冲区(参数comm_usable_memory)内存上下文管理的内存(max_process_memory – shared memory(>shared_buffers) – cstore_buffers – comm_usable_m...

内存相关知识

数据库节点中使用内存包括:

  1. 存储引擎使用的缓存(参数shared_buffers(行存)和cstore_buffers(列存))

  2. 通信库使用的缓冲区(参数comm_usable_memory

  3. 内存上下文管理的内存(max_process_memory  shared memory(>shared_buffers)  cstore_buffers  comm_usable_memory   

  4. 其他(动态库申请的内存,一般很少,如果模块使用较多,请自行控制)


 

                                              

内存问题可能原因

问题原因大类

问题原因小类

集群参数配置


OS配置


业务层面

业务并发度增加

业务SQL计划变化(含有hash、sort、agg等)

是否新增业务

CN报错

SQL是否下推

参数优化

集群内存相关参数

并发控制参数

业务优化

增加内存

集群扩容

内存泄漏

软件BUG

 

内存问题定位方法

  1. 如果为CN报内存不可用错误,很大程度上是因为某个SQL的不下推导致。直接可从报错CNpg_log中查找到报错信息下面的STATEMENTS就能找到SQL。在CN上执行explain verbose可以确认SQL是否存在不下推;

  2. 查看集群配置情况和关键参数

    a. 集群每个物理节点内存、每个节点dn个数;

  3. b. 在一个CNDN上“show max_process_memory”,“show work_mem”,“show enable_dynamic_workload”;

  4. 业务SQL如果存在多表jion&sort&多个group by语句,这几个算子都是高内存操作,并且单算子内存使用上限为work_mem值,因此如果这几个算子的内存都达到使用上限,可能会报内存不足的问题。

   4. 登录任一DataNode节点,观察分析此节点的内存消耗信息(视图pv_total_memory_detail) ,主要为dynamic_used_memory/ max_dynamic_memory信息,发现dynamic_used_memory持续增长,在接近max_dynamic_memory的时候就会报错;详细查看内存上下文

   5. 根据日志报错时间点确认是否为单个SQL执行使用内存大导致(此情况下,该SQL一般都是比较复杂的SQL)。

   先查找CN pg_log中对应报错时间点第一次报该错误对应的statement(即执行的sql语句);如果确认该SQL比较复杂,可以通过在gsql中打印explain verbose 的方式查看该SQL的查询计划,确认是否存在使用work_mem比较大的算子;

   6. 确认是否存在作业大量并发的场景,如存在该场景,可以通过调整max_active_statements限制全局并发

   7. 业务执行过程中动态查看并发SQL和内存使用情况,

1)监控某一sql运行过程中DN的内存使用情况

select sessid, contextname, level,parent,totalsize,freesize,usedsize,  datname,query_id  from pv_session_memory_detail a , pg_stat_activity b  where  split_part(a.sessid,'.',2) = b.pid and b.state='active' order by usedsize desc limit 20 ;

2)监控session total memory size占用最多的TOP20 session 

select sessid, sum_total, sum_free,sum_used, query_id, query_start, state, waiting, enqueue,query from (select sessid, sum(totalsize) as sum_total, sum(freesize) as sum_free, sum(usedsize) as sum_used from pv_session_memory_detail group by sessid  order by sum_total desc limit 20 ) a , pg_stat_activity b  where  split_part(a.sessid,'.',2) = b.pid;

3)监控session中占用内存最多的context TOP20 session.

select sessid, contextname, level,parent, pg_size_pretty(totalsize),pg_size_pretty(freesize),pg_size_pretty(usedsize),  datname,query_id, query  from pv_session_memory_detail a , pg_stat_activity b  where  split_part(a.sessid,'.',2) = b.pid  order by totalsize desc limit 20 ;

4)监控当前实例总totalsize memroy大小

select pg_size_pretty(sum(totalsize)) from pv_session_memory_detail;

5)监控当前实例总usedsize memroy大小

select pg_size_pretty(sum(usedsize)) from pv_session_memory_detail;

6)监控当前实例内存总体使用情况

select * from pg_total_memory_detail;

7)监控共享内存实时使用情况

select * from pg_shared_memory_detail;

建议措施

1. 如果确认为配置不合理导致,可以通过调高单节点逻辑内存(max_process_memory )上限;

2. 如果确认业务SQL中使用work_mem的算子较多,可以通过降低work_mem上限(需要注意观察对其它业务SQL性能的影响,如果某SQL因此导致性能下降,需要分析后此query执行时的work_mem设置)

3. 如果是由于业务并发量大,而每个业务使用的内存实际并不大导致,可以通过调整max_active_statements(全局SQL并发数,该参数仅对普通用户有限制,对管理员用户执行的SQL不限制)

4. 通过打开active sql开关来分析某一时间段并发量和单个sql执行使用的内存信息(如果enable_resource_trackenable_resource_recordoff表示该功能关闭)



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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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

举报
请填写举报理由
0/200