PostgreSQL数据库参数调优实践

news2024/11/28 4:00:50

PostgreSQL(简称PG)数据库的性能调优是一个复杂但至关重要的过程,特别是在处理大量数据和复杂查询时。通过合理设置和调整数据库参数,可以显著提升数据库的性能和响应速度。本文将从多个方面详细介绍PostgreSQL数据库参数调优的实践,涵盖大小、存储、并发连接数等主要参数,并提供具体例子和解释。

一、技术背景与基础知识

在深入探讨参数调优之前,了解一些基础知识和技术背景是必要的。

1. 双重缓冲区处理

PostgreSQL既使用自身的缓冲区(shared_buffers),也使用内核缓冲IO。这意味着数据会在内存中存储两次,首先是存入PostgreSQL缓冲区,然后是内核缓冲区。这被称为双重缓冲区处理。对大多数操作系统来说,这是最有效的调优方式之一。

2. 数据库性能影响因素

数据库性能受多种因素影响,包括硬件资源(CPU、内存、存储等)、数据库配置、索引使用、查询优化等。这些因素相互作用,共同影响数据库的整体性能。

3. 查询优化器

PostgreSQL的查询优化器会生成查询执行计划,选择最优的执行路径。这依赖于数据库的统计信息、表结构和SQL的写法。优化查询语句可以减少不必要的计算和数据传输,提高查询效率。

二、主要参数调优实践

1. shared_buffers

作用:shared_buffers是PostgreSQL用于缓存表数据的共享内存区域,所有连接共用。从磁盘读入的数据(主要包括表和索引)都缓存在这里。

优化方法

  • 建议设置为物理内存的25%-40%。如果设置过低,会导致频繁的磁盘访问;设置过高则会占用操作系统内存,减少可用的文件缓存。
  • 根据实际工作负载和硬件配置进行调整。如果工作数据集可以很容易地放入内存中,可以增加shared_buffers的值来包含整个数据库,以便整个工作数据集可以保留在缓存中。

实际效果

  • 提高该值可以减少数据库的磁盘IO,显著提升查询性能。
  • 在一个实际测试中,将shared_buffers从30GB调整到50GB后,数据库QPS从26万提升到35万。

2. work_mem

作用:work_mem声明内部排序和哈希操作可使用的工作内存大小。该内存是在开始使用临时磁盘文件之前使用的内存数目。

优化方法

  • 典型值在10MB-100MB之间。每个查询连接单独分配,因此需要根据查询复杂度和并发量合理设置。
  • 对于复杂查询,可能会同时并发运行好几个排序或者哈希操作,每个都会使用这个参数声明的这么多内存。

实际效果

  • 增加work_mem有助于提高排序的速度,减少IO操作。
  • 在一个实际案例中,将work_mem从4MB调整到512MB后,排序操作的Sort Method从external merge Disk变成了quicksort Memory,显著提升了排序速度。

3. effective_cache_size

作用:effective_cache_size是PostgreSQL用来判断系统可用的文件系统缓存大小的一个参数。优化器根据这个参数来决定是否使用索引扫描或全表扫描。

优化方法

  • 建议设置为物理内存的50%-75%。这是一个估算值,并不占据系统内存。
  • 通过操作系统的统计信息(如free命令)来更好地估算该值。

实际效果

  • 设置稍大的值,优化器更倾向使用索引扫描而不是顺序扫描,从而提高查询性能。

4. maintenance_work_mem

作用:maintenance_work_mem控制PostgreSQL在执行维护操作时使用的内存大小,如创建索引、VACUUM等。

优化方法

  • 推荐设置为较大的值,尤其是在大规模数据集上操作时。
  • 根据实际工作负载和硬件配置进行调整。

实际效果

  • 调大该值可以加快创建索引、VACUUM等命令的执行速度,从而提高数据库维护效率。

5. wal_buffers

作用:wal_buffers是日志缓冲区的大小,用于缓冲WAL(预写日志)数据。

优化方法

  • 建议设置为shared_buffers的1/32。
  • 在单事务数据修改量很大或系统中并发小数据量修改的短事务较多时,可以酌情调大。

实际效果

  • 调大wal_buffers可以降低IO负担,提高数据写入性能。

6. max_connections

