Postgresql动态共享内存类型

一、简介

linux为多个进程通信提供了不同的IPC机制,如:System V , POSIX 和 MMAP,所以Postgresql共享内存管理也支持以上类型。

在Postgresql中可以使用dynamic_shared_memory_type参数指定共享内存类型。

默认使用posix,修改参数后需要重启数据库。

dynamic_shared_memory_type = posix  # the default is the first option

                  # supported by the operating system:
                  # posix
                  # sysv
                  # windows
                  # mmap
                  # (change requires restart)

二、共享内存如何工作

当一个进程的数据需要与另一个进程共享时,第一个进程简单地将数据写入共享内存段。 一旦写入数据,第二个进程就可以使用该数据。 一旦创建了共享内存对象,访问该对象的进程就可以使用指针直接读写该对象。这里不会对各种类型的原理进行详解。

三、

三、Postgresql动态共享内存

创建和管理共享内存段是操作系统的任务,一旦创建了共享内存段:

1、动态共享内存段需要进行引用计数,这样当最后一个映射被移除时,段就会自动消失

2、如果后台进程被不干净地终止,PG的postmaster需要在崩溃-重启过程中删除所有剩余的段,和重新初始化主共享内存段类似。

3、如果所有进程都被不干净地终止了,那么下一次postmaster启动时需要清理仍然存在的段。

四、动态共享控制段

动态共享控制段由postmaster创建其他进程之前创建,它用于存储所有动态共享内存段的标识列表,以及每个段的引用计数。它有以下作用

1、如果Postgresql经历了一个奔溃恢复周期,那么会扫描控制段并删除其它涉及的控制段,然后重建控制段。
2、如果postmaster通过kill -9干掉并重启,那么它会找到旧的控制段删除并重建。
3、如果操作系统被重新启动,旧的控制段将不再存在,除了在map-a-regular-file下,该处理方法是通过扫描相关目录而不是依赖于控制段来处理和清理。

修改dynamic_shared_memory_type参数指定类型

 

 如果遇到以下错误:

ERROR: could not open shared memory segment “/PostgreSQL.xxxxxxx”: No such file or directory

说明动态内存控制段不存在,有可能被删除了,可以通过重启数据库,或者断开所有连接再重连,均达到重新创建动态内存控制段的目的

 

 

 

 

 

posted @ 2022-04-01 15:19  数据库集中营  阅读(665)  评论(0编辑  收藏  举报