postgresql-shared_buffers参数详解

shared_buffers 是 PostgreSQL 中一个非常关键的参数,用于配置服务器使用的共享内存缓冲区的大小。这些缓冲区用于存储数据页,以便数据库可以更快地访问磁盘上的数据。

这个参数在 PostgreSQL 的性能方面有着重要的影响。增加 shared_buffers 可以提高数据库的性能,尤其是对于频繁的读取操作。但是,设置得太大可能会导致内存不足,影响其他系统进程的性能,需要谨慎平衡。

以下是关于 shared_buffers 的一些重要信息:

  1. 作用: 控制 PostgreSQL 服务器用于缓存数据页的共享内存大小。这些数据页是数据库从磁盘读取的数据的副本,在内存中存储以提高后续读取操作的速度。

  2. 默认值: 默认情况下,shared_buffers 的值是相对于系统总内存的一部分。默认设置通常比较保守,以兼顾系统的其他资源需求。

  3. 调整建议: 适当设置 shared_buffers 的值取决于多个因素,包括系统的可用内存、数据库负载、运行中的查询类型等。增加 shared_buffers 可以提高性能,但并不是所有情况下都能带来线性的性能提升。

  4. 内存计算: 通常建议将 shared_buffers 设置为物理内存的 25% 到 40% 之间。这只是一个起点,最佳值需要根据实际情况和性能测试来确定。

  5. 影响:shared_buffers 设置得过小可能导致频繁的磁盘 I/O 操作,影响性能;而设置得过大可能占用大量内存,影响系统的稳定性和其他进程的性能。

修改 shared_buffers 后通常需要重启 PostgreSQL 服务器才能使更改生效。

1. 计算机缓存机制

计算机缓存是指用于临时存储数据的一种高速存储器,其目的是提高数据访问速度并加速计算机系统的性能。缓存系统通过在数据的访问路径中引入更快的存储介质,减少了对慢速存储(如硬盘)的访问次数,从而加快数据的读取和写入。

1.1. 类型和工作原理:

  1. CPU 缓存(Cache Memory): 在现代计算机系统中,CPU 缓存是其中最重要的缓存之一。它通常分为三级:一级缓存(L1 Cache)、二级缓存(L2 Cache)和三级缓存(L3 Cache)。这些缓存以层级结构的方式嵌入在 CPU 内部,并用于存储CPU经常需要访问的数据和指令。这些缓存级别按速度和容量递减排列,L1 最快但容量最小,L3 最慢但容量最大。

  2. 硬盘缓存(Disk Cache): 操作系统和文件系统会使用部分内存作为硬盘缓存,用于存储磁盘上最近访问的数据块的副本。这样的缓存减少了从慢速的机械硬盘读取数据的需求,提高了文件访问速度。

  3. 数据库缓存: 数据库系统通常有自己的缓存机制,如之前提到的 PostgreSQL 的 Shared Buffers。这些缓存用于存储数据库中经常被访问的数据,以减少对存储介质(如磁盘)的访问,提高数据库查询的性能。

1.2. 缓存优势和局限性:

  • 优势:

    • 提高数据读取速度:通过存储最近使用的数据副本,可以快速响应对相同数据的再次访问。
    • 减少延迟:由于缓存通常位于 CPU 或内存之类的更快速介质中,因此访问这些缓存的延迟更低。
    • 改善性能:优化内存和磁盘之间的数据传输,降低系统响应时间,提高整体性能。
  • 局限性:

    • 有限容量:缓存的容量有限,因此可能无法容纳所有的数据。
    • 数据一致性问题:缓存数据更新不及时可能导致一致性问题。
    • 成本:更大容量、更快速的缓存通常成本更高。

1.3. 管理和优化缓存:

  • 合理配置大小: 根据应用需求和硬件条件,合理配置缓存的大小以平衡性能和成本。
  • 监控和优化: 定期监控缓存使用情况,优化缓存命中率,避免缓存污染(淘汰频繁使用的数据)等问题。
  • 使用合适的缓存策略: 包括先进先出(FIFO)、最近最少使用(LRU)、最不经常使用(LFU)等策略以及写回、写通过等写入策略。

综合来说,缓存在计算机系统中扮演着至关重要的角色,对于提高系统的整体性能至关重要。因此,合理利用和管理缓存是优化系统性能的关键一环。

1.4. OS Cache

  • Linux: 在 Linux 上,可以通过修改内核参数(如 vm.dirty_* 和 vm.swappiness)来影响磁盘缓存的行为。这些参数控制着内核对于脏页(未写入磁盘的数据页)的处理方式以及内存交换(swapping)行为。但是,修改这些参数需要谨慎,最好了解其影响和风险。

  • Windows: Windows 操作系统也有一些控制文件系统缓存的参数,但通常情况下,Windows 会自动管理这些参数。

2. BGWriter在PostgreSQL中的作用是什么?