作用:max_connections决定允许的最大数据库连接数。

优化方法

  • 通常可以设置数百个连接。如果要使用上千个连接,建议配置连接池来减少开销。
  • 根据实际工作负载和硬件配置进行调整。

实际效果

  • 合理的连接数设置可以减少系统开销和资源竞争,提高数据库并发性能。

7. fsync

作用:fsync参数控制是否强制将数据同步更新到磁盘。

优化方法

  • 设置为on时,日志缓冲区刷盘时需要确认已经将其写入了磁盘。
  • 设置为off时,由操作系统调度磁盘写的操作,能更好利用缓存机制,提高IO性能。但会伴随数据丢失的风险。

实际效果

  • 在IO压力很大的情况下,将fsync设置为off可以提高数据库性能,但需要注意数据安全性。

8. autovacuum

作用:autovacuum参数控制是否开启自动清理进程,用于整理数据文件碎片和更新统计信息。

优化方法

  • 如果系统中有大量的增删改操作,建议打开自动清理进程。
  • 根据系统更新量设置合适的autovacuum_naptime(自动清理进程执行清理分析的时间间隔)。

实际效果

  • 开启自动清理进程可以增加数据文件的物理连续性,减少磁盘的随机IO,同时随时更新数据库的统计信息,使优化器可以选择最优的查询计划。

9. bgwriter_delay和bgwriter_lru_maxpages

作用

  • bgwriter_delay控制后台写进程的自动执行时间。
  • bgwriter_lru_maxpages控制后台写进程一次写出的脏页面数。

优化方法

  • 根据系统数据修改的压力来调整bgwriter_delay的值。如果数据修改压力一直很大,建议设置小一些的值。
  • 根据系统单位时间数据的增删改量来调整bgwriter_lru_maxpages的值。

实际效果

  • 合理的bgwriter参数设置可以减少checkpoint的压力,提高数据库的整体性能。

10. checkpoint_segments和checkpoint_completion_target

作用

  • checkpoint_segments设置WAL日志的最大数量数。
  • checkpoint_completion_target表示checkpoint的完成时间要在两个checkpoint间隔时间的N%内完成。

优化方法

  • 默认的WAL日志缓存可能是一个瓶颈,通常需要设置较大的值(如10以上)。
  • checkpoint_completion_target可以设置为接近1的值来平滑WAL日志写入压力。

实际效果

  • 合理的checkpoint参数设置可以降低平均写入的开销,提高数据库性能。

三、索引优化

索引是加速查询速度的关键工具。合理的索引设计可以大大提高查询效率。然而,过度索引会降低写入性能并占用额外的存储空间,因此需要仔细评估。

1. 索引类型选择

  • B-tree索引:最常用的索引类型,适合等值查询和范围查询。
  • GIN索引:适合全文搜索和数组成员查询。
  • GiST索引:适用于空间数据和模糊匹配等复杂数据类型。

2. 复合索引

对于多列条件查询,可以考虑创建复合索引。复合索引是基于表中多个列的索引,适用于查询条件涉及多个列的情况。

3. 索引维护

  • 定期使用REINDEX或VACUUM命令维护索引,以减少索引碎片化,保持其性能。
  • 避免对更新频繁的列创建索引。

4. 查询优化

  • 通过添加条件、使用索引或合适的查询方式来限制扫描范围,避免全表扫描。
  • 避免使用SELECT *,只选择需要的列。
  • 减少子查询,尽量将子查询转化为JOIN或WITH查询。
  • 使用LIMIT限制返回的结果数量,减少数据传输和处理时间。
  • 使用EXPLAIN或EXPLAIN ANALYZE命令查看查询的执行计划,找出性能瓶颈并进行优化。

四、硬件资源优化

硬件资源是数据库性能的基础。使用高性能的硬件组件可以加速数据库操作。

1. CPU

PostgreSQL对CPU的使用是高度并行的,尤其是在执行复杂查询时。选择多核的CPU可以提高查询性能。

2. 内存

更多的内存可以提高数据库缓存效率,减少磁盘I/O操作。建议为PostgreSQL分配足够的内存资源。

3. 存储

相比传统HDD,SSD具有更快的读写速度,能够显著缩短数据库的响应时间。在条件允许的情况下,建议使用SSD作为数据库存储设备。

