第一章 buffer cache管理--1 介绍

PostgreSQL缓冲区管理器管理着shared buffer和持久存储之间的数据传输,对数据库性能有着重要影响。本节重要介绍shared buffer重要参数、查看缓冲信息及预热方法。

1、shared buffer参数shared_buffers

PostgreSQL通过自己的buffer和操作系统内核缓冲来缓冲数据,即在内存中存储着两份数据,分别在shared buffer和内核buffer中。和其他数据库不同,PG不提供direct IO。而PG的buffer由shared_buffer参数控制,对数据库调优有重要作用。

这个参数意思是PG为了cache数据需要使用内存大小。默认值是128MB,最小值是128KB。如果没有指定单位,则为block个数,一个block为BLOCKSZ,即默认8KB。这个参数只能重启生效。

这个参数的推荐值是DRAM大小的1/4。也可根据环境进行调整。生产环境中,这个值越大性能越好。

可以通过执行show shared_buffers或从pg_settings视图中查询该参数配置信息:

postgres # show shared_buffers;shared_buffers
----------------128MB
(1 row)postgres # select *,current_setting(name) from pg_settings where name like ‘shared_buf%’;
----------------+-----------------------------------------------------------------
name            | shared_buffers
setting         | 16384
unit            | 8kB
category        | Resource Usage /Memory
shart_desc      | Sets the number of shared memory buffers used by the server.
extra_desc      |
context         | postmaster
vartype         | integer
source          | configuration file
min_val         | 16
max_val         | 1073741823
enumvals        | 
boot_val        | 1024
reset_val       | 16384
sourcefile      | /home/yzspm/data/postgresql.conf
sourceline      | 121
pending_restart | f
current_setting | 128MB

2、查看shared buffer

2.1 pg_buffercache介绍

使用pg_buffercache可以查看PG数据库共享内存中内容。现在来部署pg_buffercache:

postgres=# CREATE EXTENSION pg_buffercache;
CREATE EXTENSION

pg_buffercache视图结构:

postgres=# \d pg_buffercache
View "public.pg_buffercache"
Column           | Type     | Collation | Nullable | Default
-----------------+----------+-----------+----------+---------
bufferid         | integer  |           |          |
relfilenode      | oid      |           |          |
reltablespace    | oid      |           |          |
reldatabase      | oid      |           |          |
relforknumber    | smallint |           |          |
relblocknumber   | bigint   |           |          |
isdirty          | boolean  |           |          |
usagecount       | smallint |           |          |
pinning_backends | integer  |           |          |

对于shared buffer中每8b页,pg_buffercache都返回一行。例如:

该视图每列定义如下:

名称

描述

bufferid

共享内存中块ID

relfilenode

表文件ID

reltablespace

关系的表空间ID

reldatabase

关系的数据库ID

relforknumber

关系的分叉树,比如表主文件为0,fsm、vm文件分别为1和2

relblocknumber

关系的页数

isdirty

是否变脏

usagecount

Clock-sweep访问计数

pinning_backends

对这个缓冲区加pin的后端进程数量

这个视图通过创建的函数pg_buffercache_pages()进行构建:

CREATE VIEW pg_buffercache ASSELECT 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_pages(PG_FUNCTION_ARGS)...for (i = 0; i < NBuffers; i++){//NBuffers为缓冲区块数bufHdr = GetBufferDescriptor(i);buf_state = LockBufHdr(bufHdr);fctx->record[i].bufferid = BufferDescriptorGetBuffer(bufHdr);fctx->record[i].relfilenode = bufHdr->tag.rnode.relNode;...UnlockBufHdr(bufHdr, buf_state);
}...

2.2 pg_buffercache应用

通过pg_buffercache可以分析缓冲区设置是否合理:

如果有大量内存块其usagecount值普遍处于4-5的值,说明shared_buffers不够用,可以适当调高;如果usagecount值普遍为0-1,则可以适当减少。至于怎样减少,还需结合缓存命中率情况。

计算缓存命中率的方法:

