postgresql_internals-14 学习笔记(五)Buffer Cache

news2024/11/14 20:16:55

新年的第一篇博客~ 

一、 Buffer Cache简介

1. 主要用途

        调和内存(ns级)与磁盘(ms级)间的速度差异。

        pg不仅用自己的buffer cache,也用os cache,所以它使用了“双缓存”,这也是很多文档推荐shared_buffer参数只设为内存25%(通常不超过16G)的原因。

2. os参数

  • shmall      # 单个共享内存段的最大大小(字节为单位)
    shmmax      # 服务器上所有进程可以使用的共享内存的总页数

    推荐设置:将shmall设置为总内存的一半,太小会导致PG服务启动报错

设置脚本  vi shmsetup.sh

#!/bin/bash
page_size=`getconf PAGE_SIZE`
phys_pages=`getconf _PHYS_PAGES`
shmall=`expr $phys_pages / 2`
shmmax=`expr $shmall \* $page_size`
echo kernel.shmmax = $shmmax
echo kernel.shmall = $shmall

执行脚本

./shmsetup >> /etc/sysctl.conf

sysctl -p

3. db参数

       估计共享内存消耗时,最需要关注的是shared_buffers的取值(调整后需重启生效)

       在pg中,buffer cache miss不意味着一定有物理IO,它还可以用到os cache,当然os cache不会按照db buffer cache那套重置和剔除策略,是用os自己的。

       通常建议是将shared_buffers初始值设置为os内存的1/4,之后根据压测和运行情况调整。

  • 查看shared_buffers
show shared_buffers;
select name,setting,unit,current_setting(name) from pg_settings where name='shared_buffers';

current_setting()函数和show 命令一样,用来显示配置的基本信息,也可以在查询中使用。

所有操作系统都给予应用一种强制从高速缓存写入磁盘的方法

  • wal_sync_method参数决定PG如何请求内核强制将WAL更新到磁盘

二、 Buffer Cache设计

1. Buffer Cache结构

Buffer Cache位于共享内存中,所有进程均可访问

header包含以下信息:

  • 页的物理位置(文件id、fork、fork中的块号)
  • 该页是否为脏页
  • buffer使用计数
  • pin count (or reference count)

2. pg_buffercache插件

pg_buffercache插件可以实时检查共享缓冲区

CREATE EXTENSION pg_buffercache;
  • 共享的系统目录被显示为属于数据库0
  • 缓冲区是所有数据库共享,通常会有不属于当前数据库的关系的页面
  • 可以与pg_class关联,将连接限制于reldatabase等于当前数据库 OID 或零的行

注意:经常读取这个视图还是会对数据库性能产生一些影响

可以通过查看系统shared_buffers的大小来确认该模块是否工作正常(db刚启动时除外):

select setting, unit from pg_settings where name = 'shared_buffers';
select count(*) from pg_buffercache;

创建一个简单函数帮助查看

CREATE FUNCTION buffercache(rel regclass)
RETURNS TABLE(
bufferid integer, relfork text, relblk bigint,
isdirty boolean, usagecount smallint, pins integer
) AS $$
SELECT bufferid,
CASE relforknumber
WHEN 0 THEN 'main'
WHEN 1 THEN 'fsm'
WHEN 2 THEN 'vm'
END,
relblocknumber,
isdirty,
usagecount,
pinning_backends
FROM pg_buffercache
WHERE relfilenode = pg_relation_filenode(rel)
ORDER BY relforknumber, relblocknumber;
$$ LANGUAGE sql;

 

3. 测试案例

CREATE TABLE cacheme(id integer) WITH (autovacuum_enabled = off);
INSERT INTO cacheme VALUES (1);	

SELECT * FROM buffercache('cacheme');

SELECT usagecount, count(*)
FROM pg_buffercache
GROUP BY usagecount
ORDER BY usagecount;

 usagecount为空代表free buffer

三、 cache命中与未命中

       pg通过哈希表定位cache中的页,hash key由文件id、fork、fork中的块号(上面提到的header内容)组成。

