openGauss学习笔记-83 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT使用内存和存储规划

news2024/12/29 17:48:07

文章目录

    • openGauss学习笔记-83 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT使用内存和存储规划
      • 83.1 MOT内存规划
      • 83.2 存储IO
      • 83.3 容量需求

openGauss学习笔记-83 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT使用内存和存储规划

本节描述了为满足特定应用程序需求,在评估、估计和规划内存和存储容量数量时,需要注意的事项和准则,以及影响所需内存数量的各种数据,例如计划表的数据和索引大小、维持事务管理的内存以及数据增长的速度。

83.1 MOT内存规划

MOT是一种内存数据库存储引擎(IMDB),其中所有表和索引完全驻留在内存中。

img 说明: 内存存储是易失的,需要电力来维护所存储的信息。磁盘存储是持久的,写入磁盘是非易失性存储。MOT使用两种存储,既把所有数据保存在内存中,也把事务性更改同步(通过WAL日志记录)到磁盘上以保持严格一致性(使用同步日志记录模式)。

服务器上必须有足够的物理内存以维持内存表的状态,并满足工作负载和数据的增长。所有这些都是在传统的基于磁盘的引擎、表和会话所需的内存之外的要求。因此,提前规划好足够的内存来容纳这些内容是非常有必要的。

