当前位置: 首页 > news >正文

PostgreSQL 内存配置 与 MemoryContext 的生命周期

PostgreSQL 内存配置与MemoryContext的生命周期

PG/GP 内存配置

数据库可用的内存 gp_vmem

整个 GP 数据库可用的内存 gp_vmem:

>>> RAM = 128 * GB
>>> gp_vmem = ((SWAP + RAM) - (7.5*GB + 0.05 * RAM)) / 1.7
>>> print(gp_vmem / GB)
67.11764705882352>>> RAM = 256 * GB
>>> gp_vmem = ((SWAP + RAM) - (7.5*GB + 0.05 * RAM)) / 1.7
>>> print(gp_vmem / GB)
138.64705882352942

内存上限 gp_vmem_protect_limit

每个 Segment 可用的内存上限 gp_vmem_protect_limit:

max_acting_primary_segments = num_segments + 3
gp_vmem_protect_limit = gp_vmem / max_acting_primary_segments

内存配额 gp_statement_mem

每个 Segment 可用的内存配额 gp_statement_mem:

gp_statement_mem = (gp_vmem_protect_limit * 0.9) / max_expected_concurrent_queries
gp_statement_mem = (8192 MB * .9) / 40 = 184MB

注意:实际上的配置名称为statement_mem,并且其值不能突破max_statement_mem的限制。

并发量 max_parallel_workers_per_gather

并发量与内存息息相关,并发越大启动的进程越多,消耗的内存则越大。

show max_parallel_workers; -- default 60show max_parallel_workers_per_gather; -- default 2
set max_parallel_workers_per_gather = 5;

官方参考文档:

  • https://gp-docs-cn.github.io/docs/best_practices/sysconfig.html#topic_dt3_fkv_r4__segment_mem_config
  • https://gp-docs-cn.github.io/docs/best_practices/workloads.html

PG MemoryContext 生命周期

MemoryContext 生命周期概览

PG 的 MemoryContext 是一个树形结构,每个Query可以对应一个MemoryContext(我们可以称为query_context),query_context会创建Child行级别的MemoryContext,比如下面是Aggregate的2个典型行级别MemoryContext,分别为tuple_context、expr_context:

auto aggstate = reinterpret_cast<::AggState *>((::PlanState *) shadow_ps);
auto tuple_context = aggstate->curaggcontext->ecxt_per_tuple_memory;
auto expr_context = aggstate->tmpcontext->ecxt_per_tuple_memory;

tuple_context 生命周期

一般来说,tuple_context的生命周期比query_context的短,当火山模型中的一行数据完成吐出,或者向量化模型中的一批数据完成吐出,则tuple_context中的内存就可以释放了,tuple_context的生命周期是贯穿每一行的如下步骤:

  • 从最底层读取数据到数据。
  • 中间的一连串计算算子。
  • 结尾的将最终结果吐出给用户。

expr_context 生命周期

但是expr_context的生命周期,一般来说,比tuple_context的更短,expr_context在任何一个算子中,或两个上下依赖的算子中,均可完成其全部生命周期(从创建到销毁内存)。本质上来说,expr_context定位为临时性的内存需求,用完即可释放。

MemoryContext 典型操作

MemoryContext 上下文创建

/** Create working memory for expression evaluation in this context.*/
// src/backend/executor/execUtils.c
econtext->ecxt_per_tuple_memory =AllocSetContextCreate(estate->es_query_cxt,"ExprContext",minContextSize,initBlockSize,maxBlockSize);// src/backend/utils/mmgr/aset.c
MemoryContext
AllocSetContextCreateInternal(MemoryContext parent,const char *name,Size minContextSize,Size initBlockSize,Size maxBlockSize)
{AllocSet set;...// src/backend/utils/mmgr/mcxt.cMemoryContextCreate((MemoryContext) set,T_AllocSetContext,&AllocSetMethods,parent,name);...return set;
}

MemoryContext 上下文切换

auto expr_context = aggstate->tmpcontext->ecxt_per_tuple_memory;
auto oldcxt = ::MemoryContextSwitchTo(expr_context);

MemoryContext 内存释放(整体)

MemoryContextReset() 函数用于释放一个 MemoryContext 中分配的所有内存:

// the tmpcontext is short-live
auto expr_context = aggstate->tmpcontext->ecxt_per_tuple_memory;
::MemoryContextReset(expr_context);

Memory 内存典型操作

内存分配 palloc