1)可以利用pg_stat_database视图计算,该视图有两个字段blks_read和blks_hit,分别表示未命中和命中页数,那么计算命中率的语句:

注意,这种方式统计的信息包含系统表的信息,所以如果统计某个表的命中率,需要通过方法2。

2)利用pg_stat_user_tables视图计算

该例子表t2的缓冲命中率为100%。如果命中率太低,比如小于60%,那么共享缓冲区太小,需要调高。如果计算索引的缓冲命中率,仅需把heap替换成idx即可。

另外一个第三方插件pgfincore提供了操作系统如何缓冲页面信息,该插件安装及使用方法如下:

同时会显示操作系统缓存中页数,即rel_os_pages字段值。

这个插件详细使用方法可参考:Projects · pgfincore · GitHub

需要注意,执行pgfincore会将数据页预取到操作系统缓存。

在分析一个新数据库时,可以使用下面语句快速查看每个表缓冲了多少数据页,以及其相对于表总大小的百分比:

表t1的索引t1_pkey占cache的37.8%,占表总大小的90.2%,缓存中读取了索引中90%多的数据。数据库将数据保存在内存中非常重要。

3预热

PG自带插件pg_prewarm可以用于缓冲预热。该工具支持3种预读方式:

  • prefetch:异步异读到操作系统page cache,调用的函数posix_fadvise
  • read:读取到用户buffer,实际上也在OS cache
  • buffer:读取到shared buffer

注意,这种预热工具没有对缓冲区进行保护,可能导致预热的数据页又被替换出去,导致预热失效。通常仅在启动时有用,并且大部分缓存为空。

这个工具支持2种方式:手动和自动。

3.1 手动

1)首先安装该插件:

postgres=# CREATE EXTENSION pg_prewarm;
CREATE EXTENSION

2)创建表并预制数据

postgres=# CREATE TABLE t1(id int)
CREATE TABLE
postgres=# INSERT INTO t1 SELECT * FROM generate_series(1, 1000000);
SELECT 1000000

3)关闭服务并重启

   pg_ctl restart

4)预热

test=# SELECT * FROM pg_prewarm('public.t1');
pg_prewarm
------------
5425
(1 row)

这个例子中,调用pg_prewarm函数将表t1预热,有5425个页读取并加载到cache中。上面的方法是最简单的,还有其他方式。看下这个函数定义:

postgres=# \x
Expanded display is on.
test=# \df *pg_prewarm*
List of functions
-[ RECORD 1 ]
----------------------+---------------------------------------------Schema              | publicName                | pg_prewarmResult data type    | bigintArgument data types | regclass, mode text DEFAULT 'buffer'::text,fork text DEFAULT 'main'::text,first_block bigint DEFAULT NULL::bigint,last_block bigint DEFAULT NULL::bigintType                | func

参数除了传入想要预热的表名外,还可以通过第二个参数告诉加载哪种文件,是主文件还是fsm或vm文件。通常加载主文件即可。还可以预热独立指定块,即第3和4个参数,告诉加载哪些页。第一个参数告诉使用哪种预热方式,默认是buffer。这种方式比较灵活,但通常并不使用。

3.2 自动

启动时,自动预热才会更加完美。需要将pg_prewarm添加到shared_preload_libraries参数,然后重启服务。例如在postgresql.conf中配置:

shared_preload_libraries = ‘pg_stat_statements, pg_prewarm’

启动后,可以看到“autoprewarm master”进程,这个进程负责预热:

80259 ? Ss 0:00 /home/yzs/bin/postmaster -D /home/yzs/data/
80260 ? Ss 0:00 \_ postgres: logger
80262 ? Ss 0:00 \_ postgres: checkpointer
80263 ? Ss 0:00 \_ postgres: background writer
80264 ? Ss 0:00 \_ postgres: walwriter
80265 ? Ss 0:00 \_ postgres: autovacuum launcher
80266 ? Ss 0:00 \_ postgres: stats collector
80267 ? Ss 0:00 \_ postgres: autoprewarm master
80268 ? Ss 0:00 \_ postgres: logical replication launcher

