高写入负载下的Postgres性能调优

2021/4/19 18:59:45

本文主要是介绍高写入负载下的Postgres性能调优,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

0、说明

随着数据库的数据量与之俱增,作为数据库管理员和系统管理员总是会遇到各种各样的麻烦。

通常,一些项目从小型的测试系统开始,然后被推广到大规模生产用途。由于这些系统收到的流量负载超出了其原始的概念验证范围,因此在Postgres日志中可能会观察到以下问题:

LOG:  checkpoints are occurring too frequently (9 seconds apart)
HINT:  Consider increasing the configuration parameter "max_wal_size".
LOG:  checkpoints are occurring too frequently (2 seconds apart)
HINT:  Consider increasing the configuration parameter "max_wal_size".

这是一个典型的例子,没有针对高写入负载进行适当调整。在这篇文章中,我们将讨论这意味着什么,此错误的一些可能原因,以及解决问题的一些相对简单的方法。

1、系统设置

首先,我们先查看系统设置,并简要讨论此错误的含义。
Postgres的日志中提到了两个特定的东西,检查点和max_wal_size。检查Postgres实例以观察与这两项有关的任何设置,我们看到以下内容:

[local]:5433 user@exampledb=# select name, setting from pg_settings where name like '%wal_size%' or name like '%checkpoint%' order by name;
            name             |  setting  
------------------------------+-----------
 checkpoint_completion_target | 0.9
 checkpoint_flush_after       | 32
 checkpoint_timeout           | 300
 checkpoint_warning           | 30
 log_checkpoints              | off
 max_wal_size                 | 1024
 min_wal_size                 | 80
(7 rows)

max_wal_size设置在自动检查点之间增长的最大预写式日志(WAL)量。这是一个软限制。在特殊情况下,例如负载很高的情况,失败的archive_command或较高的wal_keep_segments设置,WAL大小可能会超过max_wal_size。

还应注意,增加此参数可能会增加崩溃恢复所需的时间。默认值为1GB(1024 MB)。

通常情况下,PostgreSQL的默认配置值是保守的,以保证在大型服务器上和在资源受限的小型开发计算机上都能正常工作。因此,对于生成我们已经看到的错误消息的系统,在此观察到的max_wal_size的默认值可能太低。

2、找出问题

接下来,让我们看看为什么max_wal_size的这个值设置低了可能与问题原因有关。

显然,此问题的确切原因需要具体问题具体分析,但通常来说,当max_wal_size值较低且数据库具有大量更新或快速插入的情况时,生成WAL的速度往往会比其归档速度快,并且比标准检查点流程可以跟上的速度更快。

因此,如果您在Postgres实例上监视磁盘使用情况(应该这样做),您可能还会注意到pg_wal目录的大小急剧增加,因为保留了这些WAL文件。

和max_wal_size相关的还有一个与之相反的参数:min_wal_size。 min_wal_size参数定义缩小WAL的最小大小。只要在归档时WAL磁盘使用率保持在此设置以下,旧的WAL文件将始终在检查点回收以备将来使用,而不是删除。这对于确保保留足够的WAL空间来处理WAL使用率的峰值很有用,例如在运行大型批处理作业时。默认值为80 MB。

3、解决方法

PostgreSQL在日志文件中有帮助地告知我们应该怎么做:增加max_wal_size。

因此,根据建议,编辑实例配置文件以增加max_wal_size值以匹配系统的工作负载。

对于大多数使用情况,理想的值是增加max_wal_size的值,以使其至少可以保存一小时的日志。但是,这里的警告是,您不想将此值设置得很高,因为它会增加崩溃恢复所需的时间。如果需要,还可以增加min_wal_size,以便系统可以处理批处理作业和其他异常情况下WAL使用量的峰值。在进行了适当的配置更改并重新加载Postgres之后,我们可以像预期的那样验证是否应用了新设置:

            name             |  setting  
------------------------------+-----------
 checkpoint_completion_target | 0.9
 checkpoint_flush_after       | 32
 checkpoint_timeout           | 300
 checkpoint_warning           | 30
 log_checkpoints              | off
 max_wal_size                 | 16384
 min_wal_size                 | 4096
(7 rows)
 

有了这些新设置,并仔细监视了日志文件和系统使用情况,将诸如此类的由于系统从开发环境扩展到生产环境所遇到的问题就越来越少了。

参考链接:https://info.crunchydata.com/blog/tuning-your-postgres-database-for-high-write-loads



这篇关于高写入负载下的Postgres性能调优的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程