开始可以使用任何数量的内存并执行基本任务和评估测试。但当准备好生产时,应解决以下问题:

  • 内存配置

    openGauss数据库和标准Postgres类似,其内存上限是由max_process_memory设置的,该上限在postgresql.conf文件中定义。MOT及其所有组件和线程,都驻留在openGauss进程中。因此,分配给MOT的内存也是在整个openGauss数据库进程的max_process_memory定义的上限内分配。

    MOT为自己保留的内存是max_process_memory的一部分。可以通过百分比或通过小于max_process_memory的绝对值定义。这个部分在mot.conf配置文件中由<min / max>mot<global / local>_memory配置项定义。

    max_process_memory中可以除了被MOT使用的部分之外,必须为Postgres(openGauss)封装留下至少2GB的可用空间。为了确保这一点,MOT在数据库启动过程中会进行如下校验:

    (max_mot_global_memory + max_mot_local_memory) + 2GB < max_process_memory
    

    如果违反此限制,则调整MOT内存内部限制,最大可能地满足上述限制范围。该调整在启动时进行,并据此计算MOT最大内存值。

    img 说明: MOT最大内存值是配置或调整值(max_mot_global_memory + max_mot_local_memory)的逻辑计算值。

    此时,会向服务器日志发出警告,如下所示:

    以下是报告问题的警告消息示例:

    [WARNING] <Configuration> MOT engine maximum memory definitions (global: 9830 MB, local: 1843 MB, session large store: 0 MB, total: 11673 MB) breach GaussDB maximum process memory restriction (12288 MB) and/or total system memory (64243 MB). MOT values shall be adjusted accordingly to preserve required gap (2048 MB).  
    

    以下警告消息示例提示MOT正在自动调整内存限制:

    [WARNING] <Configuration> Adjusting MOT memory limits: global = 8623 MB, local = 1617 MB, session large store = 0 MB, total = 10240 MB 
    

    新内存限制仅在此处显示。

    此外,当总内存使用量接近所选内存限制时,MOT不再允许插入额外数据。不再允许额外数据插入的阈值即是MOT最大内存百分比(如上所述,这是一个计算值)。MOT最大内存百分比默认值为90,即90%。尝试添加超过此阈值的额外数据时,会向用户返回错误,并且也会注册到数据库日志文件中。

  • 最小值和最大值

    为了确保内存安全,MOT根据最小的全局和本地设置预先分配内存。数据库管理员应指定MOT和会话维持工作负载所需的最小内存量。这样可以确保即使另一个消耗内存的应用程序与数据库在同一台服务器上运行,并且与数据库竞争内存资源,也能够将这个最小的内存分配给MOT。最大值用于限制内存增长。

  • 全局和本地

    MOT使用的内存由两部分组成:

    • 全局内存:全局内存是一个长期内存池,包含MOT的数据和索引。它平均分布在NUMA节点,由所有CPU核共享。

    • 本地内存:本地内存是用于短期对象的内存池。它的主要使用者是处理事务的会话。这些会话将数据更改存储在专门用于相关特定事务的内存部分(称为事务专用内存)。在提交阶段,数据更改将被移动到全局内存中。内存对象分配以NUMA-local方式执行,以实现尽可能低的延迟。

      被释放的对象被放回相关的内存池中。在事务期间尽量少使用操作系统内存分配(malloc)函数,避免不必要的锁和锁存。

      这两个内存的分配由专用的min/max_mot_global_memory和min/max_mot_local_memory设置控制。如果MOT全局内存使用量太接近最大值,则MOT会保护自身,不接受新数据。超出此限制的内存分配尝试将被拒绝,并向用户报告错误。

  • 最低内存要求

    在开始执行对MOT性能的最小评估前,请确保:

    除了磁盘表缓冲区和额外的内存,max_process_memory(在postgresql.conf中定义)还有足够的容量用于MOT和会话(由mix/max_mot_global_memory和mix/max_mot_local_memory配置)。对于简单的测试,可以使用mot.conf的默认设置。

  • 生产过程中实际内存需求

    在典型的OLTP工作负载中,平均读写比例为80:20,每个表的MOT内存使用率比基于磁盘的表高60%(包括数据和索引)。这是因为使用了更优化的数据结构和算法,使得访问速度更快,并具有CPU缓存感知和内存预取功能。

    特定应用程序的实际内存需求取决于数据量、预期工作负载,特别是数据增长。

  • 最大全局内存规划:数据和索引大小

    要规划最大全局内存,需满足:

    1. 确定特定磁盘表(包括其数据和所有索引)的大小。如下统计查询可以确定customer表的数据大小和customer_pkey索引大小:

      • 数据大小:选择pg_relation_size(‘customer’);
      • 索引:选择pg_relation_size(‘customer_pkey’);
    2. 额外增加60%的内存,相对于基于磁盘的数据和索引的当前大小,这是MOT中的常见要求。

    3. 额外增加数据预期增长百分比。例如:

      5%月增长率 = 80%年增长率(1.05^12)。因此,为了维持年增长,需分配比表当前使用的还多80%的内存。

      至此,max_mot_global_memory值的估计和规划就完成了。实际设置可以用绝对值或Postgres max_process_memory的百分比来定义。具体的值通常在部署期间进行微调。

  • 最大本地内存规划:并发会话支持

    本地内存需求主要是并发会话数量的函数。平均会话的典型OLTP工作负载最大占用8MB。此值乘以会话的数量,再加一点额外的值。

    可以通过这种方式进行内存计算,然后进行微调:

    SESSION_COUNT * SESSION_SIZE (8 MB) + SOME_EXTRA (100MB should be enough)
    

    默认指定Postgres最大进程内存(默认为12GB)的15%。相当于1.8GB可满足230个会话,即max_mot_local内存需求。实际设置可以用绝对值或Postgres max_process_memory的百分比来定义。具体的值通常在部署期间进行微调。

  • 异常大事务

    某些事务非常大,因为它们将更改应用于大量行。这可能导致单个会话的本地内存增加到允许的最大限制,即1GB。例如:

    delete from SOME_VERY_LARGE_TABLE;
    

    在配置max_mot_local_memory设置和应用程序开发时,请考虑此场景。

    img 说明: 有关配置的更多信息,请参阅**内存(MOT)**部分。

83.2 存储IO

MOT是一个内存优化的持久化数据库存储引擎。需要磁盘驱动器来存储WAL重做日志和定期检查点。

推荐采用低延迟的存储设备,如配置RAID-1的SSD、NVMe或者任何企业级存储系统。当使用适当的硬件时,数据库事务处理和竞争将成为瓶颈,而非IO。

由于持久性存储比RAM内存慢得多,因此IO操作(日志和检查点)可能成为内存中数据库和内存优化数据库的瓶颈。但是,MOT具有针对现代硬件(如SSD、NVMe)进行优化的高效持久性设计和实现。此外,MOT最小化和优化了写入点(例如,使用并行日志记录、每个事务的单日志记录和NUMA-aware事务组写入),并且最小化了写入磁盘的数据(例如,只把更改记录的增量或更新列记录到日志,并且只记录提交阶段的事务)。

83.3 容量需求

