循序渐进丨openGauss / MogDB 数据库内存占用相关SQL

一、内存总体分布

数据库总体内存使用分布

select * from gs_total_memory_detail;

当dynamic_used_memory大于max_dynamic_memory就会报内存不足;如果此时dynamic_used_memory小于max_dynamic_memory,而dynamic_peak_memory大于max_dynamic_memory表明曾经出现内存不足的情况;如果是other_used_memory较大,则只能通过更换Debug版本进一步定位。

如果dynamic_used_shrctx较大,则查询gs_shared_memory_detail视图,观察是哪个MemoryContext使用内存较多;如果dynamic_used_shrctx不大,则查询gs_session_memory_detail视图, 观察是哪个MemoryContext使用内存较多。

openGauss=# select * from gs_total_memory_detail; nodename |       memorytype        | memorymbytes----------+-------------------------+-------------- primary  | max_process_memory      |        12288   GUC参数设置的进程可使用内存大小primary  | process_used_memory     |          466   进程实际使用的内存大小,同操作系统resprimary  | max_dynamic_memory      |         8088   MemoryContext能够使用的内存大小primary  | dynamic_used_memory     |          606   MemoryContext实际使用的内存大小primary  | dynamic_peak_memory     |          617   MemoryContext使用的内存峰值primary  | dynamic_used_shrctx     |          331   SharedMemoryContext能够使用的内存大小primary  | dynamic_peak_shrctx     |          331   SharedMemoryContext实际使用的内存大小primary  | max_backend_memory      |          348   SharedMemoryContext使用的内存峰值primary  | backend_used_memory     |            1primary  | max_shared_memory       |         3339   shared_buffers + 元数据primary  | shared_used_memory      |          136   进程使用的共享内存大小primary  | max_cstore_memory       |          512   cstore_buffersprimary  | cstore_used_memory      |            0primary  | max_sctpcomm_memory     |            0primary  | sctpcomm_used_memory    |            0primary  | sctpcomm_peak_memory    |            0 primary  | other_used_memory       |            0    primary  | gpu_max_dynamic_memory  |            0   process_used_memory - dynamic_used_memory - shared_used_memory - cstore_used_memoryprimary  | gpu_dynamic_used_memory |            0primary | gpu_dynamic_peak_memory | 0primary | pooler_conn_memory | 0primary | pooler_freeconn_memory | 0primary | storage_compress_memory | 0primary | udf_reserved_memory | 0(24 rows)

图片

二、共享内存分布

共享内存的内存分布

 SELECT  contextname,      pg_size_pretty(sum(totalsize)) totalmem,      pg_size_pretty(sum(usedsize)) usedmem,      count(*) countFROM gs_shared_memory_detailGROUP BY contextnameORDER BY totalmem DESC limit 20;

图片

三、session级别,连接内存等

1.查看连接数分布

select state,count(*) from pg_stat_activity group by state;

图片

2.各状态连接占用总内存情况

SELECT  state,      pg_size_pretty(sum(totalsize))FROM gs_session_memory_detail m, pg_stat_activity aWHERE substring_inner(sessid, position('.'IN sessid)+1)=a.sessionidgroup by state;

图片

3.session内存使用详情

SELECT  contextname,      pg_size_pretty(sum(totalsize)),      pg_size_pretty(sum(freesize))FROM gs_session_memory_detailGROUP BY contextnameORDER BY sum(totalsize) DESC limit 10;

图片

4.session中cacheplan内存占用情况

SELECT  sessid,      pg_size_pretty(sum(totalsize)) sess_cacheplan_sum,      pg_size_pretty(sum(usedsize)) sess_cacheplan_used,      count(*) countFROM gs_session_memory_detailWHERE contextname LIKE '%CachedPlan%'GROUP BY sessidORDER BY 2 DESC limit 20;

图片

5.session中syscache占用情况​​​​​​​

SELECT  sessid,      contextname,      pg_size_pretty(sum(totalsize)) sess_cacheplan_sum,      pg_size_pretty(sum(usedsize)) sess_cacheplan_used, count(*) countFROM gs_session_memory_detailWHERE contextname LIKE '%SessionCacheMemory%'GROUP BY sessid, contextnameORDER BY 2 DESC limit 20;

图片

6.根据线程资源的使用情况定位session连接

如下方式是先根据系统资源定位线程,然后根据线程找到对应 openGauss / MogDB 数据库里的连接。

(1)想要根据资源占用找连接,建议用top命令查看线程id:

top -H -p 数据库进程id

查看到对应耗费资源较多的线程后,根据lwtid字段,找到对应的数据库连接:​​​​​​​

SELECT  pid,      lwtid,      state,      now() - query_start query_duration,      wait_event, queryFROM pg_stat_activity a, dbe_perf.thread_wait_status sWHERE a.pid=s.tid    AND lwtid=xxx;

图片

(2)也可用ps命令找到线程id,不过不方便看资源:

ps -T -p 数据库进程id

如果针对访问数据库的连接,可以筛选条件加上worker。因为一般访问 openGauss / MogDB 的时候,连接的线程名为worker。

 ps -T -p 进程id|grep worker

