利用非易失性内存打造高性能PG数据库系统

数据库表存在内存中 数据库有一种机制: 一些程序启动就需要查询的表,和一些被频繁访问的表。比如: m_ope_d m_product_d m_eqid_d . . . 等 可以考虑将这些数据量不大但经常使用的的表缓存到内存当中。 做法有两种: 1、把这些基础数据存在Redis里面。每次用的时候从redis查,效率很高。但是有一个缺点,update的数据不能及时同步到redis中。 2、把这些ho... 阅读详情

前阵子有朋友和我讨论把PG数据库改造成内存数据库的可行性。在讨论中发现,实际上内存数据库并不是简单的把一个传统的RDBMS放入内存中,并通过WAL日志和CHECKPOINT来持久化数据那么简单。实际上最初的内存数据库的目的是提供超低延时的应用支持,因此与传统的RDBMS相比,内存数据库需要在各个环节都尽可能简化,从而达到其最初的设计目标。在这种情况下,尽可能地减少各个环节的延时,甚至节约几条指令都是十分必要的。我们可以考虑一下,现在最为流行的内存数据库-Redis(一种KV的内存数据库),一般一条指令的执行时间是几十个微妙,而如果访问REDIS服务器的延时是1毫秒左右,那么其访问的总体性能不在于命令的执行,而是网络,因此高并发高性能的Redis应用的优化往往重点在网络上。

从PG数据库来看,这是一种典型的通用交易型RDBMS,从其特征上看,直接改造成纯粹的内存数据库,从数据库架构上来看,是十分困难的。不过随着非易失性内存内存技术的发展,另外一条将传统数据库改造成内存数据库的路子又显现出来了。在几年前和INTEL技术团队的交流中,非易失性内存内存、傲腾、AEP技术给我们带来了新的启示。如果利用AEP技术搭建一台能够提供数个TB或者数十个TB非易失性内存内存的服务器,就基本上能够满足大多数传统数据库应用的需求了。这样的话,把整个数据库放入非易失性内存内存,就可以让PG数据库成为访问性能与物理内存同一数量级的IO延时的准内存数据库了。

实际上把PG数据库改造成一个准内存数据库并不是那么简单,还涉及到如何将内存映射为一个文件的问题。如果采用LINUX上的传统技术,ramfs等技术,将高速的内存访问接口转换为相对缓慢的文件系统接口,那么内存的性能要牺牲很多,恐怕就无法把非易失性内存的性能完全发挥出来了。在2018年的PGCON上,来自日本NTT的Takashi Menjo发表了一个演讲,介绍了一种基于PMDK(详情参见Persistent Memory Development Kit (PMDK))对PG数据库进行改造的技术方案。

