解锁数据库运维秘籍:掌握AntDB-T动态共享内存,提升进程间通信效率

news2024/11/20 20:43:50

动态共享内存是AntDB数据库通信的重要手段,本文主要阐述AntDB-T数据库动态共享内存的实现原理、实现方式与使用方法。

AntDB-T数据库是一款企业级通用分布式关系型数据库,其数据库内核是基于进程模型实现的,因此进程间通信(IPC)是实现分布式架构间进行任务协作和数据共享的关键。

实现进程间通信的方式有多种,例如管道、消息队列、信号量、共享内存等。在程序运行过程中,AntDB-T数据库为了实现进程之间更高效的通信和数据传输,采用了共享内存的方式。例如,AntDB-T数据库在并发任务需要创建多个工作进程的情况下,工作进程与后端进程之间的通信和数据传输将通过动态创建的共享内存来实现。       

(一)AntDB-T动态共享内存实现原理

那接下来本部分内容就为各位小伙伴慢慢解析AntDB-T数据库动态共享内存的原理。

AntDB-T动态共享内存是什么    

动态共享内存(dynamic shared memory):简称 DSM,在数据库运行期间可以动态创建出来的共享内存,动态共享内存允许AntDB-T在运行时动态地分配和释放内存,从而提高系统的性能和可伸缩性。

 AntDB-T中动态共享内存实现方式            

在AntDB-T中动态共享内存的实现方式有多种,由dynamic_shared_memory_type参数控制,默认是posix是指使用shm_open分配的POSIX shared memory。

图片

图1:dynamic_shared_memory_type 配置参数

dynamic_shared_memory_type参数定义如下表:

参数名称

dynamic_shared_memory_type

数据类型

enum

默认值

posix

取值范围

{posix,sysv,mmap,windows}  

其中posix,sysv,mmap适用于Linux平台;

windows适用于Windows平台

参数含义

指定PostgreSQL使用的dynamic shared memory的实现方式。

posix是指使用shm_open分配的POSIX shared memory;

sysv是指使用shmget分配的System V shared memory;

windows是指Windows shared memory;

mmap是指使用存在的data directory中的memory-mapped files模拟的shared memory。

通常不鼓励使用mmap值,这在任何平台上都不是默认值,因为操作系统可能会反复将修改过的页面写回磁盘,从而增加系统I/O负载;但是,当pg_dynshmem子目录存储在RAM磁盘上,或者其他共享内存工具不可用时,它可能对调试有用。        

是否可session级修改

修改后何时生效

重启AntDB-T instance生效

启用动态内存共享之后,当AntDB-T数据库启动后会在/dev/shm目录下有所体现,关了AntDB-T数据库之后,这些文件就没有了:

图片

图2:AntDB-T数据库启动后/dev/shm目录情况

图片

图3:AntDB-T数据库关闭后/dev/shm目录情况

AntDB-T为什么要引入动态共享内存

动态共享内存可以在运行时动态地分配和释放内存,从而使得内存管理更加灵活和高效,并且动态共享内存还可以实现延迟初始化(lazy initialization)和重新配置(reconfiguration)等特性,从而提高了系统的性能和可伸缩性。

在实际AntDB-T数据库中,动态共享内存在很多地方会用到,举个例子比如动态共享内存在并行中会用到,因为对于并行查询而言,执行时创建的DN worker进程与 DN leader进程通过共享内存实现数据交互。但这部分内存无法像普通的共享内存那样在系统启动时预先分配,毕竟直到真正执行时才知道有多少 DN worker进程,以及需要分配多少内存。动态共享内存,即在执行时动态创建,用于 DN leader与 DN worker间通信,执行完成后释放。    

(二)AntDB-T动态共享内存实现方式

下面将针对动态共享内存机制进行源码说明。本次以AntDB-T的代码为例,来解析动态共享内存的实现方式。

在AntDB-T源码中,dsm.c、dsm_impl.c文件提供了动态共享内存的功能,实现了共享内存的动态申请和释放。动态共享内存通过一个handle(typedef uint32 dsm_handle;)与一块内存进行映射,这个handle是一个32位无符号整数。在创建动态共享内存时,需要指定一个handle作为标识符,而访问动态共享内存时也是通过这个handle进行访问。不同进程之间通过传递handle来告知对方动态共享内存的位置,其他进程则通过handle来访问该动态共享内存。       

1.基础数据结构

dsm_control_header和dsm_control_item是动态共享内存里最基础的2个数据结构。定义如下图所示:    

图片

图4:dsm_control_header和dsm_control_item数据结构