`BGWriter`(Background Writer)是 PostgreSQL 中的一个重要后台进程,负责管理缓冲区(Buffer Cache)并尽可能将脏页(已被修改但尚未写入磁盘)异步地写入到磁盘,以确保数据的持久性和系统性能的最优化。以下是 `BGWriter` 后台进程的主要功能和作用:1. **脏页管理**:`BGWriter` 负责管理共享缓冲区中的脏页,这些脏页包含了已经被修改但尚未写入磁盘的数据。2. **异步写入脏页**:它定期检查缓冲区中的脏页,并尝试将这些脏页异步地写入到磁盘。这样做有助于降低对磁盘的频繁访问,提高数据库系统的性能。3. **减少后续写入操作的影响**:通过将脏页定期写入磁盘,`BGWriter` 可以减少后续写入操作对系统性能的影响。这有助于确保写入操作不会阻塞太多,并且减少了系统性能突然下降的风险。4. **优化磁盘写入**:`BGWriter` 通过尝试合并或共享磁盘写入操作,以提高写入磁盘的效率,减少对磁盘的访问次数,进而优化系统性能。需要注意的是,`BGWriter` 进程的行为相对被动,其工作是在后台周期性地进行。默认情况下,它会根据配置中的参数自动执行,通常不需要额外的手动调整。然而,在某些高负载或特定场景下,对 `BGWriter` 参数的微调可能有助于进一步优化数据库的性能。

在这里插入图片描述

3. 修改参数的优点和缺点

在 PostgreSQL 中,修改 shared_buffers 参数后,重启数据库服务器并重新启动之后,对于 UPDATE 操作的速度可能会有一定影响,但影响的具体程度取决于多种因素。

shared_buffers 参数控制着数据库系统用于缓存数据的共享内存区域大小。增大 shared_buffers 的值通常会增加数据库系统在内存中缓存数据的能力,从而提高查询性能,尤其是能够更快地访问和操作缓存中的数据。

然而,增大 shared_buffers 参数值可能会导致数据库系统在启动时需要更多的内存,并且在运行过程中可能占用更多的系统资源。因此,如果您在修改 shared_buffers 参数后重启 PostgreSQL,可能会出现以下情况:

  1. 启动时间增加:如果您将 shared_buffers 值增大到一个较大的数值,可能会导致 PostgreSQL 在启动时需要更长的时间来分配和管理这部分较大的内存空间。

  2. 内存占用增加:增大 shared_buffers 参数会占用更多的内存。如果系统可用内存不足,可能会导致其他进程的内存竞争,甚至可能出现交换(swap)。

  3. 影响 UPDATE 操作速度:在某些情况下,增大 shared_buffers 可能会提高 UPDATE 操作的速度,尤其是对于频繁读取的数据,因为缓存命中率可能会提高。但并不是所有的 UPDATE 操作都会直接受益于这种变化。

总体来说,修改 shared_buffers 后对 UPDATE 操作速度的影响因多种因素而异,包括系统的硬件资源、数据库的使用模式、查询访问模式等。为了评估对性能的影响,建议在生产环境之前在测试环境中进行测试和评估,以便更好地了解参数调整对系统的影响。

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

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

相关文章

【并发编程】ConcurrentHashMap底层结构和原理

📫作者简介:小明Java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于…

wmvcore.dll丢失怎么办?解决电脑出现wmvcore.dll丢失问题5个方法

wmvcore.dll缺失5个解决方法与wmvcore.dll丢失原因及文件介绍 引言: 在日常使用电脑的过程中,我们可能会遇到一些错误提示,其中之一就是wmvcore.dll缺失。wmvcore.dll是Windows Media Video编码解码相关动态链接库文件之一,它对…

Linux 项目自动化构建工具:make/makefile

什么是 make make 是一个命令,他会在源文件的当前目录下寻找 makefile 或者 Makefile 文件执行这个文件中的代码。 makefile 文件的编写 我们先来见见猪跑,看看 make 怎么用的: 下面是 makefile 文件的内容: 这是 test.c 中的…

WPF创建进度条

使用wpf做一个原生的进度条,进度条上面有值,先看效果。 功能就是点击按钮,后台处理数据,前台显示处理数据的变化,当然还可以对进度条进行美化和关闭的操作,等待后台处理完毕数据,然后自动关闭。…

Python入职某新员工大量使用Lambda表达式,却被老员工喷是屎山

Python中Lambda表达式是一种简洁而强大的特性,其在开发中的使用优缺点明显,需要根据具体场景权衡取舍。 Lambda表达式的优点之一是它的紧凑语法,适用于一些短小而简单的函数。这种形式使得代码更为精炼,特别在一些函数式编程场景中,Lambda表达式可以提高代码的表达力。此外…

DMX512协议及对接口电路的分析