void* palloc(Size size)
{/* duplicates MemoryContextAlloc to avoid increased overhead */void       *ret;MemoryContext context = CurrentMemoryContext;AssertArg(MemoryContextIsValid(context));AssertNotInCriticalSection(context);if (!AllocSizeIsValid(size))elog(ERROR, "invalid memory alloc request size %zu", size);context->isReset = false;ret = context->methods->alloc(context, size);if (unlikely(ret == NULL)){MemoryContextStats(TopMemoryContext);ereport(ERROR,(errcode(ERRCODE_OUT_OF_MEMORY),errmsg("out of memory"),errdetail("Failed on request of size %zu in memory context \"%s\".",size, context->name)));}VALGRIND_MEMPOOL_ALLOC(context, ret, size);return ret;
}

内存分配并填充0 – palloc0

void* palloc0(Size size)
{/* duplicates MemoryContextAllocZero to avoid increased overhead */void       *ret;MemoryContext context = CurrentMemoryContext;AssertArg(MemoryContextIsValid(context));AssertNotInCriticalSection(context);if (!AllocSizeIsValid(size))elog(ERROR, "invalid memory alloc request size %zu", size);context->isReset = false;ret = context->methods->alloc(context, size);if (unlikely(ret == NULL)){MemoryContextStats(TopMemoryContext);ereport(ERROR,(errcode(ERRCODE_OUT_OF_MEMORY),errmsg("out of memory"),errdetail("Failed on request of size %zu in memory context \"%s\".",size, context->name)));}VALGRIND_MEMPOOL_ALLOC(context, ret, size);MemSetAligned(ret, 0, size);return ret;
}

内存重分配 repalloc

/** repalloc*      Adjust the size of a previously allocated chunk.*/
void* repalloc(void *pointer, Size size)
{MemoryContext context = GetMemoryChunkContext(pointer);void       *ret;if (!AllocSizeIsValid(size))elog(ERROR, "invalid memory alloc request size %zu", size);AssertNotInCriticalSection(context);/* isReset must be false already */Assert(!context->isReset);ret = context->methods->realloc(context, pointer, size);if (unlikely(ret == NULL)){MemoryContextStats(TopMemoryContext);ereport(ERROR,(errcode(ERRCODE_OUT_OF_MEMORY),errmsg("out of memory"),errdetail("Failed on request of size %zu in memory context \"%s\".",size, context->name)));}VALGRIND_MEMPOOL_CHANGE(context, pointer, ret, size);return ret;
}

内存释放 pfree

/** pfree*      Release an allocated chunk.*/
void pfree(void *pointer)
{MemoryContext context = GetMemoryChunkContext(pointer);context->methods->free_p(context, pointer);VALGRIND_MEMPOOL_FREE(context, pointer);
}

相关文章:

PostgreSQL 内存配置 与 MemoryContext 的生命周期

PostgreSQL 内存配置与MemoryContext的生命周期 PG/GP 内存配置 数据库可用的内存 gp_vmem 整个 GP 数据库可用的内存 gp_vmem&#xff1a; >>> RAM 128 * GB >>> gp_vmem ((SWAP RAM) - (7.5*GB 0.05 * RAM)) / 1.7 >>> print(gp_vmem / G…...

vue3 组件间通信的方式(setup语法糖写法)

vue3 组件间通信的方式(setup语法糖写法) 1. Props方式 该方式用于父传子&#xff0c;父组件以数据绑定的形式声明要传递的数据&#xff0c;子组件通过defineProps()方法创建props对象&#xff0c;即可拿到父组件传来的数据。 // 父组件 <template><div><son…...

【Cache】Rsync远程同步

文章目录 一、rsync 概念二、rysnc 服务器部署1. 环境配置2. rysnc 同步源服务器2.1 安装 rsync2.2 建立 rsyncd.conf 配置文件2.3 创建数据文件&#xff08;账号密码&#xff09;2.4 启动服务2.5 数据配置 3. rysnc 客户端3.1 设置同步方法一方法二 3.2 免交互设置 4. rysnc 认…...

Gitlab升级报错一:rails_migration[gitlab-rails] (gitlab::database_migrations line 51)

Gitlab-ce从V14.0.12升级到V14.3.6或V14.10.5时报错&#xff1a;如下图&#xff1a; 解决办法&#xff1a; 先停掉gitlab: gitlab-ctl stop 单独启动数据库&#xff0c;如果不单独启动数据库&#xff0c;就会报以上错误 sudo gitlab-ctl start postgresql 解决办法&#x…...

chatGPT流式回复是怎么实现的

chatGPT流式回复是怎么实现的 先说结论&#xff1a; chatGPT的流式回复用的就是HTTP请求方案中的server-send-event流式接口&#xff0c;也就是服务端向客户端推流数据。 那eventStream流式接口怎么实现呢&#xff0c;下面就进入正题&#xff01; 文章目录 chatGPT流式回复…...

使用SpringEL获得字符串中的表达式运算结果

概述 有时候会遇上奇怪的需求&#xff0c;比如解析字符串中表达式的结果。 这个时候自己写解析肯定是比较麻烦的&#xff0c; 正好SprinngEL支持加()、减(-)、乘(*)、除(/)、求余&#xff08;%&#xff09;、幂&#xff08;^&#xff09;运算&#xff0c;可以免去造轮子的功夫…...

