ITPub博客

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

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

原创 国内数据库 作者:亚信AntDB数据库 时间:2023-11-21 10:57:33 0 删除 编辑

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


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

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

( 一 ) A n t D B - T 动 态 共 享 内 存 实 现 原 理


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

A n t D B - T 动 态 共 享 内 存 是 什 么        
动 态 共 享 内 存 ( d y n a m i c   s h a r e d   m e m o r y ) : 简 称   D S M , 在 数 据 库 运 行 期 间 可 以 动 态 创 建 出 来 的 共 享 内 存 , 动 态 共 享 内 存 允 许 A n t D B - T 在 运 行 时 动 态 地 分 配 和 释 放 内 存 , 从 而 提 高 系 统 的 性 能 和 可 伸 缩 性 。

  A n t D B - T 中 动 态 共 享 内 存 实 现 方 式                        
在 A n t D B - T 中 动 态 共 享 内 存 的 实 现 方 式 有 多 种 , 由 d y n a m i c _ s h a r e d _ m e m o r y _ t y p e 参 数 控 制 , 默 认 是 p o s i x 是 指 使 用 s h m _ o p e n 分 配 的 P O S I X   s h a r e d   m e m o r y 。

图 1 : d y n a m i c _ s h a r e d _ m e m o r y _ t y p e   配 置 参 数


d y n a m i c _ s h a r e d _ m e m o r y _ t y p e 参 数 定 义 如 下 表 :

参 数 名 称
d y n a m i c _ s h a r e d _ m e m o r y _ t y p e
数 据 类 型
e n u m
默 认 值
p o s i x
取 值 范 围
{ p o s i x , s y s v , m m a p , w i n d o w s }    
其 中 p o s i x , s y s v , m m a p 适 用 于 L i n u x 平 台 ;
w i n d o w s 适 用 于 W i n d o w s 平 台
参 数 含 义
指 定 P o s t g r e S Q L 使 用 的 d y n a m i c   s h a r e d   m e m o r y 的 实 现 方 式 。
p o s i x 是 指 使 用 s h m _ o p e n 分 配 的 P O S I X   s h a r e d   m e m o r y ;
s y s v 是 指 使 用 s h m g e t 分 配 的 S y s t e m   V   s h a r e d   m e m o r y ;
w i n d o w s 是 指 W i n d o w s   s h a r e d   m e m o r y ;
m m a p 是 指 使 用 存 在 的 d a t a   d i r e c t o r y 中 的 m e m o r y - m a p p e d   f i l e s 模 拟 的 s h a r e d   m e m o r y 。
通 常 不 鼓 励 使 用 m m a p 值 , 这 在 任 何 平 台 上 都 不 是 默 认 值 , 因 为 操 作 系 统 可 能 会 反 复 将 修 改 过 的 页 面 写 回 磁 盘 , 从 而 增 加 系 统 I / O 负 载 ; 但 是 , 当 p g _ d y n s h m e m 子 目 录 存 储 在 R A M 磁 盘 上 , 或 者 其 他 共 享 内 存 工 具 不 可 用 时 , 它 可 能 对 调 试 有 用 。                
是 否 可 s e s s i o n 级 修 改
否
修 改 后 何 时 生 效
重 启 A n t D B - T   i n s t a n c e 生 效


启 用 动 态 内 存 共 享 之 后 , 当 A n t D B - T 数 据 库 启 动 后 会 在 / d e v / s h m 目 录 下 有 所 体 现 , 关 了 A n t D B - T 数 据 库 之 后 , 这 些 文 件 就 没 有 了 :

图 2 : A n t D B - T 数 据 库 启 动 后 / d e v / s h m 目 录 情 况


图 3 : A n t D B - T 数 据 库 关 闭 后 / d e v / s h m 目 录 情 况



A n t D B - T 为 什 么 要 引 入 动 态 共 享 内 存

