POSTGRESQL V12 内存管理参数 shared_memory_type的意义 (附:高科技数据库企业招聘信息一枚)

2021-06-30 00:00:00 数据 内存 内核 方式 映射


招聘信息如下:

招聘岗位:售前技术架构师
招聘公司:北京四维纵横数据技术有限公司
公司官网: https://www.ymatrix.cn/
工作地点:优先北京和上海,其他省份城市也招,的可以远程办公
工作职责:
- 根据行业特色和客户需求,交流数据库技术和方案,实现产品价值的认知交付
- 基于对产品的理解,和对竞品的分析,针对客户实际需求进行POC
- 数据库产品实施交付,解决客户使用过程中的遇到的问题,提升用户体验
- 识别客户的痛点,挖掘客户底层的需求,形成产品特性需求
工作要求:
- 学习能力强,学习意愿强
- 沟通能力强,愿意出差
- 有数据库或者大数据相关售前和POC经验
- 熟悉PostgreSQL或者Greenplum者优先

公司简介:
公司简介:北京四维纵横数据技术有限公司开创了超融合时序数据库新品类,旗舰产品MatrixDB一库实现关系库+时序库+分析库三库的能力,支持传统的关系型数据和物联网海量时序数据的快速采集、高效储存、实时分析以及深度学习(ML+AL),让您和您的客户省心省力省时省钱。详情参考公司官网https://ymatrix.cn

联系邮箱:
shidunbin@ymatrix.cn


(顺便说一句,企业的老总是的Pivotal公司Greenplum研发总监姚总,跟着大咖有肉吃哦)


——————————————————————————————


从POSTGRESQL V12 后添加了一个关于内存的参数  shared_memory_type

这个参数在之前的版本是没有的并且这个参数的值为 mmap


MMAP 对于我们的POSTGRESQL的shared buffer 的内存使用有什么帮助,首先我们就需要了解MMAP到底是什么。

MMAP 是一种内存的映射文件的方法,我们都知道,我们的数据文件是要映射到内存中进行数据处理的,而数据在处理完毕就是脏页是需要在会写到磁盘上对应的文件块中的。


那么使用这样的方式的好处是什么,mmap对于文件和内存之间的关系是通过文件磁盘地址和进程虚拟地址空间中的一段虚拟地址的映射关系,完成内存和文件之间的数据处理。显然这样的好处在于,通过这样的映射关系,进程对内存的操作通过指针来完成,不会再需要通过系统的 read, write函数在将内存的数据写入到磁盘环境中。而更多的好处在于内核空间对这样的区域的修改也可以反馈在用户的空间中,从而实现不同进程间的文件共享。


实际上我们是可以通过LINUX系统中关于PID的MAPS 来看到你当前的进程的mmap 的状态。


为什么使用mmap,主要mmap的操作方式减少了内存拷贝,如果通过read.write函数来调用数据,则文件的内容要经历内核缓冲区的一个“多余”的操作。


我们先看看如果不使用mmap 的方式,而使用普通的消息队列通信的方式对数据的访问的方式。

假设我们通过 posix 消息队列的方式来进行进程之间的通信的效果,主要的操作过程为



1  数据从磁盘上讲数据拷贝到操作系统的内核的缓冲器

2  内核缓冲区的数据拷贝到用户进程的缓冲区

3  用户处理完毕后,在将数据回写回内核的缓冲区中

4  内核缓冲区在将数据回写回磁盘文件


其中 1 2 3 4 都是需要进行CPU计算的,缺点也显而易见,多次的数据拷贝,相关数据,并且一个数据本身耗费的内存空间也是冗余的。


如果采用 mmap 的方式来使用内存则我们就会优化上的缺点。



上图中磁盘到内核的数据还是和之前一样,但是用户和内核之间的数据不再通过拷贝的方式,而是通过映射的方式来实现,通过映射来将数据在系统的缓冲中与用户的缓冲中共享。所以从原来的 4次操作,变成两次操作。同时浪费的内存也都被节省下来。

而在postgresql 11 的版本中官方文档中对于 shared buffer 只提到两个方式 system v, posix。所以postgresql 12在shared buffer 中添加的设置是对内存的有效利用和节省内存的一种优化。那么该从哪个POSTGRESQL 版本用起,心里有点数了哈



相关文章