然后再通过上述SQL查询线程对应的连接。

图片

也可参考线程lwtid,详情参考https://www.modb.pro/db/448030

7.内存类型和query结合​​​​​​​

SELECT  substring_inner(sessid, position('.'
IN sessid)+1) AS sessid, sesstype, contextname, level, parent, pg_size_pretty(sum(totalsize)) AS totalsize, pg_size_pretty(sum(freesize)) AS freesize, pg_size_pretty(sum(usedsize)) AS usedsize, query
FROM gs_session_memory_detail m, pg_stat_activity a
WHERE substring_inner(sessid, position('.'
IN sessid)+1)=a.sessionid
GROUP BY sessid, sesstype, contextname, level, parent, query
ORDER BY totalsize desc;
 

图片

8.查找占用内存较多的连接​​​​​​​

SELECT  a.pid,      a.application_name,      a.client_addr,      a.datname,      a.usename,      pg_size_pretty(sum(usedsize)) AS usedsize,      pg_size_pretty(sum(totalsize)) AS totalsize, a.state, a.queryFROM gs_session_memory_detail s, pg_stat_activity aWHERE substring_inner(sessid, position('.'IN sessid) +1)= a.sessionid    AND usename <> 'omm'    AND pid !=pg_backend_pid()GROUP BY pid, application_name, client_addr, datname, usename, state, queryORDER BY sum(totalsize) desc;

图片

四、内存追踪功能(慎用)

openGauss 提供一个内存追踪的功能,可以追踪当前正在使用的内存上下文的申请位置,能够比较方便地用来定位内存泄漏的问题。其主要由下面两个函数组成。

DBE_PERF.track_memory_context(cxtname text): 开关。入参为需要追踪的上下文名称。
DBE_PERF.track_memory_context_derail(): 查看正在追踪的上下文的细节。

用完后DBE_PERF.track_memory_context(cxtname text)函数需要空值入参,关闭内存追踪功能。

使用示例如下:​​​​​​​

//根据内存视图中查到比较大的、可能存在内存泄漏的context,开启内存追踪,并重新执行相关作业openGauss=# select dbe_perf.track_memory_context('SessionCacheMemoryContext'); track_memory_context---------------------- t(1 row)//查看上下文的申请信息,能看到是在哪个文件的哪一行申请了多少长度。openGauss=# select * from dbe_perf.track_memory_context_detail();       context_name        |    file     | line | size---------------------------+-------------+------+------ SessionCacheMemoryContext | list.cpp    |  104 |   16 SessionCacheMemoryContext | tupdesc.cpp |   62 |  496 SessionCacheMemoryContext | list.cpp    |  107 |   24(3 rows)//关闭内存追踪功能。openGauss=# select dbe_perf.  track_memory_context(''); track_memory_context----------------------(1 row)

图片

关于作者

阎书利,云和恩墨数据库技术顾问,PostgreSQL ACE,《快速掌握 PostgreSQL 版本新特性》一书副主编,中国PG分会认证讲师,PGfans 2021年度MVP,Gauss松鼠会2021年度优秀会员,拥有PGCM、OCP(MySQL)等十多项数据库认证,目前主要从事于 PostgreSQL、openGauss、MogDB 的运维以及数据库迁移改造工作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/457872.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《皮革制作与环保科技》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《皮革制作与环保科技》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《皮革制作与环保科技》级别&#xff1f; 答&#xff1a;国家级。主管单位&#xff1a;中国轻工业联合会 …

【书籍推荐】使用 MATLAB 算法进行合成孔径雷达信号处理【附MATLAB代码】

简介 介绍了合成孔径雷达 &#xff08;SAR&#xff09; 波前重建信号理论及其数字实现的最新分析。随着快速计算和数字信息处理技术的出现&#xff0c;SAR 技术变得更加强大和准确。使用 MATLAB 算法进行合成孔径雷达信号处理解决了这些最新发展问题&#xff0c;提供了对 SAR …

【随手笔记】远程升级之如何平衡下载包大小与速率?

1. 远程升级基本信息 使用NB_BC26模组&#xff0c;通过AT指令使用TCP的协议与公司后台交互升级的固件为BIN文件&#xff0c;使用原始固件包升级&#xff0c;未使用差分方式原始固件包有110K,大小左右&#xff0c;固件的存储为外置的FLASH W25Q16,w25q16最小存储单位为页&#…

git命令笔记(速查速查)

git命令功能总结 1.创建git的本地仓库2. 配置本地仓库(name和email地址)3. 工作区、版本库、暂存区、对象区3.1 add, commit3.2 打印提交日志3.2 修改文件 4.版本回退&#xff08;git reset&#xff09;5. 撤销修改&#xff08;在push之前撤销&#xff09;6.删除版本库中的文件…

C++——string的模拟实现(上)

目录 引言 成员变量 1.基本框架 成员函数 1.构造函数和析构函数 2.拷贝构造函数 3.容量操作函数 3.1 有效长度和容量大小 3.2 容量操作 3.3 访问操作 (1)operator[]函数 (2)iterator迭代器 3.4 修改操作 (1)push_back()和append() (2)operator函数 引言 在 C—…