每当使用到cache中的页,usagecount会增加

EXPLAIN (analyze, buffers, costs off, timing off, summary off) SELECT * FROM cacheme;

SELECT * FROM buffercache('cacheme');

 使用游标时,则会用到cache pin

BEGIN;
DECLARE c CURSOR FOR SELECT * FROM cacheme;
FETCH c;

SELECT * FROM buffercache('cacheme');

如果无法pin到该页,通常pg会跳过并选择下一个页。

        vacuum操作中有时可以看到,另开一个会话

VACUUM VERBOSE cacheme;

        由于游标还未关闭,这些页不能从pinned buffer中移除,因此会被跳过。

       但如果是必须将这些页从pinned buffer中移除的操作(例如vacuum freeze),则会申请获得排他闩锁,被阻塞直到将这些页成功移除。

        提交游标会话,可以看到vacuum freeze随即执行成功,并且pins全变为0。

另外,插入数据并不会影响pin

重启pg,再次执行上面查询

read表示从磁盘中读取,dirtied表示页已变脏

查看命中情况

SELECT heap_blks_read, heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'cacheme';

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

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

相关文章

《UEFI内核导读》UEFI是不是操作系统?

敬请关注微信公众号:“固件C字营” 最近一直在思考一个问题,UEFI是什么?UEFI算不算是操作系统? 众所周知,计算机系统是由软件和硬件两大部分组成的,但从更科学的角度来划分,我们其实可以分得更…

电子学会2020年9月青少年软件编程(图形化)等级考试试卷(四级)答案解析

目录 一、单选题(共15题,每题2分,共30分) 二、判断题(共10题,每题2分,共20分) 三、编程题【该题由测评师线下评分】(共5题,共50分) 青少年软件…

【MySQL】说透锁机制(三)行锁升表锁如何避免? 锁表了如何排查?

文章目录前言哪些场景会造成行锁升表锁?如何避免?如何分析排查?查看InnoDB_row_lock%相关变量查看 INFORMATION_SCHEMA系统库总结最后前言 在上文我们曾小小的提到过,在索引失效的情况下,MySQL会把所有聚集索引记录和间隙都锁上&#xff0…

【正点原子】嵌入式Linux C应用编程-第十一章

第十一章:线程 前言: 与进程类似,线程是允许应用程序并发执行多个任务的一种机制,线程参与系统调度,事实上,系统调度的最小单元为线程,而不是进程 1:线程的概念 什么是线程&#xff…

【游戏编程扯淡精粹】自研引擎切 UE