五、实际案例分析

以下是一个实际案例,展示了如何通过参数调优和索引优化来提升PostgreSQL数据库的性能。

1. 初始环境

  • 数据库服务器配置:E5-2650 v2两颗CPU,128G内存,两块SATA盘做RAID0组成1T的磁盘。
  • PostgreSQL配置:max_connections=512,shared_buffers=30720MB,maintenance_work_mem=5120MB,work_mem=4MB,effective_cache_size=96GB,wal_buffers=16MB,checkpoint_segments=32,checkpoint_completion_target=0.9,autovacuum开启,fsync=on。

2. 问题描述

数据库在处理复杂查询时响应缓慢,尤其是在高并发情况下,查询延迟显著增加,系统资源利用率不均衡,CPU和IO经常成为瓶颈。

3. 调优步骤

3.1 参数调优

(1)增加shared_buffers

  • 原值:30720MB(约30GB)
  • 新值:51200MB(约50GB)
  • 理由:考虑到服务器有128GB内存,增加shared_buffers可以更有效地利用内存资源,减少磁盘IO。
  • 效果:数据库QPS从26万提升到35万,查询响应时间缩短。

(2)调整work_mem

  • 原值:4MB
  • 新值:512MB
  • 理由:work_mem过小,导致排序和哈希操作频繁使用磁盘IO。增加work_mem可以减少磁盘IO,提高查询性能。
  • 效果:复杂查询的响应时间显著降低,Sort Method从external merge Disk变为quicksort Memory。

(3)调整effective_cache_size

  • 原值:96GB
  • 新值:100GB
  • 理由:根据服务器的实际内存情况,稍微增加effective_cache_size,使优化器更倾向于使用索引扫描。
  • 效果:查询计划更优,减少了全表扫描,提高了查询速度。

(4)调整maintenance_work_mem

  • 原值:5120MB
  • 新值:8192MB
  • 理由:增加maintenance_work_mem可以加快创建索引、VACUUM等维护操作的速度。
  • 效果:维护操作时间缩短,数据库整体性能提升。

(5)调整wal_buffers

  • 原值:16MB
  • 新值:32MB
  • 理由:考虑到shared_buffers的增加,适当增大wal_buffers可以减少WAL写入的磁盘IO。
  • 效果:写入性能略有提升。

(6)调整checkpoint相关参数

  • checkpoint_segments:从32增加到64
  • checkpoint_completion_target:保持不变为0.9
  • 理由:增加checkpoint_segments可以减少WAL日志的写入压力,平滑checkpoint的IO负载。
  • 效果:checkpoint期间的IO负载降低,数据库性能更加稳定。

(7)调整max_connections

  • 原值:512
  • 新值:300
  • 理由:过多的连接数会增加系统开销,通过连接池管理连接可以减少资源竞争。
  • 效果:系统资源利用率更加均衡,并发性能提升。

(8)考虑fsync设置

  • 原值:on
  • 新值:保持on,但考虑在特定场景下(如非关键数据)临时关闭以提高性能。
  • 理由:fsync=on保证了数据的安全性,但在某些对性能要求极高且数据安全性要求不高的场景下,可以考虑关闭。
  • 效果:在特定场景下,关闭fsync可以显著提升写入性能,但需注意数据安全性风险。

3.2 索引优化

(1)分析查询语句

  • 使用EXPLAIN和EXPLAIN ANALYZE命令分析慢查询的执行计划,找出性能瓶颈。
  • 发现部分查询因为缺少合适的索引而导致全表扫描。

(2)创建复合索引

  • 针对多列条件查询,创建复合索引以加速查询速度。
  • 例如,针对查询SELECT * FROM table WHERE column1 = 'value1' AND column2 = 'value2',创建复合索引(column1, column2)

(3)更新统计信息

  • 使用ANALYZE命令更新表的统计信息,使优化器能够选择更优的查询计划。
  • 定期运行VACUUM命令以清理死行和碎片,保持数据库性能。

(4)避免过度索引

  • 评估现有索引的利用率,删除不必要的索引以减少写入开销和存储空间占用。

3.3 硬件资源优化

(1)升级存储设备

  • 考虑将SATA盘升级为SSD,以提高读写速度。
  • 在本案例中,由于预算限制,未进行硬件升级,但未来可考虑此方案。