微信小程序版本更新管理——实现自动更新

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

查找总价格为目标值的两个商品----双指针算法

一&#xff1a;题目描述 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 二&#xff1a;算法原理 三&#xff1a;代码编写 vector<int> twoSum(vector<int>& price, int target) {vector<int> ret;int left 0, right price.size()-…

银河麒麟相关

最近安装了银河麒麟server版本&#xff0c;整理下遇到的一些小问题 1、vmware安装Kylin-Server-V10-SP3-General-Release-2303-X86_64虚拟机完成后&#xff0c;桌面窗口很小&#xff0c;安装vmwaretools后解决&#xff0c;下载地址http://softwareupdate.vmware.com/cds/vmw-de…

centos安装指定版本的jenkins

打开jenkins镜像包官网&#xff0c;找到自己想要安装的版本&#xff0c;官网地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable 下载指定版本安装包&#xff1a; wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/jenkins-2.452.…

Vue3学习:汇率计算器案例中event.target与event.currentTarget比较

今天从一本vue.js书中学习了《汇率计算器》的案例&#xff0c;这个案例的效果如下&#xff1a; 案例可以查询人民币、日元、港元、美元、欧元之间的汇率关系&#xff0c;代码中定义了一个汇率表rate&#xff0c;包含了每种货币对其他5种货币的汇率。其中还有一个功能是点击下方…

从零到一:如何使用直播美颜SDK开发视频美颜平台

今天&#xff0c;小编将为大家详细讲解如何从零开始&#xff0c;利用直播美颜SDK进行开发视频美颜平台。 一、了解直播美颜SDK 选择合适的SDK是开发视频美颜平台的第一步&#xff0c;市场上有多种SDK可供选择。选择时应考虑SDK的功能、性能、稳定性以及开发者社区的支持。 二…

STM32实现毫秒级时间同步

提起“时间同步”这个概念&#xff0c;大家可能很陌生。一时间搞不清楚是什么意思。 我理解“时间同步”可以解决多个传感器采集数据不同时的问题&#xff0c;让多个传感器同时采集数据。 打个比方。两个人走路&#xff0c;都是100毫秒走一步&#xff08;频率相同是前提&…

C++中红黑树的实现

目录 1.红黑树的概念 1.1红黑树的规则 ​1.2红黑树如何确保最长路径不超过最短路径的2倍 1.3红黑树的效率 2.红黑树的实现 2.1红黑树的结构 2.2红黑树的插入 2.2.1红黑树插入一个值的大概过程 2.2.2情况1&#xff1a;叔叔节点存在且为红 -- 变色 2.2.3情况2&#x…

若依部署上线遇到的问题

一、若依部署上线的用户头像模块不能回显&#xff1a; 首先是后端修改部署上线后若依存储图片的本地地址 其次将上线前端配置文件中的图片相关配置给删除 二、若依部署上线后验证码不显示问题 在确保前后端请求打通后还有这个问题就是磁盘缓存问题 三、若依部署上线遇到404页…

生成式 AI 与向量搜索如何扩大零售运营:巨大潜力尚待挖掘

在竞争日益激烈的零售领域&#xff0c;行业领导者始终在探索革新客户体验和优化运营的新途径&#xff0c;而生成式 AI 和向量搜索在这方面将大有可为。从个性化营销到高效库存管理&#xff0c;二者在零售领域的诸多应用场景中都展现出变革性潜力&#xff0c;已成为保持行业领先…

【前端】css样式

文章目录 1.常用样式记录 1.常用样式记录 支持文字换行 white-space:pre-wrap;

WPF+Mvvm案例实战(五)- 自定义雷达图实现

文章目录 1、项目准备1、创建文件2、用户控件库 2、功能实现1、用户控件库1、控件样式实现2、数据模型实现 2、应用程序代码实现1.UI层代码实现2、数据后台代码实现3、主界面菜单添加1、后台按钮方法改造&#xff1a;2、按钮添加&#xff1a;3、依赖注入 3、运行效果4、源代码获…

102. UE5 GAS RPG 实现范围技能奥术伤害

在上一篇文章里&#xff0c;我们在技能蓝图里实现了通过技能实现技能指示&#xff0c;再次触发按键后&#xff0c;将通过定时器触发技能效果表现&#xff0c;最多支持11个奥术个体效果的播放。 在这一篇里&#xff0c;我们将实现技能播放时&#xff0c;对目标敌人应用技能伤害。…

C++11新特性相关内容详细梳理

0. 引言 C11简介&#xff1a; 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)&#xff0c;使得C03这个名字已经取代了C98称为C11之前的最新C标准名称。不过由于C03(TC1)主要是对C98标准中的漏洞进行修复&#xff0c;语言的核心部分则没有改动&#xff0c;因此人们习惯性…

C#实现简单的文件夹对比程序

python版本的文件夹对比程序虽然简单&#xff0c;但可视化效果一般&#xff0c;不太好看。使用C#的Winform项目实现可视化对比文件夹内容&#xff0c;主要功能包括&#xff1a;   1&#xff09;采用Directory.GetDirectories获取子文件夹集合&#xff0c;Directory.GetFiles获…