所需容量取决于检查点和记录的要求,如下所述:

  • 检查点

    检查点将所有数据的快照保存到磁盘。

    需要给检查点分配两倍数据大小的容量。不需要为检查点索引分配空间。

    检查点 = 2 x MOT数据大小(仅表示行,索引非持久)。

    检查点之所以需要两倍大小,是因为快照会保存数据的全部大小到磁盘上,此外还应该为正在进行的检查点分配同样数量的空间。当检查点进程结束时,以前的检查点文件将被删除。

img 说明: 在下一个openGauss版本中,MOT将有一个增量检查点特性,这将大大降低存储容量需求。

  • 日志记录

    MOT日志记录与基于磁盘的表的其它记录写入同一个数据库事务日志。

    日志的大小取决于事务吞吐量、数据更改的大小和检查点之间的时间(每次检查点,重做日志被截断并重新开始扩展)。

    与基于磁盘的表相比,MOT使用较少的日志带宽和较低的IO争用。这由多种机制实现。

    例如,MOT不会在事务完成之前记录每个操作。它只在提交阶段记录,并且只记录更新的增量记录(不像基于磁盘的表那样的完整记录)。

    为了确保日志IO设备不会成为瓶颈,日志文件必须放在具有低延迟的驱动器上。

img 说明: 有关配置的更多信息,请参阅存储(MOT)

👍 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!

image-20230622211824681

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

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

相关文章

No132.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

基于python的智慧城市社区服务平台及养老服务子系统的设计与实现

文章目录 导文摘要前言绪论课题背景国内外现状与趋势国内现状:国外现状:趋势:课题内容相关技术与方法介绍系统分析系统设计系统实现导文 基于python的智慧城市社区服务平台及养老服务子系统的设计与实现 摘要 本文基于Python开发了一款智慧城市社区服务平台及养老服务子系统…

ant-design-pro的可编辑表格editprotable的遇到的一些小问题

需求&#xff1a;1、使用可编辑表格实现对某一行表格的数据进行编辑&#xff0c;对输入内容控制必须低于同行某一数据 2、解决搜索数据和列名展示不同&#xff0c;和不可编辑的列不展示在搜索框 实现效果 解决搜索和readonly之间的问题 因为本次需求只要求修改一个数据&…

ElementPlus· tab切换/标签切换 + 分页

tab切换 ---> <el-tabs><el-tab-pane>... 分页 --------> <el-pagination> tab切换 // tab标签切换 // v-model双向绑定选项中的name&#xff0c;tab-change事件在 activeName改变时触发 <script setup> const tabChange (tab, event)>{…

【JAVA】飞机大战

代码和图片放在这个地址了&#xff1a; https://gitee.com/r77683962/fighting/tree/master 最新的代码运行&#xff0c;可以有两架飞机&#xff0c;分别通过WASD&#xff08;方向&#xff09;&#xff0c;F&#xff08;发子弹&#xff09;&#xff1b;上下左右&#xff08;控…

大型企业网如何部署NAT实现需求

1.企业中堕胎电脑如何共享上网&#xff1f; 2.NAT地址转换原理讲解&#xff1b; 3.企业机房如何用NAT让服务器更安全&#xff1f; - NAT - 网络地址转换 - 什么式网络地址 IP地址 -通信时候的设备标识 - 为什么要把IP地址做转换呢&#xff1f; -- 公网IP&#xff…

迷你无人车 Navigation 导航(5)— 基础框架学习

迷你无人车 Navigation 导航&#xff08;5&#xff09;— 基础框架学习 整个功能包整个功能包集合以move_base为核心&#xff0c;将里程计信息、传感器信息、定位信息、地图以及目标点输入给move_base&#xff0c;move_base经过规划后会输出速度指令 move_base包括三个关键部分…

如何像人类一样写HTML之第一个HTML、标签的关系与注释

文章目录 前言一、创建第一个HTML文档创建方式1创建方式2 二、标签的关系三、注释的使用总结 前言 在现代数字化社会中&#xff0c;网页是我们获取信息、与他人交流以及展示自己的重要工具之一。要了解如何创建网页&#xff0c;HTML&#xff08;Hypertext Markup Language&…

给网站引入各大搜索引擎的关键字提示,白给的接口薅他羊毛