动 态 共 享 内 存 可 以 在 运 行 时 动 态 地 分 配 和 释 放 内 存 , 从 而 使 得 内 存 管 理 更 加 灵 活 和 高 效 , 并 且 动 态 共 享 内 存 还 可 以 实 现 延 迟 初 始 化 ( l a z y   i n i t i a l i z a t i o n ) 和 重 新 配 置 ( r e c o n f i g u r a t i o n ) 等 特 性 , 从 而 提 高 了 系 统 的 性 能 和 可 伸 缩 性 。


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

( 二 ) A n t D B - T 动 态 共 享 内 存 实 现 方 式


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

在 A n t D B - T 源 码 中 , d s m . c 、 d s m _ i m p l . c 文 件 提 供 了 动 态 共 享 内 存 的 功 能 , 实 现 了 共 享 内 存 的 动 态 申 请 和 释 放 。 动 态 共 享 内 存 通 过 一 个 h a n d l e ( t y p e d e f   u i n t 3 2   d s m _ h a n d l e ; ) 与 一 块 内 存 进 行 映 射 , 这 个 h a n d l e 是 一 个 3 2 位 无 符 号 整 数 。 在 创 建 动 态 共 享 内 存 时 , 需 要 指 定 一 个 h a n d l e 作 为 标 识 符 , 而 访 问 动 态 共 享 内 存 时 也 是 通 过 这 个 h a n d l e 进 行 访 问 。 不 同 进 程 之 间 通 过 传 递 h a n d l e 来 告 知 对 方 动 态 共 享 内 存 的 位 置 , 其 他 进 程 则 通 过 h a n d l e 来 访 问 该 动 态 共 享 内 存 。              

1 . 基 础 数 据 结 构

d s m _ c o n t r o l _ h e a d e r 和 d s m _ c o n t r o l _ i t e m 是 动 态 共 享 内 存 里 最 基 础 的 2 个 数 据 结 构 。 定 义 如 下 图 所 示 :        

图 4 : d s m _ c o n t r o l _ h e a d e r 和 d s m _ c o n t r o l _ i t e m 数 据 结 构

d s m _ c o n t r o l _ h e a d e r 是 动 态 共 享 内 存 的 控 制 结 构 头 , d s m _ c o n t r o l _ i t e m 记 录 每 个 分 配 的 动 态 共 享 内 存 的 状 态 , 字 段 n i t e m s 表 示 动 态 共 享 内 存 当 前 已 经 使 用 的 数 量 , 字 段 m a x i t e m s 表 示 动 态 共 享 内 存 的 最 大 数 量 , 字 段 r e f c n t 表 示   / *   2 +   =   a c t i v e ,   1   =   m o r i b u n d ,   0   =   g o n e   * / , 字 段 i m p l _ p r i v a t e _ p m _ h a n d l e 表 示 仅 在 W i n d o w s 上 需 要 , 字 段 p i n n e d 表 示 是 否 固 定 动 态 共 享 内 存 段 , d s m _ h a n d l e 表 示 动 态 共 享 内 存 段 的 名 字 。
d s m _ s e g m e n t 表 示 申 请 的 一 个 共 享 内 存 段 , 对 于 动 态 共 享 内 存 的 a p i 来 说 这 是 代 表 共 享 内 存 的 最 小 单 位 , 定 义 如 下 图 所 示 :

图 5 : d s m _ s e g m e n t 数 据 结 构        

每 个 后 端 进 程 都 可 以 通 过 使 用 d s m _ s e g m e n t 来 访 问 共 享 内 存 , d s m _ s e g m e n t 包 含 了 内 存 分 配 和 释 放 等 操 作 所 需 的 信 息 , 并 提 供 了 一 组 函 数 来 管 理 和 操 作 共 享 内 存 , 每 个 会 话 ( s e s s i o n ) 可 以 有 一 个 或 多 个 d s m _ s e g m e n t 。 其 中 字 段 m a p p e d _ a d d r e s s 代 表 需 要 返 回 的 当 前 映 射 共 享 内 存 的 起 始 地 址 , 字 段 r e s o w n e r 表 示 该 动 态 共 享 内 存 段 资 源 所 有 者 , c o n t r o l _ s l o t 表 示 在 控 制 动 态 共 享 内 存 段 ( d s m _ c o n t r o l _ h e a d e r ) 里 面 的 第 几 个 i t e m 。            