默认情况下,pg_prewarm会将内存中的块链表存储到磁盘,重启时自动读取这个链表中页号,并把这些对于页读取到cache。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3021966.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Tuxera NTFS for Mac Mac用户无缝地读写NTFS格式的硬盘和U盘

在数字化时代&#xff0c;数据交换和共享变得日益重要。然而&#xff0c;对于Mac用户来说&#xff0c;与Windows系统之间的文件交换可能会遇到一些挑战。这是因为Mac OS默认不支持Windows常用的NTFS文件系统。幸运的是&#xff0c;Tuxera NTFS for Mac为我们提供了一个优雅的解…

【随想录】Day42—第九章 动态规划part04

目录 题目1: 01 背包理论基础&#xff08;二维&#xff09;1- 01 背包2- 动规&#xff1a;二维 dp 数组解决 01 背包3- 题解⭐ 01 背包理论基础——题解思路 题目2: 01 背包理论基础&#xff08;一维&#xff09;1- 思路2- 题解⭐ 01 背包理论基础&#xff08;一维&#xff09;…

含义:理财风险等级R1、R2、R3、R4、R5

理财风险等级R1、R2、R3代表什么&#xff0c;为什么R1不保本&#xff0c;R2可能亏损 不尔聊投资https://author.baidu.com/home?frombjh_article&app_id1704141696580953 我们购买理财产品的时候&#xff0c;首先都会看到相关产品的风险等级。风险等级约定俗成有5级&…

html的标签

基础标签 标签描述<h1>-<h6>定义标题&#xff0c;h1最大&#xff0c;h6最小<font>定义文本的字体&#xff0c;字体尺寸&#xff0c;字体颜色<b>定义粗体文本<i>定义斜体文本<u>定义文本下划线<center>定义文本居中<p>定义段落…

【R语言】生存分析模型

生存分析模型是用于研究时间至某个事件发生的概率的统计模型。这个事件可以是死亡、疾病复发、治疗失败等。生存分析模型旨在解决在研究时间相关数据时的挑战&#xff0c;例如右侧截尾&#xff08;右侧截尾表示未观察到的事件发生&#xff0c;例如研究结束时还未发生事件&#…

重定向_缓冲区