(2)优化网络配置

  • 确保数据库服务器与客户端之间的网络连接稳定且带宽充足。
  • 在本案例中,网络性能不是瓶颈,因此未进行进一步优化。

4. 调优效果

经过上述参数调优、索引优化和硬件资源评估后,数据库性能显著提升。具体表现为:

  • 查询响应时间缩短,复杂查询的响应时间降低了30%以上。
  • 数据库QPS从26万提升到35万,并发性能提升。
  • 系统资源利用率更加均衡,CPU和IO的瓶颈问题得到解决。
  • 数据库的维护操作(如创建索引、VACUUM等)时间缩短,整体性能更加稳定。

总结

PostgreSQL数据库性能调优涉及多方面,包括基础了解双重缓冲区处理、数据库性能影响因素及查询优化器。主要参数调优实践涵盖shared_buffers、work_mem、effective_cache_size等,通过合理设置可显著提升性能。索引优化包括选择索引类型、创建复合索引及定期维护。硬件资源如CPU、内存和存储的升级也能大幅提升性能。实际案例显示,通过参数调优、索引优化和硬件评估,数据库查询响应时间缩短,QPS提升,资源利用率更均衡,维护操作时间缩短,整体性能显著提高。

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

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

相关文章

Easyexcel(7-自定义样式)