2 . 初 始 化 A n t D B - T 动 态 共 享 内 存 ( D S M )

在   p o s t m a s t e r   主 进 程 启 动 时 , 调 用 d s m _ p o s t m a s t e r _ s t a r t u p ( P G S h m e m H e a d e r   * s h i m ) 函 数 , 进 行 动 态 共 享 内 存 相 关 的 初 始 化 , 其 主 要 逻 辑 如 下 :


  1 ) 计 算   d s m _ c o n t r o l   结 构 所 需 要 的 内 存 大 小 :
1 > 计 算 所 需 共 享 内 存 的 最 大 数 量 m a x i t e m s ,

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

其 中 : P G _ D Y N S H M E M _ F I X E D _ S L O T S 为 6 4 , P G _ D Y N S H M E M _ S L O T S _ P E R _ B A C K E N D 为 5
该 值 ( m a x i t e m s ) 与   M a x B a c k e n d s 大 小 有 关 , M a x B a c k e n d s 为 最 大 的 b a c k e n d 进 程 的 数 量 , 和 配 置 的 最 大 连 接 数 ( m a x _ c o n n e c t i o n s ) 、 a u t o v a c u u m   w o r k e r 进 程 的 最 大 个 数 ( a u t o v a c u u m _ m a x _ w o r k e r s ) 、 并 发 进 程 的 最 大 数 量 ( m a x _ w o r k e r _ p r o c e s s e s ) 、 w a l   s e n d e r   p r o c e s s 的 最 大 数 量 有 关 。
2 > 根 据 m a x i t e m s 计 算 d s m _ c o n t r o l   结 构 所 需 要 的 内 存 大 小 s e g s i z e ,

segsize = dsm_control_bytes_needed(maxitems);

其 中 函 数 d s m _ c o n t r o l _ b y t e s _ n e e d e d 定 义 :    
 

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

2 ) 调 用   d s m _ i m p l _ o p ( )   函 数 , 该 函 数 根 据 d y n a m i c _ s h a r e d _ m e m o r y _ t y p e 参 数 调 用 不 同 的 接 口 创 建 用 于 d s m _ c o n t r o l   结 构 的 动 态 共 享 内 存 , 地 址 赋 值 给   d s m _ c o n t r o l   变 量 , 该 变 量 的 类 型 为   d s m _ c o n t r o l _ h e a d e r   。
3 ) 初 始 化   m a g i c 、 n i t e m s 、 m a x i t e m s 变 量 , 其 中 m a x i t e m s   表 示 A n t D B - T 该 D N 节 点 所 有 进 程 能 够 申 请 的 动 态 共 享 内 存 的 最 大 数 量 , n i t e m s   表 示 当 前 已 使 用 的 动 态 共 享 内 存 数 量 , 每 一 次 动 态 共 享 内 存 申 请 , 对 应 一 个   d s m _ c o n t r o l _ i t e m 。
其 函 数 大 致 调 用 关 系 如 下 :

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


3 .   清 理 A n t D B - T 动 态 共 享 内 存 ( D S M )
在   p o s t m a s t e r   主 进 程 关 闭 时 , 会 调 用   d s m _ p o s t m a s t e r _ s h u t d o w n ( )   函 数 进 行   d s m   的 清 理 , 这 个 函 数 是 在 初 始 化 动 态 共 享 内 存 ( d s m _ p o s t m a s t e r _ s t a r t u p ( ) ) 时 就 指 定 了 o n _ s h m e m _ e x i t ( d s m _ p o s t m a s t e r _ s h u t d o w n ,   P o i n t e r G e t D a t u m ( s h i m ) ) ;


清 理 动 态 共 享 内 存 的 主 要 逻 辑 : 首 先 检 查 动 态 共 享 内 存 段 是 否 已 经 损 坏 , 如 果 损 坏 了 就 记 录 错 误 日 志 直 接 返 回 , 如 果 没 有 损 害 时 就 遍 历   d s m _ c o n t r o l - > n i t e m s   数 组 , 对 其 中 正 在 使 用 的   i t e m   对 应 的 动 态 共 享 内 存 ( D S M ) 进 行 销 毁   , 最 后 再 销 毁   d s m _ c o n t r o l   自 身 对 应 的   动 态 共 享 内 存 ( D S M )   内 存   。