1、DMX512协议简介 DMX 是Digital MultipleX 的缩写,意为多路数字传输(具有512条信息的数字多路复用”)。DMX512控制协议是美国舞台灯光协会(usITT)于1990年发布的灯光控制器与灯具设备进行数据传输的工业标准,全称是USITTDMX512(1990); DMX512 在其物理…

福州大学《嵌入式系统综合设计》 实验八:FFMPEG视频编码

一、实验目的 掌握使用算能平台进行视频编码的流程,包括开发主机环境与云平台的配置,视频编码程序的编写与理解,代码的编译、运行以及学习使用码流分析工具分析视频压缩码流等。 二、实验内容 搭建实验开发环境,编译并运行编码…

Spring Boot 3.2.0 虚拟线程初体验 (部分装配解析)

写在前面 spring boot 3 已经提供了对虚拟线程的支持。 虚拟线程和平台线程主要区别在于,虚拟线程在运行周期内不依赖操作系统线程:它们与硬件脱钩,因此被称为 “虚拟”。这种解耦是由 JVM 提供的抽象层赋予的。 虚拟线程的运行成本远低于平…

组合设计模式

package com.jmj.pattern.combination;/*** 菜单组件,属于抽象根节点*/ public abstract class MenuComponent {//菜单组件的名称protected String name;//菜单组件的层级protected int level;//添加子菜单public void add(MenuComponent menuComponent) {throw new…

12.Spring源码解析-其它标签解析

容易看出,Spring其实使用了一个Map了保存其映射关系,key就是命名空间的uri,value是NamespaceHandler对象或是Class完整名,如果发现是类名,那么用反射的方法进行初始化,如果是NamespaceHandler对象&#xff…

计算虚拟化之CPU——qemu解析

解析 qemu 的命令行,qemu 的命令行解析,就是下面这样一长串。 qemu_add_opts(&qemu_drive_opts);qemu_add_opts(&qemu_chardev_opts);qemu_add_opts(&qemu_device_opts);qemu_add_opts(&qemu_netdev_opts);qemu_add_opts(&qemu_nic_…

C语言枚举的作用是什么?

我在知乎上看到这个问题,一开始,也有一些疑惑,后面查了一些资料,对于这个问题,简单的说一下我的看法。 枚举有多大 枚举类型到底有多大,占多少空间呢?这个要具体情况具体分析,编译器…

【shell】多行重定向与免交互expect与ssh、scp的结合使用

目录 一、多行重定向 举例1:使用read命令接收用户的输入值会有交互过程 举例2:设置变量的值 举例3:创建用户密码 举例4:使用多行重定向写入文件中(以repo文件举例) 举例5:变量设定 二、免…

C++初阶模板

介绍: 我们先认识以下C中的模板。模板是一种编程技术,允许程序员编写与数据类型无关的代码,它是一种泛型编程的方式,可以用于创建可处理多种数据类型的函数或类,也就是说泛型编程就是编写与类型无关的通用代码&#xf…

多线程(补充知识)

STL库,智能指针和线程安全 STL中的容器是否是线程安全的? 不是. 原因是, STL 的设计初衷是将性能挖掘到极致, 而一旦涉及到加锁保证线程安全,会对性能造成巨大的影响. 而且对于不同的容器, 加锁方式的不同, 性能可能也不同(例如hash表的锁表和锁桶). 因此 STL 默认…

【LeetCode】每日一题 2023_11_25 二叉树中的伪回文路径(dfs,数组/位运算)

文章目录 刷题前唠嗑题目:二叉树中的伪回文路径题目描述代码与解题思路偷看大佬题解 结语 刷题前唠嗑 LeetCode?启动!!! 这个月第一次周末早起~ 题目:二叉树中的伪回文路径 题目链接:1457. 二…

20世纪的葡萄酒有哪些创新?

葡萄酒是用酵母发酵的,直到20世纪中叶,这一过程都依赖于自然产生的酵母。这些发酵的结果往往不一致,而且由于发酵时间长,容易腐败。 酿酒业最重要的进步之一是在20世纪50、60年代引进了地中海的纯发酵菌种酿酒酵母,俗称…

你要的fiddler快捷键全部在这里了,学最全的快捷键,做最快的IT程序员

一、常用三个快捷键 ctrlX :清空所有记录 CtrlF:查找 F12:启动或者停止抓包 使用 QuickExec Fiddler2 成了网页调试必备的工具,抓包看数据。Fiddler2自带命令行控制。 fiddler 命令行快捷键:ctrl q ,然后 输入 help…

Codeforces Round #911 (Div. 2)

A.Cover in Water 题意: 有一个 1 n 1 \times n 1n的水池,里面有些格子可以加水,有些格子是被堵上的,你可以进行以下两种操作: 1.往一个空的格子里加水 2.移除一个有水的格子中的水,并将这些水添加到另…

合并区间[中等]

一、题目 以数组intervals表示若干个区间的集合,其中单个区间为intervals[i] [starti, endi]。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。 示例 1: 输入:intervals […