PostgreSQL 中的shared buffer

更多精彩内容,请登录:ke.sandata.com.cn

前言

通常,在任何数据库系统中,都需要面临海量用户对数数据库进行读写操作。而对数据库中的数据最直接的读写操作是读取数据库中对应的数据目录中的文件。这些文件里面包含了数据库的任何对象,如表、视图、索引、序列、函数等。PostgreSQL 也不例外,在对数据库初始化时,我们能够看到由PostgreSQL 服务端工具 initdb 创建的相关表和目录,但在一个不具有弹性伸缩的数据库系统中,海量用户对数据库的读写操作并不是很理想。因为对数据库的数据对象进行读写操作需要数据库系统查找相关文件,打开文件,然后通过相关的函数对这些对象进行锁定,编辑和释放锁。因此在数据库系统中为了能够提高并发处理并加快数据处理过程,shared buffer的概念也应用而生。有了shared buffer ,后台进程从用户接收到请求后将不会再直接去读取数据库对象文件和写入数据库对象文件,而是通过在 RAM 中的buffer 中处理数据,从而极大地提高了数据库性能。

一、shared buffer

shared buffer 内存大小通过参数 shared_buffers 参数来进行设置。改参数之在PostgreSQL 中默认值为 128MB,初始化大小可以通过 initdb 来进行设置,但是不少于128KB。如果在对该参数不进行设置,那么该值的大小以块字节为单位,即设置为整数的字节大小。同时该参数变动后,需要重新启动数据库服务器。在数据库服务器上,如果RAM大小超过1GB,该值的大小通常为系统RAM的25%。在进行读写频繁的数据库环境中,该参数可以调整到大于25%的值,但不建议将该值设置太高,如果设置太高,需要同时增加max_wal_size 参数的大小,否则会造成系统性能下降。

该原理并不是通过内存 chunk 克隆的方式来提高系统响应时间,而是 OS 中的 RAM 将大量数据驻留在其中,以保证数据随时可用来提高系统响应时间。当然,除了缓存之外,还有磁盘缓存也可以提高数据处理性能,但原理都是通过减少不必要的物理 I/O 来提高性能。

在一个常规的简单查询中,系统第一步将会检查在 buffer cache 中是否有数据可用,如果数据库 buffer cache 中无可用缓存数据,用户请求将会从 OS 缓存中获取需要的文件或者块。操作系统缓存很可能已经拥有需要查找的数据块或者文件并将其驻留在数据库缓冲中,在这种情况下,数据库系统将会避免出现物理I/O请求,这在数据库中也叫做逻辑读,会消耗一定的 CPU 资源。如果需要查找的数据都不在这两个缓存中或者其它缓存中,那么用户读取数据都需要从磁盘去读取,而第一次数据读取必然要通过读取物理文件来查找。

在这里插入图片描述

二、buffer cache 检查

PostgreSQL 提供了一个扩展可以用来查看 buffer cache。以下将介绍buffer cache 扩展模块。

2.1 创建数据库

postgres=# CREATE DATABASE mydb1;
CREATE DATABASE
postgres=# CREATE DATABASE mydb2;
CREATE DATABASE

2.2 buffer cache 扩展模版

pg_buffercache 模块位于 $PGDATA/…/share/postgresql/extension 目录。
提供了一个buffer cache 函数和一个视图。如下:

CREATE FUNCTION pg_buffercache_pages() RETURNS
SETOF RECORD AS 'MODULE_PATHNAME',
      'pg_buffercache_pages' LANGUAGE C PARALLEL SAFE;


CREATE OR REPLACE VIEW pg_buffercache AS
SELECT P.*
FROM pg_buffercache_pages() AS P
(
    bufferid integer, 
    relfilenode oid, 
    reltablespace oid, 
    reldatabase oid, 
    relforknumber int2, 
    relblocknumber int8, 
    isdirty bool, 
    usagecount int2, 
    pinning_backends int4
);

创建 pg_buffercache 扩展

postgres=# \c mydb1 postgres
You are now connected to database "mydb1" as user "postgres".
mydb1=# CREATE EXTENSION pg_buffercache ;
CREATE EXTENSION

连接到数据库 mydb1

mydb1=# \c mydb1 postgres
You are now connected to database "mydb1" as user "postgres".
mydb1
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值