searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Postgresql数据库调优

2023-08-17 07:06:57
121
0

       本文仅讨论主机的全部资源分配给单个集群使用的场景下,Postgresql配置的调优。如果主机上部署多个集群,需要根据实际情况适当调整配置参数。

一、通用配置

参数 说明 建议值
shared_buffers 共享缓冲区大小。Postgresql对数据操作时都要先将数据从磁盘读取到内存中,然后进行更新,最后再将数据写回磁盘。shared_buffers的功能就是用于存放从磁盘读取的数据。 系统物理内存的25%~30%
effective_cache_size 优化器假设一个查询可以使用的最大内存(包括Postgresql使用的和操作系统缓存),和shared_buffer等内存无关,只是给优化器生成计划使用的一个假设值。 系统内存的75%
maintenance_work_mem 维护工作内存,主要是针对数据库的维护操作或者语句。尽量的将这些操作在内存中进行。主要针对VACUUM,CREATE INDEX,REINDEX等操作。在对整个数据库进行VACUUM或者较大的index进行重建时,适当的调整该参数非常必要 系统内存的1/16,最大2G即可
work_mem 声明内部排序和哈希操作可使用的工作内存大小。对于复杂查询,提高这个值可能会带来明显的性能提升。这个内存大小是给每个连接单独分配的

OLTP:2MB

OLAP:可以适度调大

max_connections 最大连接数。work_mem * max_connections 可以估算最大连接数时所需的内存量。因而针对特定场景,可以适度调小max_connections,调大work_mem或相反  
max_worker_processes  最大后台进程数 CPU线程数
max_parallel_workers 并行查询的最大进程数 CPU线程数
max_parallel_workers_per_gather 并发查询时,单个gather节点可以使用的最大进程数

OLTP:CPU线程数/2,最大4即可

OLAP:CPU线程数/2

max_parallel_maintenance_workers 维护命令(vacuum或索引相关的命令)最大的后台进程数 CPU线程数/2,最大4即可

 

二、IO配置

磁盘IO相关的参数,主要有两个参数可以调优
  1). random_page_cost: 执行计划成本估算的参数,用于随机访问磁盘页的代价,默认值是4。顺序磁盘页访问的代价seq_page_cost=1.0。这个默认配置是针对机械硬盘的。针对更快速的存储(如SSD),可以适当调小这个值,使得执行计划更倾向于使用索引。

  2). effective_io_concurrency:同时执行IO操作的数量。 默认值是1。 针对更快速的存储(如SSD),可以适当调大这个值以获取更好的IO性能。

2.1 机械硬盘

参数 建议值
random_page_cost 4
effective_io_concurrency 2

 

2.2 固态硬盘

参数 建议值 调优建议
random_page_cost 1.0~2.0 可以全局,也可以只针对表空间优化
effective_io_concurrency 200 可以全局,也可以只针对表空间优化
bgwriter_delay  10ms 数据都存储在SSD盘的情况
bgwriter_lru_maxpages 1000 数据都存储在SSD盘的情况
bgwriter_lru_multiplier 10.0 数据都存储在SSD盘的情况
bgwriter_flush_after 0 数据都存储在SSD盘的情况
backend_flush_after 0 数据都存储在SSD盘的情况
checkpoint_flush_after 0 数据都存储在SSD盘的情况
wal_writer_delay 1ms pg_wal目录(即数据目录)在SSD盘的情况
wal_writer_flush_after 0 pg_wal目录(即数据目录)在SSD盘的情况

 

三、WAL日志配置

WAL(Write Ahead Log)日志保证数据库异常场景不可用时,重启后也可从WAL恢复数据,保证数据不丢失。