他们提出了一种使用PMDK将PG改造成支持非易失性内存的数据库系统。这种改造接近于把PG数据库改造成为一种准内存数据库系统。从而大大提升PG数据库的性能。他们已经将代码提交在PG的Maillist上(https://www.postgresql.org/message-id/CAOwnP3O3O1GbHpddUAzT=CP3aMpX99=1WtBAfsRZYe2Ui53MFQ@mail.gmail.com),有兴趣的朋友可以在这里下载相关的path,有非易失性内存的朋友甚至可以自己去搭个环境测试一下。

可能有朋友会觉得如果有傲腾内存(OPTANE),那么我们直接把整个PG数据库创建在傲腾内存上不就行了,何必去HACK PG源代码呢?当然最为简单的方法是在傲腾内存上直接创建一个内存文件系统,然后把PG数据库全部装在这个文件系统上,利用傲腾内存远低于SSD盘的延时来提升PG数据库的性能,这种做法是最为简单的。不过由于文件IO和内存访问接口之间的性能差异是十分巨大的,因此这种做法无法充分发挥出傲腾内存的性能来。

根据商用解决方案提供商的宣传资料,他们的商用解决方案里,OLTP TPS比传统的PG数据库快15倍。当然这里肯定存在一些场景的问题,不过从理论上说,基于PG+PMEM的方案肯定可以有效的提高数据库的性能。Memhive是商用方案,我们暂时还无法了解更为详细的信息。不过通过Takashi Menjo的演讲材料我们还是可以了解一下具体的实现方式。

使用PMEM优化PG数据库的两条技术路线可以参考上图,使用支持PMEM的文件系统存储PG数据库是最为简单的方案,利用PMDK提供的DAX技术,可以创建一个支持DAX高速访问的全新的内存文件系统,不需要修改PG数据库的代码,取消OS的文件缓冲就可以了。因为PMEM的访问延时已经和物理内存一个数量级了,因此增加PAGECACHE只会增加总体延时,并不会给数据库性能带来很大的好处。

而第二种方法是使用PMDK来改造PG代码,从而用内存操作替代文件IO操作,提升PG的性能。

上面是使用PMDK来改造PG的文件IO函数的方法,我们需要在PG原生的代码中逐条用这些代码去替换相关的操作。当然我们不需要替代所有的PG数据库的文件IO操作,主要针对WAL/CKPT、bgwriter,以及backend读取数据文件的访问进行替换就可以了。

从替换效果上,Takashi Menjo的演讲中也提到了,仅仅改造WAL文件的情况下,其测试结果如下:

使用傲腾存储的情况下,测试用例的TPS为3.26万,使用DAX文件系统提升到3.69万,而使用libpmem修改了PG代码后提升到3.81万。似乎这点提升并不高,不过这和测试用例有关,当所有的负载都是写入数据的时候,libpmem改造后的PG性能是DAX的1.8倍。

随后Takashi Menjo的团队又继续使用libpmem改造PG代码,修改针对relation segments的写入代码进行改造。改造后的结果如下:

在相同的测试场景下,checkpoint的完成延时有了明显的提升,使用傲腾盘的情况下是7.75秒,而DAX文件系统提升了一倍多,降低到3.75秒。而使用libpmem改造PG代码后,再次提升30%,缩短到了2.65秒。CHECKPOINT时间的减少,对于高并发写入数据库性能的提升是显而易见的。

虽然NTT团队的演讲中仅仅发布了他们工作成果的一部分,不过从Takashi Menjo的工作成果来看,使用PMDK+INTEL AEP+PG打造一个高性能PG数据库一体机的整体技术路线是完全可行的。自己动手打造一款自己的MEMHIVE数据库系统的基础条件已经完全具备了。有兴趣去尝试一下的朋友,可以去参考一下我在本文中发的一些资料,动手去试一试吧。

SpringBoot+Vue+MySQL 高校学科竞赛平台 完整可运行版(源码+文档) 本项目基于SpringBoot+Vue+MySQL构建高校学科竞赛管理平台,覆盖学生、教师、领队教师、管理员四大角色,实现竞赛发布、报名、刷题、评分、公示等全流程闭环管理。系统架构清晰,技术主流,配套完整源码、数据库脚本、万字论文、开题报告、答辩PPT及部署文档,支持一键运行,适用于毕业设计、课程设计及院系二次开发,真正实现“开箱即用”。 阅读详情

相关推荐

Postgresql 内存融合技术初探

常规流复制数据库集群优缺点 • HighGo 的改进和探索之共享存储 •共享存储集群架构 •为什么要内存融合 • HighGo内存融合架构 • 内存融合 • 并行redo

内存数据库的数据相关整理(postgresql)

前提:数据库采用的是postgresql,当前解决方案是直接修改数据库相关数据,现在想通过内存数据库来修改数据库相关数据以提高io速度。 当前流程图大概如下: 第一步:首先将数据库中的数据写入内存, 第二步:c端需要查询的时候,如果有数据则直接从内存中查询,如果没有数据则直接从数据库中查,顺便把查到的数据再次写入缓存, 第三步:c端需要增删改的时候直接对数据库进行操作,同时删除相关缓存...

阿诚终身学习记录仪 1053

pg-mem:用于单元测试的内存中postgres数据库实例

pg-mem是postgres数据库的实验性内存模拟。 :red_heart: 它既可以在节点中运行,也可以在浏览器中运行。 :star: 如果您喜欢这个软件包,这个回购,它有助于激励我:) :backhand_index_pointing_right: 在观看 :triangular_ruler: 用法 使用NodeJS 与往常一样,它的统计信息包括: npm i pg-mem --save 然后,假设要使用浏览器,则假设您正在使用Webpack之类的工具: import { newDb } from 'pg-mem' ; const db = newDb ( ) ; db . public . many ( /* put some sql here */ ) 使用Deno 很简单:)

C#打造一个开源webgis(二)空间数据库

空间数据库,是为了存储和分析空间数据的,也有一些GIS系统采用空间文件来实现,如mapinfo、shape文件格式,但是空间数据库有着其特有的优势,其实基本也就数据库系统与文件系统的特点比较: 1、数据库设计时面向数据模型对象,数据库设计的基础是数据模型。 2、数据库系统的数据冗余度小、数据共享度高。 3、数据库系统的数据和程序之间具有较高的独立性。 4、数据库系统通过DBMS进行数据安全

IT晴天 4275

