PostgreSQL 动态共享内存类型
1.posix
2.sysv
3.windows
4.mmap
进程间通信
系统内的进程可以是独立的,也可以是协作的。如果进程是独立的,则不受其他进程执行的影响,如果是协作进程,则可以受其他进程的影响。
进程间通信是一种允许进程相互通信并同步其动作的机制。
Linux Kernel 提供了不同类型的IPC机制,其中PostgreSQL使用
1.posix
2.sysv
3.windows
4.mmap
PostgreSQL 的共享缓冲区使用上述机制之一来缓存Page数据。
如何工作?
一个进程的数据需要与另一个进程共享时,第一个进程只需将数据写入共享内存段。创建了共享内存对象,有权访问该对象的进程就可以使用指针直接读取和写入该对象。
为何使用动态共享内存?
PostgreSQL 支持四种动态共享内存类型,我们只讨论Linux系统下的POSIX和MMAP。
创建和管理动态共享内存是操作系统的任务。一旦创建,动态共享内存段需要进行引用计数,以便在删除最后一个映射时,该段自动消失如果后端被不干净地终止,postmaster 需要在崩溃和重启过程中删除所有剩余的段,就像它需要重新初始化主共享内存段一样。如果所有进程都被不干净地终止,下一次 postmaster 启动需要清理任何仍然存在的共享内存段。
dynamic_shared_memory_type 参数设置实战
mmap设置
dynamic_shared_memory_type = mmap # the default is the first option
# supported by the operating system:
# posix
# sysv
# windows
# mmap
# (change requires restart)
修改完后重启
postgres@pg01-> pg_ctl restart
postgres@pg01-> psql
postgres=# show dynamic_shared_memory_type;
dynamic_shared_memory_type
----------------------------
mmap
(1 row)
重启实例之后 这是动态共享内存文件mmap.1178044756
postgres@pg01-> cd pg_dynshmem
postgres@pg01-> ll
total 192K
-rw------- 1 postgres postgres 122K Sep 16 23:10 mmap.1178044756
postgres@pg01-> pwd
/opt/pg_root/pg_dynshmem
该文件在实例被重启后,会被重新创建。
postgres@pg01-> pg_ctl restart
waiting for server to shut down.... done
server stopped
waiting for server to start....2021-09-16 23:15:28.184 EDT [41367] LOG: starting PostgreSQL 12.8 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit
2021-09-16 23:15:28.184 EDT [41367] LOG: listening on IPv4 address "0.0.0.0", port 5432
2021-09-16 23:15:28.186 EDT [41367] LOG: listening on Unix socket "./.s.PGSQL.5432"
2021-09-16 23:15:28.406 EDT [41367] LOG: redirecting log output to logging collector process
2021-09-16 23:15:28.406 EDT [41367] HINT: Future log output will appear in directory "pg_log".
done
server started
postgres@pg01-> ll
total 192K
-rw------- 1 postgres postgres 122K Sep 16 23:15 mmap.945047994
dynamic_shared_memory_type设置为POSIX时,动态共享内存控制文件存储在哪里?
存储在 dev/shm下
dynamic_shared_memory_type = posix # the default is the first option
# supported by the operating system:
# posix
# sysv
# windows
# mmap
# (change requires restart)
postgres@pg01-> cd dev/shm
postgres@pg01-> ll
total 124K
-rw------- 1 postgres postgres 122K Sep 16 23:23 PostgreSQL.2012049887
postgres@pg01-> pwd
/dev/shm
pgbench测试POSIX与MMAP性能
POSIX
postgres@pg01-> pgbench -i test
dropping old tables...
NOTICE: table "pgbench_accounts" does not exist, skipping
NOTICE: table "pgbench_branches" does not exist, skipping
NOTICE: table "pgbench_history" does not exist, skipping
NOTICE: table "pgbench_tellers" does not exist, skipping
creating tables...
generating data...
100000 of 100000 tuples (100%) done (elapsed 0.57 s, remaining 0.00 s)
vacuuming...
creating primary keys...
done.
postgres@pg01-> pgbench -c 10 -t 100 test
starting vacuum...end.
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 1
query mode: simple
number of clients: 10
number of threads: 1
number of transactions per client: 100
number of transactions actually processed: 1000/1000
latency average = 11.661 ms
tps = 857.573774 (including connections establishing)
tps = 865.997775 (excluding connections establishing)
MMAP
postgres@pg01-> pgbench -c 10 -t 100 test
starting vacuum...end.
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 1
query mode: simple
number of clients: 10
number of threads: 1
number of transactions per client: 100
number of transactions actually processed: 1000/1000
latency average = 11.683 ms
tps = 855.930144 (including connections establishing)
tps = 862.079833 (excluding connections establishing)
总结
由于手头没有合适的测试服务器,所以只用了一个虚拟机做了一个简单的测试。测试结果虽然近似,但是实际上posix要比mmap性能略好一些。
文章转载自CP的PostgreSQL厨房,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。