力扣 39. 组合总和

题目来源&#xff1a;https://leetcode.cn/problems/combination-sum/description/ C题解&#xff1a; 递归法。递归前对数组进行有序排序&#xff0c;可方便后续剪枝操作。 递归函数参数&#xff1a;定义两个全局变量&#xff0c;二维数组result存放结果集&#xff0c;数组pa…...

基于BES系列蓝牙耳机NTC充电电池保护电路设计

+hezkz17进数字音频系统研究开发交流答疑 一 在充电电路中NTC作用? 在充电电路中,NTC(Negative Temperature Coefficient)热敏电阻通常被用于温度检测和保护。它具有随温度变化而变化的电阻值。 以下是NTC在充电电路中的几种常见作用: 温度监测:NTC热敏电阻可以用来测量…...

13-C++算法笔记-递归

&#x1f4da; Introduction 递归是一种常用的算法设计和问题求解方法。它基于问题可以分解为相同类型的子问题&#xff0c;并通过解决子问题来解决原始问题的思想。递归算法在实际编程中具有广泛的应用。 &#x1f3af; 递归算法解决问题的特点 递归算法具有以下特点&#…...

从古代八卦探究计算机的八进制

八进制&#xff0c;即八卦&#xff0c;是中国古代哲学体系中非常重要的一个概念&#xff0c;它被广泛应用于易经、道家、儒家等诸多领域。随着计算机科学的快速发展&#xff0c;人们开始思考&#xff1a;八进制是否可以应用到计算机上&#xff1f; 一、什么是八进制&#xff1…...

Linux shell mkfs.ext4命令参数使用

mkfs mkfs是个综合命令 mkfs 然后按两下tab 查看系统支持哪些文件系统的格式化功能 mkfs -t 文件系统格式名 以指定的文件系统格式来进行磁盘格式化 > 等于 mkfs.文件系统格式名 比如&#xff1a; mkfs -t xfs mkfs.xfs 常见的磁盘格式…...

【Docker】子系统与其相关名词的界定、Control Groups等详细讲解

前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 &#x1f4d5;作者简介&#xff1a;热…...

spring事务的传播性与隔离性

spring事务的传播性 REQUIRED&#xff08;必须的&#xff09;(TransactionDefinition.PROPAGATION_REQUIRED) 使用当前的事务&#xff0c;如果当前没有事务&#xff0c;则自己新建一个事务&#xff0c;子方法是必须运行在一个事务中的&#xff0c;如果当前存在事务&#xff0c…...

【设计模式】模板方法与策略模式的结合使用

文章目录 1. 概述1.1.简述模板方法 2.模板方法实现2.1.简单实现2.2.在SpringBoot中的实现 3.模板方法与策略模式的结合使用3.1.代码实现 4.总结 1. 概述 模板方法是一种非常简单的设计模式&#xff0c;只要能够理解面向对象中的继承与多态就能够理解这种设计模式&#xff0c;我…...

Jmeter实现参数加密

目录 一、使用__digest自带函数 以md5加密算法演示使用方法 二、在BeanShell 中使用JAVA代码实现算法加密 规避BUG的方法 JMeter有两种方法可以实现算法加密 一、使用__digest自带函数 参数说明&#xff1a; Digest algorithm&#xff1a;算法摘要&#xff0c;可输入值&a…...

Solon Web 开发:四、认识请求上下文(Context)

Handler Context 架构&#xff0c;是Solon Web 的基础。在 Context &#xff08;org.noear.solon.core.handle.Context&#xff09;里可以获取&#xff1a; 请求相关的对象与接口会话状态相关的对象与接口响应相关的对象与接口 或者理解所有请求与响应相关的&#xff0c;都在…...

docker安装RocketMQ(附填坑经验connect to <172.17.0.3:10909> failed)

目录 一、docker部署RocketMQ1、简易说明2、docker拉取RocketMQ镜像\RocketMQ控制台3、获取RocketMQ配置文件4、RocketMQ配置文件描述5、docker启动RocketMQ6、进入RocketMQ控制台 二、填坑经验错误一: connect to <172.17.0.3:10909> failed错误二: maybe your broker m…...

GRU、LSTM、注意力机制(第八次组会)

GRU、LSTM、注意力机制(第八次组会) 一、 GRU二、 LSTM三、 深度RNN、双向RNN四、 注意力机制一、 GRU 二、 LSTM 三、 深度RNN、双向RNN...

问题杂谈(三十六)@RequestBody、@RequestParam和@PathVariable三个注解的区别和使用