PWM(脉宽调制)技术详解:从基础到应用实践示例

PWM(脉宽调制)技术是嵌入式系统中一项重要的控制技术,通过调节脉冲宽度来实现对模拟设备的精准控制。从LED亮度到电机速度,PWM的应用场景非常广泛。对于嵌入式学习者来说,理解PWM的工作原理、掌握其配置方法,不仅能提升编程能力,还能为更多复杂系统的开发打下坚实的基础。

SpringWJN的博客 6329

Visual Studio 6.0 镜像下载全指南:从企业版到中文版

本文提供Visual Studio 6.0企业版和中文版的镜像下载全指南,包括详细版本解析、已验证的下载链接及校验信息。针对现代系统的安装技巧和兼容性处理方案,帮助开发者高效获取并运行这一经典开发工具,特别适合维护遗留系统的专业人员。

weixin_33712987的博客 1037

推荐开源项目:pg-mem - 在内存中模拟PostgreSQL数据库

推荐开源项目:pg-mem - 在内存中模拟PostgreSQL数据库 pg-memAn in memory postgres DB instance for your unit tests项目地址:https://gitcode.com/gh_mirrors/pg/pg-mem 在开发和测试过程中,经常需要快速搭建数据库实例以满足数据操作的需求。传统的PostgreSQL数据库部署过程可能较为...

gitblog_00092的博客 700

Hypermesh到Abaqus CEL网格转换全攻略:解决欧拉体导入难题

本文详细解析了Hypermesh到Abaqus CEL网格转换的全流程,重点解决欧拉体导入难题。通过单元类型转换、INP文件编辑和多组件合并技术,实现流固耦合仿真的高效前处理。文章包含实用脚本和工程案例,帮助工程师突破ABAQUS CEL分析中的网格转换瓶颈。

weixin_30832143的博客 191

内存数据库与磁盘数据库

参考网址:https://blog.youkuaiyun.com/dh2442897094/article/details/64440130 1、磁盘数据库需要频繁地访问磁盘来进行数据的操作,由于对磁盘读写数据的操作一方面要进行磁头的机械移动,另一方面受到系统调用(通常通过CPU中断完成,受到CPU时钟周期的制约)时间的影响,当数据量很大,操作频繁且复杂时,就会暴露出很多问题。 内存数据库数据处理速度比传统...

chenkaifang的博客 8712

kali破解WIFI密码

今天我们来学习一下通过kali和一个好的字典来破解WIFI密码。 声明:此教程仅供学习研究使用,严禁使用此技术进行非法行为 首先我们需要一个具有监听功能的无线网卡(这里我给大家推荐:rt3070) 本章实验通过虚拟机VMware进行: 先通过services.msc来打开VMware USB Arbitration Service 插上监听网卡,连接USB到虚...

#的博客 5810

HexView 脚本自动化工具:从刷写文件处理到批量转换实战

本文详细介绍了如何利用HexView脚本自动化工具高效处理嵌入式刷写文件。通过实战演示,文章展示了如何使用bat脚本实现S19、HEX等格式文件的剪切、填充、合并与批量转换,构建自动化流水线,从而显著提升汽车电子等领域的开发与生产效率。

weixin_29237635的博客 356

PG创建空间数据库

两种方式可以实现,大家根据个人情况选用。 一、手头已有一个空间数据库 使用Navicat等可视化软件,新建数据库时选择已有的空间数据库作为范本,可直接创建。 二、手头一个空间数据库都没有 (1)先新建普通数据库test1,也可以使用Navicat等数据库可视化软件。 (2)打开postgis安装路径下的SQL Shell,弹出命令行对话框。 (3)输入数据库名test1和用户名密码等登录数...

sky_817的博客 1877

YOLOv11来了,使用YOLOv11训练自己的数据集和推理(附YOLOv11网络结构图)

YOLOv11 由 Ultralytics 在 2024 年 9 月 30 日发布, 最新的 YOLOv11 模型在之前的 YOLO 版本引入了新功能和改进,以进一步提高性能和灵活性。YOLO11 在快速、准确且易于使用,使其成为各种对象检测和跟踪、实例分割、图像分类和姿态估计任务的绝佳选择。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 28万+

postgresql(pg)数据库简介

1.什么是PostgreSql PostgreSQL是一个功能强大的开源对象关系型数据库系统,他使用和扩展了SQL语言,并结合了许多安全存储和扩展最复杂数据工作负载的功能。PostgreSQL的起源可以追溯到1986年,作为加州大学伯克利分校POSTGRES项目的一部分,并且在核心平台上进行了30多年的积极开发。 PostgresSQL凭借其经过验证的架构,可靠性,数据完整性,强大的功能集,可...

