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,一经查实,立即删除!

相关文章

北京交通大学 计算机网络体系与协议(研) 考试试卷

计算机网络体系与协议2023年期末考试 时长:120分钟 学院: 学号: 姓名: 一、简答题(每题5分) 1.简述公开密钥密码体制的工作原理…

Java HashSet

HashSet 是一个基于 HashMap 实现的无序列表。 它不保证数据存储的顺序, 但是可以保证存储的数据是唯一不重复的, 同时支持存储 null。 如果再了解 HashMap 后, HashSet 是几个 Collection 实现中最容易理解的集合, 因为 HashSet 的所有操作都是借助于 HashMap 实现的。 Hash…

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

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

【Python百宝箱】密码学之美:Python安全性实战手册

前言 在当今数字化时代,数据安全和隐私保护是至关重要的。密码学作为信息安全的基石,为我们提供了许多关键的工具和算法,用于加密、解密、数据完整性验证和密码管理。Python生态系统中有多个强大的密码学库,本文将深入探讨其中一…

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视频编码

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

设计模式在实际业务中应用 - 模版方法

1. 业务背景 作者在工作中主要主导 A 业务线的系统建设,A 业务线主要是零售场景酒水的售卖与即时配送服务。为了方便运营在自研系统中对多平台商品进行管理而开发的三方平台商品管理功能,本次介绍的模版方法模式则是在该功能开发过程中的落地实践。 2.…

vue前端前端页面权限验证方式

在Vue应用中使用Vuex(Vue的状态管理库)来存储用户组(user group)和角色(roles)信息是一种合理的做法,特别是在涉及到权限管理和用户身份的情况下。Vuex提供了一个集中式的状态管理方案&#xff…

CeresPCL 曲线拟合之三次多项式

文章目录 一、简介2.1 实现步骤二、实现代码三、实现效果参考资料一、简介 2.1 实现步骤 (1)构建代价函数。假设我们得到了一组数据,也知晓该数据是用曲线方程: y = a x 3 + b x 2 + c x +

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

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

qt QString常用方法

1. QString 尾部拼接,尾部插入字符.调用append()函数.同时,QString字符串直接用加号 也可以进行拼接. QString s "我的女神";s s "刘亦菲";s "最近可好?";s.append("你跑哪儿去了?");//拼接结果: 我的女神刘亦菲最近可好?你跑…

Java中的mysql——面试题+答案(数据库设计)——第25期

MySQL数据库的设计是关系数据库设计的一个重要方面,涉及表的结构、索引、外键关系等。 需求分析: 在设计数据库之前,确保充分了解业务需求和数据关系,分析系统需要存储的数据以及各数据之间的关系。 规范化: 使用数据…

组合设计模式

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语言枚举的作用是什么?

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