dsm_control_header是动态共享内存的控制结构头,dsm_control_item记录每个分配的动态共享内存的状态,字段nitems表示动态共享内存当前已经使用的数量,字段maxitems表示动态共享内存的最大数量,字段refcnt表示 /* 2+ = active, 1 = moribund, 0 = gone */,字段impl_private_pm_handle表示仅在Windows上需要,字段pinned表示是否固定动态共享内存段,dsm_handle表示动态共享内存段的名字。

dsm_segment表示申请的一个共享内存段,对于动态共享内存的api来说这是代表共享内存的最小单位,定义如下图所示:

图片

图5:dsm_segment数据结构    

每个后端进程都可以通过使用dsm_segment来访问共享内存,dsm_segment包含了内存分配和释放等操作所需的信息,并提供了一组函数来管理和操作共享内存,每个会话(session)可以有一个或多个dsm_segment。其中字段mapped_address代表需要返回的当前映射共享内存的起始地址,字段resowner表示该动态共享内存段资源所有者,control_slot表示在控制动态共享内存段(dsm_control_header)里面的第几个item。      

2.初始化AntDB-T动态共享内存(DSM)

在 postmaster 主进程启动时,调用dsm_postmaster_startup(PGShmemHeader *shim)函数,进行动态共享内存相关的初始化,其主要逻辑如下:

 1)计算 dsm_control 结构所需要的内存大小:

1>计算所需共享内存的最大数量maxitems,

maxitems=PG_DYNSHMEM_FIXED_SLOTS+ PG_DYNSHMEM_SLOTS_PER_BACKEND * MaxBackends =64+5* MaxBackends

其中:PG_DYNSHMEM_FIXED_SLOTS为64,PG_DYNSHMEM_SLOTS_PER_BACKEND为5

该值(maxitems)与 MaxBackends大小有关,MaxBackends为最大的backend进程的数量,和配置的最大连接数(max_connections)、autovacuum worker进程的最大个数(autovacuum_max_workers)、并发进程的最大数量(max_worker_processes)、wal sender process的最大数量有关。

2>根据maxitems计算dsm_control 结构所需要的内存大小segsize,

segsize = dsm_control_bytes_needed(maxitems);

其中函数dsm_control_bytes_needed定义:  ​​​​​​​

static uint64dsm_control_bytes_needed(uint32 nitems){      return offsetof(dsm_control_header, item)            + sizeof(dsm_control_item) * (uint64) nitems;}

2)调用 dsm_impl_op() 函数,该函数根据dynamic_shared_memory_type参数调用不同的接口创建用于dsm_control 结构的动态共享内存,地址赋值给 dsm_control 变量,该变量的类型为 dsm_control_header 。

3)初始化 magic、nitems、maxitems变量,其中maxitems 表示AntDB-T该DN节点所有进程能够申请的动态共享内存的最大数量,nitems 表示当前已使用的动态共享内存数量,每一次动态共享内存申请,对应一个 dsm_control_item。

其函数大致调用关系如下:​​​​​​​

main(int argc, char *argv[])PostmasterMain(int argc, char *argv[])reset_shared(void)CreateSharedMemoryAndSemaphores(void)dsm_postmaster_startup(PGShmemHeader *shim)

3. 清理AntDB-T动态共享内存(DSM)

在 postmaster 主进程关闭时,会调用 dsm_postmaster_shutdown() 函数进行 dsm 的清理,这个函数是在初始化动态共享内存(dsm_postmaster_startup())时就指定了on_shmem_exit(dsm_postmaster_shutdown, PointerGetDatum(shim));

清理动态共享内存的主要逻辑:首先检查动态共享内存段是否已经损坏,如果损坏了就记录错误日志直接返回,如果没有损害时就遍历 dsm_control->nitems 数组,对其中正在使用的 item 对应的动态共享内存(DSM)进行销毁 ,最后再销毁 dsm_control 自身对应的 动态共享内存(DSM) 内存 。

(三)AntDB-T动态共享内存实践分享

使用动态共享内存之前,需要先对其进行创建。AntDB-T启动时已经初始化好了动态共享内存,后面使用的时候只需要创建动态共享内存,挂载动态共享内存,解除挂载动态共享内存,销毁共享内存。AntDB-T数据库使用动态共享内存的地方有很多,下面举个最简单的并行查询的例子来解说下如何使用动态共享内存,举例的表字段和并行查询的执行计划如下图所示:

图片

图6:AntDB-T 并行查询的例子

可以从上图的执行计划里面明确看到有使用到了并行查询,并且并行的worker个数是2。先进行简单的并行查询的原理介绍,图如下所示:DN backend主进程拉起从进程,DN backend主进程在处理时,发现需要进行并行处理,就会在启动从进程时,会调用 LaunchParallelWorkers 函数,这个函数会调用RegisterDynamicBackgroundWorker ,此时会给 Postmaster 进程发一个信号,请求 Postmaster 进程启动一个 background 进程,Postmaster 进程收到信号后就会启动一个新后台进程来处理查询。

