百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

PostgreSQL性能优化之服务器参数配置

toyiye 2024-08-17 00:22 15 浏览 0 评论

默认安装时,PostgreSQL 的配置参数通常都偏小,不太适合作为生产服务器使用。所以,安装 PostgreSQL 数据库之后首先需要执行的操作就是对服务器的配置参数进行调整。

查看/设置参数值

PostgreSQL 16 服务器的配置参数有 360 多个,运行时的参数值可以使用 SHOW 命令查看:

show server_version;

server_version|
--------------|
16.2          |

show all;

name                                       |setting                                            |description                                                                                                                            |
-------------------------------------------+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------+
allow_in_place_tablespaces                 |off                                                |Allows tablespaces directly inside pg_tblspc, for testing.                                                                             |
allow_system_table_mods                    |off                                                |Allows modifications of the structure of system tables.                                                                                |
application_name                           |DBeaver 24.0.2 - SQLEditor <Script-6.sql>          |Sets the application name to be reported in statistics and logs.                                                                       |
...

这些参数的详细信息也可以使用 pg_settings 视图进行查看:

select name, setting, unit, source, sourcefile, sourceline, short_desc
from pg_settings
where name like '%buffers%';

name          |setting|unit|source            |sourcefile                                         |sourceline|short_desc                                                        |
--------------+-------+----+------------------+---------------------------------------------------+----------+------------------------------------------------------------------+
shared_buffers|16384  |8kB |configuration file|C:/Program Files/PostgreSQL/16/data/postgresql.conf|       130|Sets the number of shared memory buffers used by the server.      |
temp_buffers  |1024   |8kB |default           |                                                   |          |Sets the maximum number of temporary buffers used by each session.|
wal_buffers   |512    |8kB |default           |                                                   |          |Sets the number of disk-page buffers in shared memory for WAL.    |

通过 pg_settings 视图不仅可以查看运行时的参数值,而且可以知道这些值的来源。

这些参数有些可以在服务器运行时进行修改,有些需要重启服务器之后才能生效;不同修改方式的优先级不同,下图列出了所有可能的修改方式:

以上设置方式的优先级从高到低;也就是说,在一个在事务内部设置的参数值会覆盖其他任何设置,不过该设置只在当前事务中有效。需要注意的是,并非所有参数都可以支持所有的修改方式,具体可以参考官方文档关于 pg_settings 的说明。

接下来我们介绍几个重要的配置参数。

max_connections

max_connections 决定了客户端的最大并发连接数,默认值通常为 100。如果出现连接数过多,无法连接数据库的错误时,可能需要考虑增加最大连接数。不过,修改该参数还需要考虑对其他参数的影响(尤其是 work_mem);因为它们是基于每个连接设置的值,增加连接数也会导致这些内存使用量的增加。

通常来说,商业服务器至少可以支持几百个连接。如果应用的连接数到大上千或者几千,可以考虑使用连接池技术减少连接的消耗。

修改 max_connections 的方式有两种,修改之后必须重启服务器才能生效:

  1. 修改配置文件 postgresql.conf;
  2. alter system set max_connections = N;,该命令会修改配置文件 postgresql.auto.conf。

对于主从复制中的从节点,必须将该参数的值设置为大于等于主节点上的值;否则,从节点将无法执行查询操作。

shared_buffers

除了操作系统的 I/O 缓存之外,PostgreSQL 还会使用自己的内部缓存。PostgreSQL 共享内存缓冲区由参数 shared_buffers 设置,它决定了 PostgreSQL 能够使用的专用缓存大小。

为确保在所有机器和操作系统上的兼容性,PostgreSQL 默认将该值设置得很小,通常是 128 MB。因此,增加 shared_buffers 的值是提高性能最有效的设置之一。

虽然对于 shared_buffers 没有具体的推荐值,但是可以针对具体的系统计算出一个大概的值。一般来说,对于专用的数据库服务器,shared_buffers 大概可以设置为系统内存的 25%。增加 shared_buffers 的值通常可以提高性能,例如,当整个数据库都可以被加载到缓存中时,可以明显减少磁盘的读取操作。由于 PostgreSQL 还依赖于操作系统的缓存,大于内存 40% 的 shared_buffers 并不会带来性能的提示,反而可能会下降。