目录 重定向 文件属性操作 浅谈重定向​编辑 深入重定向 dup2 缓冲区 缓冲区的理论理解 代码分析 重定向 文件属性操作 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> int stat(const char *path, struct stat *buf); int fstat(i…

Densenet+SE

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊# 前言 前言 这周开始学习关于经典模型的改进如加注意力机制&#xff0c;这周学习Densenet加通道注意力即SE注意力机制。 ##SE注意力机制简介 SE&#xff08;…

AI智能分析视频监控行业的发展趋势和市场发展浅析

监控视频AI智能分析技术的现状呈现出蓬勃发展的态势&#xff0c;这一技术源于计算机视觉和人工智能的研究&#xff0c;旨在将图像与事件描述之间建立映射关系&#xff0c;使计算机能够从视频图像中分辨出目标信息。 在技术上&#xff0c;监控视频AI智能分析技术已经实现了对视…

iOS ------ 内存五大分区

1&#xff0c;内存的概念&#xff1a; 虚拟内存&#xff08;Virtual Memory&#xff09;&#xff1a;虚拟内存是操作系统提供的一种机制&#xff0c;它使得应用程序能够访问超出物理内存限制的内存空间。虚拟内存将应用程序的内存地址空间分割成固定大小的页面&#xff08;Pag…

数字孪生涉及到的前沿技术:虚拟现实 人工智能 区块链 边缘计算。

数字孪生是各类技术的综合应用&#xff0c;除了咱们常见的传感器、数据采集、清洗、传输、建模、可视化技术外&#xff0c;还有还有一些前沿技术&#xff0c;会让数字孪生更加强大和智能&#xff0c;本文介绍几个。 虚拟现实&#xff08;Virtual Reality&#xff0c;VR&#x…

ComfyUI中图像亮度/对比度/饱和度处理

用上面这个节点可以同时设置图片的亮度、对比度和饱和度。 【保姆级教程】一口气分享在ComfyUI中常用的30多种基本图像处理方式 更多好玩且实用AIGC工作流和节点 星球号&#xff1a;32767063 本期资料链接 往期学习资料 整理AI学习资料库

Python基础详解三

一&#xff0c;函数的多返回值 def methodReturn():return 1,2x,ymethodReturn() print(x,y) 1 2 二&#xff0c;函数的多种参数使用形式 缺省参数&#xff1a; def method7(name,age,address"淄博"):print("name:"name",age"str(age)&quo…

去哪儿网机票服务请求体bella值逆向

作者声明&#xff1a;文章仅供学习交流与参考&#xff01;严禁用于任何商业与非法用途&#xff01;否则由此产生的一切后果均与作者无关&#xff01;如有侵权&#xff0c;请联系作者本人进行删除&#xff01; 一、加密定位 直接全局搜索bella&#xff0c;在可疑的地方下断&…

二叉树习题汇总

片头 嗨&#xff01;大家好&#xff0c;今天我们来练习几道二叉树的题目来巩固知识点&#xff0c;准备好了吗&#xff1f;Ready Go ! ! ! 第一题&#xff1a;二叉树的最大深度 解答这道题&#xff0c;我们采用分治思想 1. 递归子问题&#xff1a;左子树的高度和右子树的高度 …

Ubuntu22.04下安装kafka_2.11-0.10.1.0并运行简单实例

目录 一、版本信息 二、安装Kafka 1.将Kafka安装包移到下载目录中 2.下载Spark并确保hadoop用户对Spark目录有操作权限 三、启动Kafka并测试Kafka是否正常工作 1.启动Kafka 2.测试Kafka是否正常工作 一、版本信息 虚拟机产品&#xff1a;VMware Workstation 17 Pro 虚…

WPF之自定义绘图

1&#xff0c;创建自定义控件类 class CustomDrawnElement:FrameworkElement{public static readonly DependencyProperty BackgroundColorProperty;static CustomDrawnElement(){FrameworkPropertyMetadata meta new FrameworkPropertyMetadata(Colors.SkyBlue);meta.Affects…

【初阶数据结构】栈

目录 栈的概念及结构栈的实现栈的结构栈的初始化栈的销毁入栈出栈取栈顶元素判断栈是否为空取栈中元素个数代码测试 完整代码Stack.hStack.ctest.c 栈的概念及结构 栈&#xff1a;是一种特殊的线性表&#xff0c;它只允许在固定的一端进行插入和删除元素的操作。   栈顶&…

代码随想录算法训练营DAY47|C++动态规划Part8|198.打家劫舍、213.打家劫舍II、198.打家劫舍III

文章目录 198.打家劫舍思路CPP代码 ⭐️213.打家劫舍II解决环的问题思路总结CPP代码 ⭐️198.打家劫舍III思路递归三部曲——确定参数和返回值递归三部曲——确定终止条件递归三部曲——确定单层遍历的逻辑 打印dp数组CPP代码暴力递归记忆化递归 198.打家劫舍 力扣题目链接 文章…

爬虫:爬取豆瓣电影

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 上篇我们将到如何利用xpath的规则&#xff0c;那么这一次&#xff0c;我们将通过案例来告诉读者如何使用Xpath来定位到我们需要的数据&#xff0c;就算你不懂H5代码是怎么个嵌套或者十分复…

3D模型素材有哪些常见的用途?

3D模型素材已经成为了设计、游戏开发、电影制作和建筑等领域的重要工具。它们以其独特的形式和丰富的细节&#xff0c;为这些领域的专业人士提供了无尽的创作可能性。 1.建筑和室内设计&#xff1a;在建筑设计中&#xff0c;3D模型可以帮助建筑师更直观地展示设计方案&#xff…