图片

    图7:AntDB-T 并行查询的流程        

在 AntDB-T 的源码中,上述SQL例子在并行查询中使用动态共享内存(DSM),其主要逻辑如下:

1.DN backend主进程在判断需要进行并行处理时,就会初始化并行执行计划ExecInitParallelPlan,在ExecInitParallelPlan函数中,会评估共享内存大小:通过使用shm_toc_estimate_chunk、shm_toc_estimate_keys宏定义向estimate中增加数据结构,可以多次调用,然后使用shm_toc_estimate得出需要创建的动态共享内存的总大小,最后调用 dsm_create()函数 创建动态共享内存(DSM)。创建并行的工作进程时,将动态共享内存(DSM)对应的 handle 作为参数传递给 并行的worker 进程,其调用关系如下:

ExecGather(PlanState *pstate)ExecInitParallelPlan(PlanState *planstate, EState *estate,                               Bitmapset *sendParams, int nworkers,                               int64 tuples_needed)InitializeParallelDSM(ParallelContext *pcxt)dsm_create(Size size, int flags)LaunchParallelWorkers(ParallelContext *pcxt)worker.bgw_main_arg = UInt32GetDatum(dsm_segment_handle(pcxt->seg));

2.并行的子进程(DN worker 进程)先调用 dsm_attach() 函数挂载到动态共享内存,然后调用函数ParallelQueryMain处理查询业务该函数里面使用了动态共享内存,当并行的子进程执行结束时,会调用 dsm_detach() 函数解除挂载的 dsm 共享内存,其大致的调用关系如下:​​​​​​​

ParallelWorkerMain(Datum main_arg)seg = dsm_attach(DatumGetUInt32(main_arg));ParallelQueryMain(dsm_segment *seg, shm_toc *toc)area = dsa_attach_in_place(area_space, seg);dsa_detach(area)dsm_detach(area->segment_maps[i].segment);

总结

本文主要讲述了AntDB-T动态共享内存的基本概念、引入动态共享内存带来的能力提升、基本数据结构、动态共享内存机制原理和使用方法。限于篇幅,动态共享内存的其他函数接口比如:dsm_pin_mapping、dsm_unpin_mapping、dsm_pin_segment、其他使用动态共享内存的场景、动态共享内存中涉及的锁等相关内容没有涉及,小伙伴们请持续关注AntDB数据库公众号。            

关于AntDB数据库

AntDB数据库始于2008年,在运营商的核心系统上,为全国24个省份的10亿多用户提供在线服务,具备高性能、弹性扩展、高可靠等产品特性,峰值每秒可处理百万笔电信核心交易,保障系统持续稳定运行近十年,并在通信、金融、交通、能源、物联网等行业成功商用落地。    

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

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

相关文章

软件安全检测赋能赣州发展,开源网安与赣州国投完成签约

​11月20日,开源网安与赣州章贡区数智国投科技有限公司签订投资协议,签约后双方将在赣州打造软件供应链安全检测中心,以强大的软件测试能力为数字政府、数字经济等领域提供全面安全检测和软件安全运营监测等服务,提升软件的安全与…

centos7 利用nc命令探测某个tcp端口是否在监听

脚本 # 安装nc yum install -y ncnc -vz 192.168.3.128 60001 if [ $? -eq 0 ]; thenecho "tcp succeed" elseecho "tcp failed" fi nc -vz 192.168.3.128 60001 探测192.168.3.128服务器上60001 tcp端口, -vz说明是探测TCP的 端口开启的情况 执行…

软件外包开发的验收流程

软件外包开发的验收流程是确保项目符合预期标准并满足客户需求的关键步骤。以下是一个通用的软件外包开发验收流程,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.明确验收标准: 在项目…

2023食药物质产业发展大会12月在浙江绍兴隆重召开

为更好地推动食药物质行业高质量发展,推进食药物质相关产品的创新应用,促进行业科技进步,提高行业技术水平,中国生物发酵产业协会定于12月15-17日在浙江省绍兴市召开“2023食药物质产业发展大会暨中国生物发酵产业协会食药物质专业…

值得收藏的 9 款适用于 Windows 的 PDF 转换器软件

将 PDF 文档转换为您所需的文件格式的方法有很多,例如,使用在线转换工具或桌面 PDF 转换器软件。 虽然在线PDF转换工具方便快捷,但它们没有顾虑,例如内容隐私/安全,因为您需要将文件上传到开发人员的服务器。 这就是…