相关文章链接 Easyexcel(1-注解使用)Easyexcel(2-文件读取)Easyexcel(3-文件导出)Easyexcel(4-模板文件)Easyexcel(5-自定义列宽)Easyexcel(6-单…

(计算机网络)期末

计算机网络概述 物理层 信源就是发送方 信宿就是接收方 串行通信--一次只发一个单位的数据(串行输入) 并行通信--一次可以传输多个单位的数据 光纤--利用光的反射进行传输 传输之前,要对信源进行一个编码,收到信息之后要进行一个…

uniapp跨域问题解决方案

uniapp跨域问题解决方案 引言 在使用 uni-app 本地开发 H5> 平台时,需要使用浏览器进行调试,而浏览器会有跨域的问题。比如直接通过本地IP地址去访问开发中的页面,同时这个页面会调一些现有的接口时,就面临着跨域的问题。 解决…

Android 基于Camera2 API进行摄像机图像预览

前言 近期博主准备编写一个基于Android Camera2的图像采集并编码为h.264的应用,准备分为三个阶段来完成,第一阶段实现Camera2的摄像机预览,第二阶段完成基于MediaCodec H.264编码,第三阶段完成基于MediaCodec H.264解码,针对不同…

设计模式:11、迭代器模式(游标)

目录 0、定义 1、迭代器模式的四种角色 2、迭代器模式的UML类图 3、示例代码 4、迭代器的next()方法与集合的get(int index)方法的效率对比(LinkedList为例) 0、定义 提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象…

UE5连接VR(pico,quest)进行PC VR开发(没有废话全是干货)

一、PICO VR连接UE 首先picoVR,不管是pico neo3还是pico4,用到的软件就只有三个 分别是pico互联助手PICO 互联 | PICO (picoxr.com)、steam VR,虚幻引擎5 pico互联助手 在pico互联助手中你需要选择两种连接方式(推荐USB连接&a…

《UnityShader 入门精要》更复杂的光照

代码&示例图见:zaizai77/Shader-Learn: 实现一些书里讲到的shader 到了这里就开启了书里的中级篇,之后会讲解 Unity 中的渲染路径,如何计算光照衰减和阴影,如何使用高级纹理和动画等一系列进阶内容 Unity 中的渲染路径 在U…

用nextjs开发时遇到的问题

这几天已经基本把node后端的接口全部写完了,在前端开发时考虑时博客视频类型,考虑了ssr,于是选用了nextJs,用的是nextUi,tailwincss,目前碰到两个比较难受的事情。 1.nextUI个别组件无法在服务器段渲染 目前简单的解决方法&…

Golang项目:实现一个内存缓存系统

要求 支持设定过期时间,精确到秒支持设定最大内存,当内存超过时做出合适的处理支持并发安全按照以下接口安全 type Cache interface{//size : 1KB 100KB 1MB 2MB 1GBSetMaxMemory(size string )bool//将value写入缓存Set(key string, val interface{},e…

Softing线上研讨会 | Ethernet-APL:推动数字时代的过程自动化

| (免费)线上研讨会时间:2024年11月19日 16:00~16:30 / 23:00~23:30 Ethernet-APL以10Mb/s的传输速率为过程工业中的现场设备带来了无缝以太网连接和本质安全电源,这不仅革新了新建工厂,也适用于改造现有工厂。 与现…

《Deep Multimodal Learning with Missing Modality: A Survey》中文校对版

文章汉化系列目录 文章目录 文章汉化系列目录摘要1 引言2 方法论分类:概述2.1 数据处理方面2.2 策略设计方面 3 数据处理方面的方法3.1 模态填充3.1.1 模态组合方法3.1.2 模态生成方法 3.2 面向表示的模型3.2.1 协调表示方法3.2.2 表示组合方法。3.2.3 表示生成方法…

python爬虫案例——猫眼电影数据抓取之字体解密,多套字体文件解密方法(20)

文章目录 1、任务目标2、网站分析3、代码编写1、任务目标 目标网站:猫眼电影(https://www.maoyan.com/films?showType=2) 要求:抓取该网站下,所有即将上映电影的预约人数,保证能够获取到实时更新的内容;如下: 2、网站分析 进入目标网站,打开开发者模式,经过分析,我…

鸿蒙安全控件之位置控件简介

位置控件使用直观且易懂的通用标识,让用户明确地知道这是一个获取位置信息的按钮。这满足了授权场景需要匹配用户真实意图的需求。只有当用户主观愿意,并且明确了解使用场景后点击位置控件,应用才会获得临时的授权,获取位置信息并…

MATLAB矩阵元素的修改及删除

利用等号赋值来进行修改 A ( m , n ) c A(m,n)c A(m,n)c将将矩阵第 m m m行第 n n n列的元素改为 c c c,如果 m m m或 n n n超出原来的行或列,则会自动补充行或列,目标元素改为要求的,其余为 0 0 0 A ( m ) c A(m)c A(m)c将索引…

网络安全之内网安全

下面给出了应对企业内网安全挑战的10种策略。这10种策略即是内网的防御策略,同时也是一个提高大型企业网络安全的策略。 1、注意内网安全与网络边界安全的不同 内网安全的威胁不同于网络边界的威胁。网络边界安全技术防范来自Internet上的攻击,主要是防…

Python 爬虫入门教程:从零构建你的第一个网络爬虫

网络爬虫是一种自动化程序,用于从网站抓取数据。Python 凭借其丰富的库和简单的语法,是构建网络爬虫的理想语言。本文将带你从零开始学习 Python 爬虫的基本知识,并实现一个简单的爬虫项目。 1. 什么是网络爬虫? 网络爬虫&#x…

solr 远程命令执行 (CVE-2019-17558)

目录 漏洞描述 执行漏洞py脚本,取得shell连接 EXP 漏洞描述 Apache Velocity是一个基于Java的模板引擎,它提供了一个模板语言去引用由Java代码定义的对象。Velocity是Apache基金会旗下的一个开源软件项目,旨在确保Web应用程序在表示层和业…

数据库中的视图

数据库中的视图 什么是视图创建视图使⽤视图修改数据注意事项 删除视图视图的优点 什么是视图 视图是⼀个虚拟的表,它是基于⼀个或多个基本表或其他视图的查询结果集。视图本⾝不存储数 据,⽽是通过执⾏查询来动态⽣成数据。⽤户可以像操作普通表⼀样使…

爬虫实战:采集知乎XXX话题数据

目录 反爬虫的本意和其带来的挑战目标实战开发准备代码开发发现问题1. 发现问题[01]2. 发现问题[02] 解决问题1. 解决问题[01]2. 解决问题[02] 最终结果 结语 反爬虫的本意和其带来的挑战 在这个数字化时代社交媒体已经成为人们表达观点的重要渠道,对企业来说&…

springboot-vue excel上传导出

数据库 device_manage表 字段,id,workshop,device_number,device_name,device_model,warn_time,expired_time device_warn表 字段,id,warn_time,expired_time 后端 实体类格式 device_manage Data TableName("device_manage"…