虽然增加 shared_buffers 的值可以提高以读为主的系统性能,但是可能影响以写为主的系统性能;因为 shared_buffers 的全部内容必须在写入操作时进行处理。

修改 shared_buffers 的方式有两种,修改之后必须重启服务器才能生效:

  1. 修改配置文件 postgresql.conf;
  2. alter system set shared_buffers = 'xxx';,该命令会修改配置文件 postgresql.auto.conf。

另外,增加 shared_buffers 的值通常也需要相应地增加 max_wal_size 的值,以便延长检查点的时间间隔。

wal_buffers

PostgreSQL 使用预写日志(WAL)确保数据的持久性;与 shared_buffers 作用类似,PostgreSQL 将 WAL 日志写入缓冲并且批量写入磁盘。

默认的 WAL 缓冲大小由 wal_buffers 参数进行设置,初始值为 4MB(shared_buffers 的 1/32)。WAL 缓冲区在每次事务提交时都会写入磁盘,因此过大的值并不会带来显着的性能提升。不过,对于大量并发的写入操作,适当增加该参数的值可以提高系统的性能。

修改 wal_buffers 的方式有两种,修改之后必须重启服务器才能生效:

  1. 修改配置文件 postgresql.conf;
  2. alter system set wal_buffers = 'xxx';,该命令会修改配置文件 postgresql.auto.conf。

effective_cache_size

effective_cache_size 参数为 PostgreSQL 提供了一个可供操作系统和数据库使用的缓存估值(考虑了操作系统自身和其他应用之后)。

该参数只是一个评估值,而不是实际的分配值;它仅用于 PostgreSQL 查询计划器判断索引的代价,越大的值越可能使用索引扫描,否则更可能使用表的顺序扫描。

effective_cache_size 默认值为 4 GB,保守估可以设置为是系统可用内存的 1/2。通常对于专用数据库服务器可以设置为系统总内存的 75%,可以根据特定的服务器工作负载进行调整。如果 effective_cache_size 设置过低,查询计划器可能会忽略某些索引,即使通过索引可以明显增加查询的性能。

通过操作系统的统计信息可以得到一个更好的估计值。对于 UNIX/LINUX 系统,将 free 或者 top 命令结果中的 free 加上 cached;对于 Windows 系统,查看任务管理器 Performance 页面中的“System Cache”。

修改 effective_cache_size 不需要重启服务器,通过以下方式修改之后执行pg_ctl reload或者SELECT pg_reload_conf();重新加载即可:

  1. 修改配置文件 postgresql.conf;
  2. alter system set effective_cache_size = 'xxx';,该命令会修改配置文件 postgresql.auto.conf。

work_mem

work_mem 参数用于复杂的排序操作,它决定了中间结果(例如哈希表)或者排序操作可以使用的最大内存。

如果设置了合适的 work_mem 值,大部分的排序操作都在内存中执行,而不需要使用磁盘存储临时结果。对于复杂的查询,可能会执行并发的排序或者哈希操作,每个操作都可以最多使用该参数设置的内存。另外,多个会话可能同时执行排序操作。因此,排序占用的总内存可能是 work_mem 的许多倍;work_mem 的值不能设置的过高,因为它可能导致内存使用瓶颈。

该参数的默认值为 4MB,支持从事务级别到命令行参数的各种修改方式。理想的方式是将全局的 work_mem 参数设置为一个较低的值,然后为具体的查询指定更大的值:

SET LOCAL work_mem = '256MB';
SELECT * FROM db ORDER BY LOWER(name);

涉及排序操作的 SQL 子句包括 ORDER BY、DISTINCT 以及排序合并连接(Sort Merge Join)。使用哈希表的操作包括哈希连接(Hash Join)、基于哈希的聚合以及基于哈希的 IN 子查询实现。

maintenance_work_mem

maintenance_work_mem 参数指定了日常维护操作允许占用的最大内存,例如 VACUUM、CREATE INDEX 以及 ALTER TABLE ADD FOREIGN KEY 等操作。

由于一个数据库会话同时只能执行一个维护操作,一般不会存在并发的维护操作;所以将该参数设置的比 work_mem 大很多也不会有问题,更大的维护内存还能够提高数据库清理和数据导入的性能。