参数 说明 建议值
max_wal_size WAL日志的最大容量,根据存储的大小可以适度调整 200GB
checkpoint_timeout 系统自动执行checkpoint之间的最大时间间隔 1h
wal_keep_segments 至少保存的WAL日志数量,用于备库同步  
checkpoint_completion_target checkpoint刷盘的时间,越大说明刷盘的时间更长,期间对IO的性能影响越低 0.9

      Postgresql为了保证性能,会同步写入WAL和异步写入数据文件。但为了数据的可靠性,会执行checkpoint命令,把数据文件刷盘。checkpoint命令会占用不少IO资源,可能导致期间数据库性能下降。因而通过配置减少checkpoint的次数来提升性能。

     checkpoint触发的机制:1)接收到 checkpoint命令 2)数据库正常停止的时候 3)WAL日志在上次checkpoint后,写入量达到了max_wal_size 4)离上次checkpoint达到了checkpoint_timeout时间

# 四、场景优化

默认配置一般针对OLTP的场景进行。针对特定的场景也有一些优化的策略。

4.1 OLAP场景

参数 建议值
work_mem 1GB,或适当更大的值
max_connections 200, 减少连接数,使得每个连接分配到更多的work_mem
default_statistics_target 500 ,用于更精细分析值的分布,可以获取更好的执行计划
max_parallel_workers_per_gather CPU线程数/2

4.2 数据割接场景

针对大量数据全量导入场景(割接),可以采用将同步策略设为异步,再把备库都停了,只用单节点导数的方式进行。导数完毕后,再重做备库。

针对这种场景,可以调低数据安全相关参数,以提升写入数据的性能。

下面参数是针对单节点导数的优化配置,修改后需重启:

参数 建议值
wal_level  minimal
archive_mode off
max_wal_senders 0
fsync off
synchronous_commit off
full_page_writes off
wal_log_hints off
checkpoint_timeout 1d
max_wal_size 根据磁盘空间,可以设置更大的值

以上参数仅用于大量数据导入场景。割接完毕后,请务必把参数值改回原来的,并且重启Postgresql(wal_level,archive_mode等参数需要重启才能生效)。最后重做备库。

0条评论
作者已关闭评论
黄****成
2文章数
0粉丝数
黄****成
2 文章 | 0 粉丝
黄****成
2文章数
0粉丝数
黄****成
2 文章 | 0 粉丝
原创

Postgresql数据库调优

2023-08-17 07:06:57
121
0

       本文仅讨论主机的全部资源分配给单个集群使用的场景下,Postgresql配置的调优。如果主机上部署多个集群,需要根据实际情况适当调整配置参数。

一、通用配置

参数 说明 建议值
shared_buffers 共享缓冲区大小。Postgresql对数据操作时都要先将数据从磁盘读取到内存中,然后进行更新,最后再将数据写回磁盘。shared_buffers的功能就是用于存放从磁盘读取的数据。 系统物理内存的25%~30%
effective_cache_size 优化器假设一个查询可以使用的最大内存(包括Postgresql使用的和操作系统缓存),和shared_buffer等内存无关,只是给优化器生成计划使用的一个假设值。 系统内存的75%
maintenance_work_mem 维护工作内存,主要是针对数据库的维护操作或者语句。尽量的将这些操作在内存中进行。主要针对VACUUM,CREATE INDEX,REINDEX等操作。在对整个数据库进行VACUUM或者较大的index进行重建时,适当的调整该参数非常必要 系统内存的1/16,最大2G即可
work_mem 声明内部排序和哈希操作可使用的工作内存大小。对于复杂查询,提高这个值可能会带来明显的性能提升。这个内存大小是给每个连接单独分配的

OLTP:2MB

OLAP:可以适度调大

max_connections 最大连接数。work_mem * max_connections 可以估算最大连接数时所需的内存量。因而针对特定场景,可以适度调小max_connections,调大work_mem或相反  
max_worker_processes  最大后台进程数 CPU线程数
max_parallel_workers 并行查询的最大进程数 CPU线程数
max_parallel_workers_per_gather 并发查询时,单个gather节点可以使用的最大进程数

OLTP:CPU线程数/2,最大4即可

OLAP:CPU线程数/2