设计模式——结构型模式

结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更…

递归和分治

递归 递归(英语:Recursion),在计算机科学中,递归指的是一个函数在其定义中调用自身的方法。这种技术允许程序解决复杂问题,通过将它们分解为更小、更易管理的相似问题。递归通常与分治策略相关联&#xff…

5-Nacos环境搭建

本文介绍nacos集群环境的搭建。 1、基础环境 机器:mac,intel版本jdk:1.8数据库:mysql 8.029nacos:2.03 2、下载 nacos点击这里下载。 3、开始配置 这里搭建在自己机器上搭建两台nacos集群。下载完成后&#xff0…

Mac使用unrar和rar解压文件

WinRAR archiver, a powerful tool to process RAR and ZIP files 下载 tar -xzvf rarmacos-x64-624.tar.gz cd rar # 安装rar命令 sudo install -c -o $USER rar /usr/local/bin/ # 安装unrar命令 sudo install -c -o $USER unrar /usr/local/bin/ 压缩rar a test.rar readme…

智慧工地网络广播系统

智慧工地网络广播系统 智慧工地网络广播,是智慧公司不可缺少的一环,对于工地广播来说,音质和传输稳定性都是非常重要的要素。尤其是在高楼大厦密集的地方,可能会存在信号干扰和传输受阻的情况,这时候可以考虑使用网络…

hadoop 配置历史服务器 开启历史服务器查看 hadoop (十)

1. 配置了三台服务器,hadoop22, hadoop23, hadoop24 2. hadoop文件路径: /opt/module/hadoop-3.3.4 3. hadoop22机器配置历史服务器的配置文件: 文件路径:/opt/module/hadoop-3.3.4/etc/hadoop 文件名称:mapred-size.xml 新增历…

一文带你了解MySQL数据库基础

✏️✏️✏️今天给各位带来的是关于数据库基础方面的知识。 清风的CDSN博客 😛😛😛希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流! 动动你们发财的小手,点点…

kubernetes测试部署一个nginx

在kubenetes集群中部署一个nginx程序测试集群是否能正常工作 #部署nginx程序 [rootmaster ~]# kubectl create deployment nginx --imagenginx:1.18-alpine #开放端口 [rootmaster ~]# kubectl expose deployment nginx --port80 --typeNodePort #查看pod状态 [rootmaster …

电脑开不了机怎么办?三招帮你成功解决!

电脑是我们日常工作和生活的重要工具,但有时候它们也会出现开机问题。当电脑无法启动时,可能会让人感到焦虑,电脑开不了机怎么办?不必担心,通常有多种方法可以解决这些问题。本文将介绍三种常见的方法,以帮…

【工具与中间件】IDEA工具的使用:热部署、快捷键与版本控制

文章目录 0. 前言1. IDEA 配置热部署2. IDEA 常用快捷键3. IDEA 绑定GIT4. 小结 IDEA工具配置热部署,让我们的开发更有效率 0. 前言 以下是水文字,心急的读者可以直接阅读下面的章节。 有时,新,先进的东西确实可以给这个时代的…

Shell脚本:Linux Shell脚本学习指南(第二部分Shell编程)一

第二部分:Shell编程(一) 这一章我们正式进入 Shell 脚本编程,重点讲解变量、字符串、数组、数学计算、选择结构、循环结构和函数。 Shell 的编程思想虽然和 C、Java、Python、C# 等其它编程语言类似,但是在语法细节方…

Zynq-Linux移植学习笔记之66- 国产ZYNQ通过裕太PHY8521连接国产交换芯片

1、背景介绍 ZYNQ通过裕太PHY 8521主要连接两种国产交换芯片,一种为盛科的CTC8096,另一种为32所的JEM5396。框图示意如下: 2、硬件状态确认 首先检查phy的模式,确认为SGMII_MAC-RGMII_PHY 可通过读出A001寄存器确认状态 读出来应…

LeetCode(31)无重复字符的最长子串【滑动窗口】【中等】

目录 1.题目2.答案3.提交结果截图 链接: 无重复字符的最长子串 1.题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&…

Linux安全之AIDE系统入侵检测工具安装和使用

一、AIDE 系统入侵检测工具简介 AIDE,全称为Advanced Intrusion Detection Environment,是一个主要用于检测文件完整性的入侵检测工具。它能够构建一个指定文件的数据库,并使用aide.conf作为其配置文件。AIDE数据库能够保存文件的各种属性&am…

APP外包开发项目验收

应用外包开发的验收是确保项目交付质量和客户满意度的关键阶段。以下是一些建议,帮助你进行有效的APP外包开发验收,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.明确验收标准&#xf…