唯一需要注意的是,如果启动了 autovacuum,可能会占用 autovacuum_max_workers(默认为 3)倍 work_mem 设置的内存。我们也可以为此设置单独的 autovacuum_work_mem 参数。

maintenance_work_mem 参数的默认值为 64MB,支持从事务级别到命令行参数的各种修改方式。

总结

调整服务器的配置参数通常是我们在安装 PostgreSQL 之后需要进行优化的第一步,本文介绍了如何进行参数的设置以及几个重要参数的作用和调整目标。PostgreSQL 提供了大量可以调整的参数,PGTune 工具给我们提供了一个很好的尝试起点,wiki.postgresql.org列出了最常见的几个参数优化;不过性能优化的关键是对工作负载进行基准测试并且和已知的基线进行比较。

另外,数据库的配置优化并不是优化的全部。例如,编写不当的查询语句可能无法通过调整参数解决性能问题;此时我们需要通过其他方式进行优化,比如利用索引或者修改查询的连接方式等。

相关推荐

# Python 3 # Python 3字典Dictionary(1)

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中,格式如...

Python第八课:数据类型中的字典及其函数与方法

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值...

Python中字典详解(python 中字典)

字典是Python中使用键进行索引的重要数据结构。它们是无序的项序列(键值对),这意味着顺序不被保留。键是不可变的。与列表一样,字典的值可以保存异构数据,即整数、浮点、字符串、NaN、布尔值、列表、数...

Python3.9又更新了:dict内置新功能,正式版十月见面

机器之心报道参与:一鸣、JaminPython3.8的热乎劲还没过去,Python就又双叒叕要更新了。近日,3.9版本的第四个alpha版已经开源。从文档中,我们可以看到官方透露的对dic...

Python3 基本数据类型详解(python三种基本数据类型)

文章来源:加米谷大数据Python中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在Python中,变量就是变量,它没有类型,我们所说的"类型"是变...

一文掌握Python的字典(python字典用法大全)

字典是Python中最强大、最灵活的内置数据结构之一。它们允许存储键值对,从而实现高效的数据检索、操作和组织。本文深入探讨了字典,涵盖了它们的创建、操作和高级用法,以帮助中级Python开发...

超级完整|Python字典详解(python字典的方法或操作)

一、字典概述01字典的格式Python字典是一种可变容器模型,且可存储任意类型对象,如字符串、数字、元组等其他容器模型。字典的每个键值key=>value对用冒号:分割,每个对之间用逗号,...

Python3.9版本新特性:字典合并操作的详细解读

处于测试阶段的Python3.9版本中有一个新特性:我们在使用Python字典时,将能够编写出更可读、更紧凑的代码啦!Python版本你现在使用哪种版本的Python?3.7分?3.5分?还是2.7...

python 自学,字典3(一些例子)(python字典有哪些基本操作)

例子11;如何批量复制字典里的内容2;如何批量修改字典的内容3;如何批量修改字典里某些指定的内容...

Python3.9中的字典合并和更新,几乎影响了所有Python程序员

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

Python3大字典:《Python3自学速查手册.pdf》限时下载中

最近有人会想了,2022了,想学Python晚不晚,学习python有前途吗?IT行业行业薪资高,发展前景好,是很多求职群里严重的香饽饽,而要进入这个高薪行业,也不是那么轻而易举的,拿信工专业的大学生...

python学习——字典(python字典基本操作)

字典Python的字典数据类型是基于hash散列算法实现的,采用键值对(key:value)的形式,根据key的值计算value的地址,具有非常快的查取和插入速度。但它是无序的,包含的元素个数不限,值...

324页清华教授撰写【Python 3 菜鸟查询手册】火了,小白入门字典

如何入门学习python...

Python3.9中的字典合并和更新,了解一下

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

python3基础之字典(python中字典的基本操作)

字典和列表一样,也是python内置的一种数据结构。字典的结构如下图:列表用中括号[]把元素包起来,而字典是用大括号{}把元素包起来,只不过字典的每一个元素都包含键和值两部分。键和值是一一对应的...

取消回复欢迎 发表评论:

请填写验证码