( 三 ) A n t D B - T 动 态 共 享 内 存 实 践 分 享


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


图 6 : A n t D B - T   并 行 查 询 的 例 子

可 以 从 上 图 的 执 行 计 划 里 面 明 确 看 到 有 使 用 到 了 并 行 查 询 , 并 且 并 行 的 w o r k e r 个 数 是 2 。 先 进 行 简 单 的 并 行 查 询 的 原 理 介 绍 , 图 如 下 所 示 : D N   b a c k e n d 主 进 程 拉 起 从 进 程 , D N   b a c k e n d 主 进 程 在 处 理 时 , 发 现 需 要 进 行 并 行 处 理 , 就 会 在 启 动 从 进 程 时 , 会 调 用   L a u n c h P a r a l l e l W o r k e r s   函 数 , 这 个 函 数 会 调 用 R e g i s t e r D y n a m i c B a c k g r o u n d W o r k e r   , 此 时 会 给   P o s t m a s t e r   进 程 发 一 个 信 号 , 请 求   P o s t m a s t e r   进 程 启 动 一 个   b a c k g r o u n d   进 程 , P o s t m a s t e r   进 程 收 到 信 号 后 就 会 启 动 一 个 新 后 台 进 程 来 处 理 查 询 。
       
图 7 : A n t D B - T   并 行 查 询 的 流 程                

在   A n t D B - T   的 源 码 中 , 上 述 S Q L 例 子 在 并 行 查 询 中 使 用 动 态 共 享 内 存 ( D S M ) , 其 主 要 逻 辑 如 下 :

1 . D N   b a c k e n d 主 进 程 在 判 断 需 要 进 行 并 行 处 理 时 , 就 会 初 始 化 并 行 执 行 计 划 E x e c I n i t P a r a l l e l P l a n , 在 E x e c I n i t P a r a l l e l P l a n 函 数 中 , 会 评 估 共 享 内 存 大 小 : 通 过 使 用 s h m _ t o c _ e s t i m a t e _ c h u n k 、 s h m _ t o c _ e s t i m a t e _ k e y s 宏 定 义 向 e s t i m a t e 中 增 加 数 据 结 构 , 可 以 多 次 调 用 , 然 后 使 用 s h m _ t o c _ e s t i m a t e 得 出 需 要 创 建 的 动 态 共 享 内 存 的 总 大 小 , 最 后 调 用   d s m _ c r e a t e ( ) 函 数   创 建 动 态 共 享 内 存 ( D S M ) 。 创 建 并 行 的 工 作 进 程 时 , 将 动 态 共 享 内 存 ( D S M ) 对 应 的   h a n d l e   作 为 参 数 传 递 给   并 行 的 w o r k e r   进 程 , 其 调 用 关 系 如 下 :

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 . 并 行 的 子 进 程 ( D N   w o r k e r   进 程 ) 先 调 用   d s m _ a t t a c h ( )   函 数 挂 载 到 动 态 共 享 内 存 , 然 后 调 用 函 数 P a r a l l e l Q u e r y M a i n 处 理 查 询 业 务 该 函 数 里 面 使 用 了 动 态 共 享 内 存 , 当 并 行 的 子 进 程 执 行 结 束 时 , 会 调 用   d s m _ d e t a c h ( )   函 数 解 除 挂 载 的   d s m   共 享 内 存 , 其 大 致 的 调 用 关 系 如 下 :

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);


总 结

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

关 于 A n t D B 数 据 库

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


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70026696/viewspace-2996339/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
AntDB数据库始于2008年,是湖南亚信安慧科技科技有限公司自主研发的通用型企业级数据库产品,在运营商的核心系统上,为全国20多个省份约10亿用户提供在线服务,具备高性能、弹性扩展、可靠性等产品特性,峰值每秒可处理百万笔通信核心交易,应用范围包含通信、金融、交通、能源、物联等。

注册时间:2023-02-13

  • 博文量
    415
  • 访问量
    759281