属于是导航网站必要的了 因为网站是个导航网站&#xff0c;有一个搜索框&#xff0c;用户搜索时需要像百度一样有个搜索提示关键词列表。 之前只是用百度&#xff0c;现在给增加了好几个&#xff0c;想换那个就换那个了&#xff0c;直接上图片 可以配置属于是想选哪个选哪个&…

树莓派4B使用Docker部署SpringBoot项目——(二)使用docker安装mysql

树莓派4B使用docker安装mysql 使用的树莓派4B为8GB版本&#xff0c;使用docker pull命令拉取MySQL镜像&#xff1a; docker pull --platformarm64 mysql/mysql-server等待拉取完成 使用docker images查看镜像 创建MySQL容器 docker run -di --namemysql -p 3306:3306 -e MY…

(vue3)create-vue 组合式API

优势&#xff1a; 更易维护&#xff1a;组合式api&#xff0c;更好的TS支持 之前是选项式api&#xff0c;现在是组合式&#xff0c;把同功能的api集合式管理 复用功能封装成一整个函数 更快的速度 更小的体积 更优的数据响应式&#xff1a;Proxy create-vue 新的脚手架工…

批量剪辑视频的秘密武器,添加SRT字幕并提升你的视频品质,高效剪辑的艺术

在如今的数字时代&#xff0c;视频内容的制作和分享变得越来越普遍。如果你是一个视频创作者&#xff0c;或者经常需要编辑和分享视频内容&#xff0c;那么我们为你带来了一款视频批量剪辑工具&#xff0c;让你轻松在固定位置添加字幕&#xff0c;打造专业级剪辑效果&#xff0…

五金零售批发商城小程序的作用是什么

五金产品在人们生活中不可或缺&#xff0c;无论需求高低&#xff0c;总归会购买&#xff0c;而每个城市的五金店也非常多&#xff0c;市场高应用度也促进了各个品牌商们增长&#xff0c;而在实际销售中&#xff0c;无论厂家还是门店商家都会面临一些痛点&#xff0c;如品牌宣传…

Spine Web Player教程

官方文档教程&#xff1a; Spine Web Player 报错&#xff1a; 1、Q:报Animation bounds are invalid XX错误&#xff1f; A:请校对cdn或者npm install的版本号是否与json资源内版本号一致。

SQL做流水号

SELECT REPLICATE(0, 3 - LEN(3)) 3 AS 流水号 SELECT REPLICATE(0, 5 - LEN(3)) 3 AS 流水号 SELECT REPLICATE(0, 8 - LEN(3)) 3 AS 流水号

公司新产品上线如何打出知名度?

任何一个新产品上线时都需要进行推广打出知名度&#xff0c;软文作为一种成本低效果留存时间长的营销方式能够让公司的新产品打出知名度&#xff0c;向潜在用户展示新产品的独特优势以及特性&#xff0c;下面就让媒介盒子告诉大家&#xff0c;新产品上线时&#xff0c;公司应该…

AIGC快速入门体验之虚拟对象

AIGC快速入门体验之虚拟对象 一、什么是AIGC二、AIGC应用场景2.1 代码生成2.2 图片生成2.3 对象生成 三、AIGC虚拟对象3.1 AIGC完全免费工具3.2 快速获取对象3.3 给对象取名3.4 为对象写首诗3.5 和对象聊聊天 一、什么是AIGC AIGC是生成式人工智能&#xff08;Artificial Intel…

每日一题——寻找右区间(排序 + 二分查找)

寻找右区间&#xff08;排序 二分查找&#xff09; 题目链接 理解题目 题目给定一个具有n行2列的二维数组intervals&#xff0c;对于intervals的每一行元素i&#xff0c;就表示一个区间数组&#xff0c;intervals[i][0]即这个区间数组的起始位置start&#xff0c;intervals[i…

JTS:09Touches 接触

这里写目录标题 版本JTS Touches边接触角点接触内部接触线段交叉顶点接触 版本 org.locationtech.jts:jts-core:1.19.0 链接: github JTS Touches 边接触 public void test00() {Coordinate[] coordinates1 new Coordinate[] {new Coordinate(1, 1), new Coordinate(1, 4),…

Gronwall‘s inequality

本文的主要了解下Gronwall不等式的两种形式&#xff0c;此不等式常常用来证明函数有界。 See 知乎&#xff1a; https://zhuanlan.zhihu.com/p/339358108