上海品茶

您的当前位置:上海品茶 > 报告分类 > PDF报告下载

PostgreSQL中DETOAST缓存的实现.pdf

编号:129045 PDF 23页 4.52MB 下载积分:VIP专享
下载报告请您先登录!

PostgreSQL中DETOAST缓存的实现.pdf

1、PostgreSQL中DETOAST操作缓存的实现分享人:廖书楠场景引入需求分析详细设计性能测试1234目录directory01场景引入场景引入1.1PostgreSQL中的DETOAST操作完整的大尺寸字段值(2KB).压缩和拆分分片1TOAST操作解压缩和重拼接DETOAST操作当一次查询中多次涉及一个大尺寸字段的读取时,需要反复执行DETOAST操作,极其费时分片2分片3分片4分片51.2实际场景在某次紧急排查中,为了找出满足特定条件的告警数据,需要执行以下SQL:SELECT value FROM ZENAP_FM _ACTIVEALARM WHERE(value-alarmpath

2、-pathids ae381dea-1d16-4b2c-83f8-2db8fc68edb6“OR value-alarmpath-pathids 103ce679-ba2a-4db1-9d17-fdcd1614ef55“-.中间省略693条OR子句OR value-alarmpath-pathids d4b9bd96-9036-4344-a1b3-8571b0205d1b“)ORDER BY value-servertime DESC,value-id DESC LIMIT 1000 OFFSET 0;在某现实生产环境下的告警日志表:对于表中的每条value记录,都需要重复执行696次DETO

3、AST操作,极其费时1.3解决方案实现面向DETOAST操作的缓存:在每次执行完DETOAST操作后将结果缓存起来,后续重复访问直接从缓存中读取,无需执行耗时的DETOAST操作,降低CPU开销。在缓存中?读取是直接返回执行DETOAST否02需求分析需求分析2.1DETOAST缓存池需求分析置换策略尺寸分布TOAST字段是变长字段,其尺寸差异较大,不能采用固定大小的缓存块1多进程并发变长字段TOAST字段的尺寸分布是无法预先确定的,如果将缓存块的尺寸和数量设置为固定值,可能会导致利用率低,带来较大的空间浪费需要面对多种不同的查询场景,不宜采取单一置换策略多进程并发读取时,需考虑缓存的跨进程同

4、步问题2341.采用多级缓存链表+极大缓存区的设计3.动态置换策略机制,支持多种不同的置换策略1.变长字段2.尺寸分布3.置换策略4.多进程并发2.2设计方案03详细设计详细设计3.1总体架构设计DETOAST缓存池header0header9datadatadataheader0header9datadatadatausedLists:多级已用链表freeLists:多级空闲链表extCache:极大缓存区dataHash表映射3.2多级缓存链表header0header9datadatadataheader1datadatadata多级缓存链表:多级缓存链表是缓存池的核心数据结构。参考了P

5、ostgreSQL中AllocSetContext的实现,多级链表由多个双向链表组成,每个双向链表中存放不同尺寸的缓存块,大小分别为2KB、4KB、8KB、.、512KB、1MB(第i级链表中每个缓存块的大小为2KB);同时,每个双向链表的链表头之间也通过指针进行连接,从而形成多级链表。3.2多级缓存链表在DETOAST缓存池中有两个多级缓存链表,分别是usedLists和freeLists,其中:usedLists称为已用链表,用于存放已使用的缓存块;freeLists称为空闲链表,用来存放空闲缓存块;在运行过程中,当缓存池接收到插入TOAST字段值的请求时,首先从freeLists中取出一

6、块尺寸合适的空闲缓存块,接着将TOAST字段值写入到块中,然后将该缓存块插入到usedLists中。多级空闲链表多级已用链表取出空闲缓存块插入写入字段值3.3极大缓存区极大缓存区:为了应对极少数尺寸极大、多级缓存链表的最大缓存块也无法容纳的TOAST字段值而设计。dataTOAST字段值试图插入到多级缓存链表中插入到极大缓存区中失败,尺寸超过缓存块大小上限3.4置换策略模块设计参考Redis中的置换策略模块设计,支持多种不同的置换策略,允许在运行时动态指定;将置换策略设置为缓存池内部的一个结构体,包括一系列的辅助数据结构和行为函数指针组;置换策略结构体ReplacePolicy.辅助结构体行为

7、函数指针组.缓存池初始化过程中,根据GUC参数的值,初始化为不同的置换策略LRU?LFU?FIFO?LRU双向链表、哈希表LRU函数指针组FIFO队列、FIFO函数指针组LFU双向链表、哈希表、LFU函数指针组3.4置换策略模块设计在缓存池执行操作的过程中,会通过置换策略结构体中的函数指针,去回调相应的置换策略行为函数:缓存池插入新块时置换策略插入时行为函数调用删除旧块时置换策略删除时行为函数调用查询某块时置换策略查询时行为函数调用需要淘汰一块时置换函数调用3.5自适应缓存调整机制header0datadataheader1datadatadatadatadatadatadatadatadat

8、aheader2data.datadata回收由于很少使用,空闲块数量富余由于频繁使用,空闲块数量紧缺+datadata新增-Freesize空闲空间FreeLists空闲链表3.6跨进程缓存同步机制实现无效消息队列postgres进程1DETOAST缓存池数据1postgres进程2DETOAST缓存池数据1数据2数据3.数据1数据1postgres进程2DETOAST缓存池数据1数据2数据3.执行删除操作删除数据1删除缓存发送DETOAST无效消息,通知其他进程数据1已失效读取无效消息删除数据1删除数据1一致3.7GUC参数为DETOAST缓存池增加了3个GUC参数:容量:指定DETOAS

9、T缓存池的总容量,取值范围为50-4096(单位:MB);置换策略名:指定DETOAST缓存池使用的置换策略,如LRU、LFU、FIFO等;空闲因子:指定DETOAST缓存池的空闲因子,即触发自适应缓存调整机制的阈值,取值范围为0-0.4;以上3个GUC参数均可在postgresql.conf中动态指定运行值,DETOAST缓存池将根据所指定的参数进行初始化。04性能测试性能测试4.1性能测试使用前面所述的真实生产场景的数据,在48核96线程的华为Taishan2280服务器进行测试,在其他条件相同的情况下,对添加和未添加DETOAST缓存模块的PostgreSQL14.5发行版源码进行多次重复对比实验,得出实验结果如下所示:执行次数执行次数平均开销平均开销最小开销最小开销最大开销最大开销未添加缓存模块58418266添加缓存模块后2294122063平均时长平均时长最小时长最小时长最大时长最大时长未添加缓存模块20.83秒20.67秒20.99秒添加缓存模块后8.74秒8.71秒8.7秒DETOAST操作执行次数及消耗时钟周期原SQL语句执行总耗时DETOAST操作cpu开销降低99.01%查询总时间开销降低58%查询性能提高238%本项目已在gitee上开源:https:/

友情提示

1、下载报告失败解决办法
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站报告下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。

本文(PostgreSQL中DETOAST缓存的实现.pdf)为本站 (2200) 主动上传,三个皮匠报告文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三个皮匠报告文库(点击联系客服),我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。
会员购买
客服

专属顾问

商务合作

机构入驻、侵权投诉、商务合作

服务号

三个皮匠报告官方公众号

回到顶部