whatday的专栏 14万+

大模型安全-生成检测-事实核查-攻击-防御-思考-记忆-融合-语音相关研究 2025年版

本文整理了关于大模型安全领域的综合性资源,包括7篇综述论文、9个安全数据集以及5篇强化学习相关的安全研究论文。主要涉及大模型的对抗攻击、隐私保护、安全评估等方向,涵盖TruthfulQA、ToxiGen等知名数据集和TrustLLM、HarmBench等关键研究。资源包括知乎博主分享、arXiv预印本和顶会论文,并附有详细的中文讲解链接,为研究者提供了系统性的安全研究参考。

CSPhD-winston的博客 3588

基于YOLOv8的端面小目标计数解决方案: 多头检测器+小缺陷到大缺陷一网打尽的GiraffeDet+Wasserstein Distance Loss | 助力工业小目标缺陷检测

端面小目标计数部署解决方案 | 亲测在工业小目标缺陷涨点明显,原始mAP@0.5 0.936提升至0.955

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1955

postgresql内存参数

postgresql的内存分配主要由shared_buffers、temp_buffers、work_mem、maintenance_work_mem参数控制。 shared_buffers又做共享缓冲区,postgresql对数据操作时都要先将数据从磁盘读取到内存中,然后进行更新,最后再将数据写回磁盘。shared_buffers的功能就是用于存放从磁盘读取的数据。设置范围一般在25%~40%...

HighGO 4339

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 199

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 131

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Docker Compose:搭建本地多服务开发环境

从一个 Java API、PostgreSQL 和 Redis 开始,配置服务名、端口、环境变量、健康检查、数据卷和依赖关系。理解 Compose 文件如何被解析、项目如何隔离,以及哪些数据不能依赖“重建容器”保留,能够把个人开发环境整理成团队可复用的启动入口。

m0_62221377的博客 461

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 413

数据库主键选型指南:BIGINT vs VARCHAR

主键选型关乎数据库性能与架构演进。BIGINT(如雪花算法)在顺序写入、二级索引开销和分布式生成上优势显著,适合高并发核心链路;而传统 VARCHAR UUIDv4 因随机性导致频繁页分裂、存储膨胀,性能堪忧。UUIDv7 通过时间戳有序性实现高效追加写入,结合 BINARY(16) 存储可兼顾性能与安全,成为现代微服务新选择。关键在于:主键应稳定、无业务含义,优先选用趋势递增的紧凑类型,并根据场景合理采用双主键模式或 ULID 等替代方案。

小李同学的博客 301

自动化运维选型:四条技术路线的能力边界,以及它们为什么不能互相替代

自动化运维怎么选型?拆解配置管理、基础设施即代码、作业调度与场景化编排四条技术路线边界,分析账本归属与时间语义差异,给出四种架构组合与判断点,帮企业看清为何不能互相替代。

trainsignalcn的专栏 327

C++算法(七)

C++ stack算法题和一些客观题

2503_94479566的博客 370

不用再为文本搜索单独维护一套系统!全文检索深度解析

为了给商品、客服工单或者企业知识库增加一个搜索框,企业往往需要在业务数据库之外,再部署一套Elasticsearch。数据库保存商品、订单和用户等真实业务数据,搜索引擎保存另一份文本索引;两套系统之间,还需要通过CDC、消息队列或者同步程序持续传输数据。一个看似简单的搜索需求,最后可能变成两套集群、两份数据和一条必须保持稳定的数据链路。由此产生的问题并不少:数据库已经完成更新,搜索结果却可能尚未同步;业务查询同时涉及文本、库存、权限和订单状态时,应用需要在两个系统之间来回组合结果;

TiDB 社区干货传送门 254

IDEA 简介:从零认识 IntelliJ IDEA

IDEA 全称,是由 JetBrains 公司开发的一款主流 Java 集成开发环境(IDE)。它集代码编辑、编译、调试、测试、版本控制、构建管理等功能于一体,被大量 Java 开发者视为日常开发的首选工具。所谓 IDE(Integrated Development Environment,集成开发环境),就是把写代码所需的各类工具整合到同一个界面中。相比只用文本编辑器加命令行编译,IDE 能显著减少重复操作,让开发者把精力集中在业务逻辑上。

ztI10的博客 154
上一篇: PG数据库如何发现和采集TOP SQL
下一篇: PG shared buffers的优化
DBAIOps社区
博客等级 码龄3年 970粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值