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)
共享内存如何工作?

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

Postgresql动态共享内存

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

  1. 动态共享内存段需要进行引用计数,这样当最后一个映射被移除时,段就会自动消失
  2. 如果后台进程被不干净地终止,PG的postmaster需要在崩溃-重启过程中删除所有剩余的段,和重新初始化主共享内存段类似。
  3. 如果所有进程都被不干净地终止了,那么下一次postmaster启动时需要清理仍然存在的段。
动态共享控制段

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

  1. 如果Postgresql经历了一个奔溃恢复周期,那么会扫描控制段并删除其它涉及的控制段,然后重建控制段。
  2. 如果postmaster通过kill -9干掉并重启,那么它会找到旧的控制段删除并重建。
  3. 如果操作系统被重新启动,旧的控制段将不再存在,除了在map-a-regular-file下,该处理方法是通过扫描相关目录而不是依赖于控制段来处理和清理。
修改dynamic_shared_memory_type参数指定类型
postgres=# alter system set dynamic_shared_memory_type='mmap';
ALTER SYSTEM

/opt/pgsql14/bin/pg_ctl restart  -D /pg_csvlog/pgdata14

postgres=# show dynamic_shared_memory_type;
 dynamic_shared_memory_type 
----------------------------
 mmap
(1 row)

#可见在$PGDATA的pg_dynshmem下生成动态内存控制段文件
cd pg_dynshmem/
ll
-rw------- 1 postgres postgres 26976 Mar  2 17:21 mmap.3768513470


#改回posix
postgres=# alter system set dynamic_shared_memory_type='posix';
ALTER SYSTEM

/opt/pgsql14/bin/pg_ctl restart  -D /pg_csvlog/pgdata14

#pg_dynshmem文件夹为空,取而代之的是在/dev/shm下,通过进程可以查找,如下
 ps -elf | grep pgsql14
0 S postgres 28418     1  0  80   0 - 85625 poll_s 17:29 ?        00:00:00 /opt/pgsql14/bin/postgres -D /pg_csvlog/pgdata14
lsof -p 28418 | grep shm
postgres 28418 postgres  mem    REG               0,19     26976  51260082 /dev/shm/PostgreSQL.1091123272
#查看/dev/shm
ls -lt /dev/shm
-rw------- 1 postgres postgres  26976 Mar  2 17:29 PostgreSQL.1091123272

如果遇到以下错误:
ERROR: could not open shared memory segment “/PostgreSQL.xxxxxxx”: No such file or directory
说明动态内存控制段不存在,有可能被删除了,可以通过重启数据库,或者断开所有连接再重连,均达到重新创建动态内存控制段的目的

示例如下:

#建表插入数据
postgres=# create table test(a bigint,b text);
CREATE TABLE
postgres=# insert  into test  select generate_series(1,100000000),generate_series(1,100000000)||'dazuiba';
INSERT 0 100000000
postgres=# \dt+  test 
                           List of relations
 Schema | Name | Type  |  Owner   | Persistence |  Size   | Description 
--------+------+-------+----------+-------------+---------+-------------
 public | test | table | postgres | permanent   | 4977 MB | 
(1 row)
#删除相应的文件
rm -f /dev/shm/PostgreSQL.2451786798
rm -f /dev/shm/PostgreSQL.834175760
#正在查询的session报错
postgres=# select count(*) from test ;
WARNING:  could not remove shared memory segment "/PostgreSQL.2451786798": No such file or directory
   count   
-----------
 100000000
(1 row)
#同一session再次查询报错,
postgres=# select count(*) from test ;
ERROR:  could not open shared memory segment "/PostgreSQL.834175760": No such file or directory
CONTEXT:  parallel worker

#不重启数据库的情况下,重新连接数据库查询,会新建相应的文件,测试环境,这里只有这一个session,如果生产环境,需要断开所有session重连。
psql -p 1916
psql (13.6, server 14.2)
postgres=# select count(*) from test ;
   count   
-----------
 100000000
(1 row)

ll /dev/shm/
-rw------- 1 postgres postgres 193K Mar  2 18:02 PostgreSQL.3823326140
-rw------- 1 postgres postgres 175K Mar  2 18:02 PostgreSQL.412422498

参考:
https://postgreshelp.com/postgresql-dynamic-shared-memory-posix-vs-mmap/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值