循序渐进丨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.mzph.cn/web/57022.shtml

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

相关文章

机房巡检机器人有哪些功能和作用

随着数据量的爆炸式增长和业务的不断拓展&#xff0c;数据中心面临诸多挑战。一方面&#xff0c;设备数量庞大且复杂&#xff0c;数据中心内服务器、存储设备、网络设备等遍布&#xff0c;这些设备需时刻保持良好运行状态&#xff0c;因为任何一个环节出现问题都可能带来严重后…

2024护理类科技核心期刊汇总(最新版)

2024年9月中国科技核心期刊目录&#xff08;2024年版&#xff09;正式公布&#xff0c;13本护理类期刊入选。常笑医学整理了这13本护理类科技核心期刊的详细参数&#xff0c;以及投稿经验&#xff0c;供大家在论文投稿时参考&#xff0c;有需要的赶紧收藏&#xff01; 1.《中华…

基于Springboot+Vue的物流系统 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 该系统…

AI创作者与人类创作者的协作模式

公主请阅 1. AI创作者的崛起1.1 AI创作者的工作原理1.2 AI创作者的优势 2. 人类创作者的独特价值2.1 创造性与情感2.2 伦理与价值观2.3 文化与背景 3. AI与人类的协作模式3.1 协同创作3.2 内容编辑3.3 数据驱动的创作3.4 跨媒体协作 4. AI与人类协作的挑战4.1 技术局限性4.2 版…

模型体素化

背景: 在三维模型深度处理的时候,有时候需要对模型进行区域划分.并赋予一定的材质,力学等属性,所以,需要对模型进行划分. 目前的模型体素化的方式基本分为cpu,gpu,都是投影射线法进行的, 在调研了一些已知的开源算法和项目,并测试后发现,大部分的开源项目也都是基于抽壳进行的…

Android 应用申请 Google MBA权限

Google Case链接&#xff1a;89 > 34810 > 30025 > 155353 > Handheld > MBA Policies 按照指引填写模板 This bug is for the approval of MBAs under [13.2.2 Pregrant permissions policy](https://docs.partner.android.com/gms/policies/domains/mba#mba-…

练习LabVIEW第二十二题

学习目标&#xff1a; 刚学了LabVIEW&#xff0c;在网上找了些题&#xff0c;练习一下LabVIEW&#xff0c;有不对不好不足的地方欢迎指正&#xff01; 第二十二题&#xff1a; 前面板上放一个压力表&#xff0c;指针位置在0-255之间随机变化&#xff0c;指针颜色同时发生变化…

网络应用技术 实验一:路由器实现不同网络间通信(华为ensp)

目录 一、实验简介 二、实验目的 三、实验需求 四、实验拓扑 五、实验任务及要求 1、任务 1&#xff1a;完成网络部署 2、任务 2&#xff1a;设计全网IP 地址 3、任务 3&#xff1a;实现全网主机互通 六、实验步骤 1、在ensp中部署网络 2、配置各主机 IP地址、子网掩…

【小白学机器学习16】 概率论的世界观2: 从正态分布去认识世界

目录 1 从正态分布说起 1.1 正态分布的定义 1.2 正态分布的名字 1.3 正态分布的广泛&#xff0c;和基础性 2 正态分布的公式和图形 2.1 正态分布 2.2 标准正态分布 3 正态分布的认识的3个层次 3.1 第1层次&#xff1a;个体的某个属性的样本值&#xff0c;服从正态分布…

Java应用程序的测试覆盖率之设计与实现(一)-- 总体设计

一、背景 作为测试,如何保证开发人员提交上来的代码都被测试覆盖到,是衡量测试质量的一个重要指标。 本系列文章将要说一说,如何搭建一套测试覆盖率的系统。 包括以下内容: jacoco agent采集执行覆盖率数据jacoco climaven集成jacoco:jacoco-maven-pluginant集成jacoco:…

【开源鸿蒙】OpenHarmony 5.0轻量系统最小开发环境搭建

【开源鸿蒙】OpenHarmony 5.0轻量系统最小开发环境搭建 一、写在前面——为什么写本篇内容二、准备工作——下载源码前的准备2.1 准备基础环境2.2 准备命令行工具2.3 配置git用户凭据 三、下载OpenHarmony轻量系统最小源码3.1 使用ssh协议下载&#xff08;推荐&#xff09;3.2 …

【Vue】Vue3.0(十五)Vue 3.0 中 hooks 的概念

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Vue专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年10月22日21点50分 背景&#xff1a;在一些情况下&#xff0c;前台的组件是可以复用的&#xff0c;那这些复用的对象和数据&#xff0c;为…

Prompt Engineering (Prompt工程)

2 prompt工程2大原则 2.1 给出清晰&#xff0c;详细的指令 策略1&#xff1a;使用分割符清晰的指示输出的不同部分&#xff0c;比如"",<>,<\tag>等分隔符 策略2&#xff1a;指定一个结构化的输出&#xff0c;比如json,html等格式 策略3&#xff1a;要…

Oracle视频基础1.1.2练习

1.1.2 需求&#xff1a; 查询oracle组件和粒度大小&#xff0c; select component,granule_size from v$sga_dynamic_components;Oracle SGA 中组件和粒度大小查询详解 在 Oracle 数据库的内存结构中&#xff0c;SGA&#xff08;System Global Area&#xff0c;系统全局区&am…

基于SSM房屋租赁管理系统的设计与实现

前言 房屋租赁管理系统&#xff0c;不仅可以改善用户线下到租赁公司进行查看房屋类型的局面以及预约信息等&#xff0c;还可以提供管理效率&#xff0c;同时也可以增强网站的竞争力。利用房屋租赁管理系统&#xff0c;可以有效地提高系统的人事的效率和信息化水平&#xff0c;…

Gateway 统一网关

一、初识 Gateway 1. 为什么需要网关 我们所有的服务可以让任何请求访问&#xff0c;但有些业务不是对外公开的&#xff0c;这就需要用网关来统一替我们筛选请求&#xff0c;它就像是房间的一道门&#xff0c;想进入房间就必须经过门。而请求想要访问微服务&#xff0c;就必须…

sa-token 所有的异常都是未登录异常的问题

在使用satoken的时候&#xff0c;有这么一个问题&#xff0c;就是不管我是什么错误&#xff0c;都会弹出未登录异常&#xff0c;起初的时候我以为satoken的拦截器会拦截所有的异常&#xff0c;但是今后测试才发现忽略了一点&#xff0c;也是最重要最容易忽视的一点。 如果我现在…

解决JeecgBoot微服务通过Gateway访问Swagger资源出现“Knife4j文档请求异常”

1.问题描述 基于jeecgboot单体版本,参照官方推荐的纯微服务项目拆分指南,对jeecgboot项目进行微服务拆分,将gateway和system模块启动成功后,通过gateway访问访问Swagger接口文档,出现“Knife4j文档请求异常”,如下图: 2.问题定位: 1.浏览器F12打开控制台,查看异常请…

【React】React 18:新特性与重大更新解析

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 React 18&#xff1a;新特性与重大更新解析并发渲染什么是并发渲染&#xff1f;…

Linux系统下串口AT指令控制EC20连接华为云物联网平台

一、前言 在当今万物互联的时代背景下&#xff0c;物联网技术的快速发展极大地推动了智能化社会的构建。作为其中的关键一环&#xff0c;设备与云端平台之间的通信变得尤为重要。本文介绍如何在Linux操作系统环境下&#xff0c;利用串口通信来实现EC20模块与华为云物联网平台的…