max_parallel_maintenance_workers 维护命令(vacuum或索引相关的命令)最大的后台进程数 CPU线程数/2,最大4即可

 

二、IO配置

磁盘IO相关的参数,主要有两个参数可以调优
  1). random_page_cost: 执行计划成本估算的参数,用于随机访问磁盘页的代价,默认值是4。顺序磁盘页访问的代价seq_page_cost=1.0。这个默认配置是针对机械硬盘的。针对更快速的存储(如SSD),可以适当调小这个值,使得执行计划更倾向于使用索引。

  2). effective_io_concurrency:同时执行IO操作的数量。 默认值是1。 针对更快速的存储(如SSD),可以适当调大这个值以获取更好的IO性能。

2.1 机械硬盘

参数 建议值
random_page_cost 4
effective_io_concurrency 2

 

2.2 固态硬盘

参数 建议值 调优建议
random_page_cost 1.0~2.0 可以全局,也可以只针对表空间优化
effective_io_concurrency 200 可以全局,也可以只针对表空间优化
bgwriter_delay  10ms 数据都存储在SSD盘的情况
bgwriter_lru_maxpages 1000 数据都存储在SSD盘的情况
bgwriter_lru_multiplier 10.0 数据都存储在SSD盘的情况
bgwriter_flush_after 0 数据都存储在SSD盘的情况
backend_flush_after 0 数据都存储在SSD盘的情况
checkpoint_flush_after 0 数据都存储在SSD盘的情况
wal_writer_delay 1ms pg_wal目录(即数据目录)在SSD盘的情况
wal_writer_flush_after 0 pg_wal目录(即数据目录)在SSD盘的情况

 

三、WAL日志配置

WAL(Write Ahead Log)日志保证数据库异常场景不可用时,重启后也可从WAL恢复数据,保证数据不丢失。

参数 说明 建议值
max_wal_size WAL日志的最大容量,根据存储的大小可以适度调整 200GB
checkpoint_timeout 系统自动执行checkpoint之间的最大时间间隔 1h
wal_keep_segments 至少保存的WAL日志数量,用于备库同步  
checkpoint_completion_target checkpoint刷盘的时间,越大说明刷盘的时间更长,期间对IO的性能影响越低 0.9

      Postgresql为了保证性能,会同步写入WAL和异步写入数据文件。但为了数据的可靠性,会执行checkpoint命令,把数据文件刷盘。checkpoint命令会占用不少IO资源,可能导致期间数据库性能下降。因而通过配置减少checkpoint的次数来提升性能。

     checkpoint触发的机制:1)接收到 checkpoint命令 2)数据库正常停止的时候 3)WAL日志在上次checkpoint后,写入量达到了max_wal_size 4)离上次checkpoint达到了checkpoint_timeout时间

# 四、场景优化

默认配置一般针对OLTP的场景进行。针对特定的场景也有一些优化的策略。

4.1 OLAP场景

参数 建议值
work_mem 1GB,或适当更大的值
max_connections 200, 减少连接数,使得每个连接分配到更多的work_mem
default_statistics_target 500 ,用于更精细分析值的分布,可以获取更好的执行计划
max_parallel_workers_per_gather CPU线程数/2

4.2 数据割接场景

针对大量数据全量导入场景(割接),可以采用将同步策略设为异步,再把备库都停了,只用单节点导数的方式进行。导数完毕后,再重做备库。

针对这种场景,可以调低数据安全相关参数,以提升写入数据的性能。

下面参数是针对单节点导数的优化配置,修改后需重启:

参数 建议值
wal_level  minimal
archive_mode off
max_wal_senders 0
fsync off
synchronous_commit off
full_page_writes off
wal_log_hints off
checkpoint_timeout 1d
max_wal_size 根据磁盘空间,可以设置更大的值

以上参数仅用于大量数据导入场景。割接完毕后,请务必把参数值改回原来的,并且重启Postgresql(wal_level,archive_mode等参数需要重启才能生效)。最后重做备库。

文章来自个人专栏
文章 | 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0