【游戏编程扯淡精粹】自研引擎切 UE UF2022 的两篇讲座,再加上 The Machinery 引擎项目失败 结合过去两年笔者使用自研引擎的体验,其实有一部分是共通的 Crystal Dynamics:如何从自研引擎转变到虚幻引擎5 游戏技术(featurelist…

LVGL的学习及使用

1、LVGL简介 LVGL是最受欢迎的免费开源嵌入式图形库,可为任何MCU、MPU和显示器类型创建漂亮的用户界面。使用SquareLine工作室,使用拖放UI编辑器来简化开发。 1.1、LVGL源码下载 lvgl 在github 上的开源代码 https://github.com/lvgl/lvgl 下载的源码包里…

Vue的数据绑定

一、Vue的数据绑定 1、单向数据绑定:将Model绑定到View上,当通过JavaScript代码改变了Model时,View就会自动刷新。不需要进行额外的DOM 操作就可以实现视图和模型的联动 ​ a、数据只保存一份 ​ b、data—->DOM ​ (1&am…

在wsl下开发T113的主线linux(3)-写入spinand测试

接下来是烧写入硬件验证,我的板子焊接的是W25N01GV,这里使用xfel,因为支持写入spi-nand。GitHub - xboot/xfel: Tiny FEL tools for allwinner SOC, support RISC-V D1 chipTiny FEL tools for allwinner SOC, support RISC-V D1 chip - GitH…

QML学习笔记【04】:常用控件

1 Repeater与model Window {width: 640; height: 480visible: truetitle: qsTr("Hello World")Column{id: colspacing: 30Repeater{model: 3 //model控制了所有的数据,这里定义了Button的数量Button{width: 100; height: 50text: "btn" index…

整数划分——完全背包的变形

整数划分——完全背包的变形一、题目二、思路分析1、状态转移方程(1)状态表示(2)方程书写2、循环与初始化(1)循环(2)初始化三、代码一、题目 二、思路分析 这道题这么看的话还是比较…

Docsify使用之Markdown语法

Docsify使用过程中的排版,他是基于Markdown语法的。我们来看一下使用的常用语法: 字体加粗: 在需要加粗的文字前后各加两个** 具体格式如下 **加粗内容** 在需要加粗的文字前后各加一个* 具体格式如下 *倾斜内容* 在需要加粗并且倾斜的…

缅怀2022,展望2023

个人主页:董哥聊技术我是董哥,嵌入式领域新星创作者创作理念:专注分享高质量嵌入式文章,让大家读有所得!文章目录1、缘起2、收获3、憧憬不知不觉,2022已然到了最后一天,同时也是我技术创作一周年…

2.脚手架和逆向工程-使用renren开源

1.脚手架工程 脚手架工程提供了业务模块通用的类,比如返回结果封装、异常封装、分页工具类等 比较好用脚手架工程如renren-fast 备份地址 gitgithub.com:nome1024/renren-fast.git 2.逆向工程——使用renren-generator生成代码 逆向工程的作用是根据数据库快速生…

2022年仪器仪表行业研究报

第一章 行业概况 仪器仪表是用以检出、测量、观察、计算各种物理量、物质成分、物性参数等的器具或设备。真空检漏仪、压力表、测长仪、显微镜、乘法器等均属于仪器仪表。仪器仪表是人们对客观世界的各种信息进行测量、采集、分析与控制的手段和设备,是人类了解世界…

MySQL之表的修改和约束条件的添加

修改表中的数据:update[DML] 语法格式: update 表名 set 字段名1值1,字段名2值2,字段名3值3......where 条件;注意:没有条件限制会导致所有数据全部更新 举例: - 将id号为10的学生的姓名改变为"jas…

【自学Python】解释型程序与编译型程序

解释型程序与编译型程序 解释型程序与编译型程序教程 高级语言所编制的程序不能直接被计算机识别,必须经过转换才能被执行,按转换方式可将它们分为两类:解释型程序与编译型程序。 解释型程序 执行方式类似于我们日常生活中的 “同声翻译”…

Vue--》实现todo-list组件的封装与使用

目录 项目结构 创建todolist组件 创建todoinput组件 创建todobutton组件 项目结构 今天用 vite 脚手架搭建一个 vue3 的小案例,vite的搭建过程参考:vite的搭建 。其项目结构组件构成如下:注意:因为使用的是 vite 框架&#x…

51单片机GMS短信自动存取快递柜

实践制作DIY- GC0103-直流电机PID速度控制 一、功能说明: 基于51单片机设计-GMS短信自动存取快递柜 功能介绍: STC89C52RC最小系统板0.96寸OLED显示器DY-SV17F串口语音播报模块4*4矩阵键盘GSM短信模块4路舵机(模拟4个柜子) ***…

再学C语言21:循环控制语句——do while循环

一、其他赋值运算符 除了最基本的赋值运算符&#xff0c;C还有多个赋值运算符 a b等于a a ba - b等于a a - ba * b等于a a * ba / b等于a a / ba % b等于a a % b 这些赋值运算符的优先级与赋值运算符同样低 运算符优先级&#xff1a;赋值运算符 < 关系运算符 <…

《C++程序设计原理与实践》笔记 第9章 类相关的技术细节

在本章中&#xff0c;我们继续关注主要的程序设计工具——C语言。本章主要介绍与用户自定义类型&#xff08;即类和枚举&#xff09;相关的语言技术细节。这些语言特性大部分是以逐步改进一个Date类型的方式来介绍的。采用这种方式&#xff0c;我们还可以顺便介绍一些有用的类设…