总结&#xff1a; 在后端的同一个接收方法里&#xff0c;RequestBody与RequestParam()可以同时使用RequestBody最多只能有一个&#xff0c;而RequestParam()可以有多个RequestBody 接收的是请求体里面的数据&#xff0c;所以一般用POST请求&#xff1b;而RequestParam接收的是…...

Flutter学习四:Flutter开发基础(六)调试Flutter应用

目录 0 引言 1 调试Flutter应用 1.1 日志与断点 1.1.1 debugger() 声明 1.1.2 print和debugPrint 1.1.3 调试模式、中间模式、发布模式 1.1.4 断点 1.2 调试应用程序层 1.2.1 转储Widgets树 1.2.2 转储渲染树 1.2.3 转储Layer树 1.2.4 转储语义树 1.2.5 调度&…...

从游戏机到影音中心:用wiliwili解锁Switch的隐藏娱乐潜能

从游戏机到影音中心&#xff1a;用wiliwili解锁Switch的隐藏娱乐潜能 【免费下载链接】wiliwili 专为手柄控制设计的第三方跨平台B站客户端&#xff0c;目前可以运行在PC全平台、PSVita、PS4 和 Nintendo Switch上 项目地址: https://gitcode.com/GitHub_Trending/wi/wiliwil…...

别再花冤枉钱!和腰突颈椎病斗了 3 年,我终于踩中了康复的捷径

有没有和我一样的打工人&#xff0c;每天久坐 8 小时起步&#xff0c;下班就低头刷手机&#xff0c;年纪轻轻颈椎腰椎先 “垮了”&#xff1f; 从最开始的脖子发酸、腰部发僵&#xff0c;到后来疼到睡不着觉、手麻到握不住鼠标&#xff0c;甚至走路都直不起腰&#xff0c;这 3…...

LoRA训练助手入门解析:为什么权重排序对LoRA训练效果影响显著

LoRA训练助手入门解析&#xff1a;为什么权重排序对LoRA训练效果影响显著 1. 认识LoRA训练助手 如果你正在尝试训练自己的AI绘画模型&#xff0c;可能会遇到一个常见问题&#xff1a;为什么同样的图片&#xff0c;用不同的标签训练出来的效果差距那么大&#xff1f;这就是我们…...

Phi-4-mini-reasoning企业应用探索:智能客服知识推理模块集成方案

Phi-4-mini-reasoning企业应用探索&#xff1a;智能客服知识推理模块集成方案 1. 轻量级推理模型的价值 在当今企业智能化转型浪潮中&#xff0c;轻量级推理模型正成为技术落地的关键。Phi-4-mini-reasoning作为一款专注于高质量推理的开源模型&#xff0c;凭借其128K令牌的超…...

5分钟掌握:billd-desk跨平台远程控制高效解决方案

5分钟掌握&#xff1a;billd-desk跨平台远程控制高效解决方案 【免费下载链接】billd-desk 基于Vue3 WebRTC Nodejs Flutter搭建的远程桌面控制 项目地址: https://gitcode.com/gh_mirrors/bi/billd-desk 还在为远程办公的卡顿和限制而烦恼吗&#xff1f;当你急需远程…...

专业数据恢复工具对决:UFS Explorer与R-Studio的实战选型指南

1. 数据恢复工具的核心价值与选型逻辑 当硬盘突然罢工或重要文件被误删时&#xff0c;专业数据恢复软件就像数字世界的急救医生。我经历过太多凌晨三点被叫醒处理服务器崩溃的案例&#xff0c;选对工具往往能决定数据"复活"的成功率。UFS Explorer和R-Studio这对老对…...

技术揭秘:QtScrcpy如何实现跨平台Android投屏与低延迟控制

技术揭秘&#xff1a;QtScrcpy如何实现跨平台Android投屏与低延迟控制 【免费下载链接】QtScrcpy Android实时投屏软件&#xff0c;此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限 项目地址: https://gitcode.com/barry-ran/QtScr…...

LeetCode 11. Container With Most Water 题解

LeetCode 11. Container With Most Water 题解 题目描述 给你 n 个非负整数 a1&#xff0c;a2&#xff0c;...&#xff0c;an&#xff0c;每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线&#xff0c;垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条…...

Layerdivider:零基础上手图像分层工具的完整指南

Layerdivider&#xff1a;零基础上手图像分层工具的完整指南 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 为什么自动分层总是不尽如人意&#xff1f;设…...

别再手动改daemon.json了!1Panel面板里一键配置Docker国内镜像源(附最新可用源列表)

1Panel面板实战&#xff1a;3分钟搞定Docker国内镜像加速配置 刚部署完1Panel的新用户总会遇到一个经典问题——Docker拉取镜像慢得像蜗牛爬。传统解决方案是手动编辑daemon.json文件&#xff0c;但如今有了更优雅的选择。作为一款现代化服务器管理面板&#xff0c;1Panel将复杂…...