PostgreSQL checkpoint 相关参数优化设置与解释

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

标签

PostgreSQL , checkpoint , IO HANG


背景

数据库的检查点相关参数如何配置,能让数据库运行更加顺滑?

内存、磁盘能力如何搭配,能发挥更好的性能?

OS的参数如何设置,能尽可能的降低大内存机器带来的IO风暴问题?

数据库检查点设置

假设服务器内存是512GB。磁盘顺序、随机写吞吐是2 GB/s。

1、经验值

shared_buffers = 128GB                  # 1/4 内存  
  
checkpoint_timeout = 30min              # range 30s-1d  
  
max_wal_size = 256GB          # 2*shared_buffers  
min_wal_size = 64GB           # shared_buffers * 1/2  
  
checkpoint_completion_target = 0.9     # checkpoint target duration, 0.0 - 1.0  

这里还没有考虑磁盘的读写能力。

因此可能经验值配置的参数会导致一些性能问题。

我们根据上面的设置,来计算一下数据库发生检查点时到底会产生多少IO。

1、以极端为例进行讲解。假设shared buffer所有页都是脏页。

那么有128 GB脏页。

另外两个参数控制平滑刷脏页的调度:

2、30分钟*0.9 的时间窗口内,要刷完所有脏页。也就是说超过时间后,CKPT进程会全速刷脏页,checkpoint进程不进行任何sleep。

3、在新产生 256GB * 0.9 的WAL一个周期内,要刷完所有脏页。也就是检查点开始后,产生的WAL如果超过了,CKPT进程会全速刷脏页,checkpoint进程不进行任何sleep。

开销计算

1、刷脏页开销,属于离散IO。

平均值: 128GB / (30600.9) = 80.9 MB/s

(实际是sleep调度的,峰值可能还会更高一些) 。 物理写。

2、业务产生的写WAL开销,属于顺序IO。

最大平均值: 256GB / (30*60) = 145.6 MB/s

(实际是sleep调度的,峰值可能还会更高一些) 。 物理写。

3、业务上写操作除了产生WAL,还有bgwriter(异步WRITER) 。 异步写。

最大平均值: 256GB / (30*60) = 145.6 MB/s (因为一个块可能被多次修改,但是writer此时可能更少) 。

4、操作系统merge IO(写bgwriter的DIRTY PAGE),离散大块IO。 物理写。

最大平均值: 256GB / (30*60) = 145.6 MB/s

因此最糟糕的情况下,以上述配置为例,检查点期间,数据库写操作吞吐均值可能是 80.9 MB/s + 145.6 MB/s + 145.6 MB/s = 372.1 MB/s。

这个值,结合磁盘能力,可以判断检查点是否会有磁盘瓶颈。

建议设置

由于业务上还需要读写磁盘,同时PG目前的版本还需要垃圾回收,FREEZE等会产生IO的操作。因此不能让计算得到的峰值与磁盘实际IO能力相当,应该有所保留。

1、磁盘IOPS指标,写吞吐。(假设给25%用作 刷脏离散写、WAL顺序写)

2、如果按经验参数,评估出来磁盘能力不足(检查点实际需要的IO能力,与磁盘厂商给出的IO能力的25%不匹配),怎么办?

首先调大checkpoint_timeout参数,如果到最大值(1 DAY),依旧无法满足,则需要降低shared_buffers,以及相应的max_wal_size。

3、建议设置 log_checkpoints=on , 可以评估checkpoint的统计信息,用于帮助修正以上参数。

操作系统刷脏页设置

大内存机器,LINUX可能会遇到IO HANG的问题,原因也是刷脏页的配置不正确。

LINUX也有刷脏页的内核配置,默认是一个百分比,10%的脏页,后台进程开始刷脏页。如果产生脏页过快,到达20%时,用户进程也会帮助刷脏页。

因此如果内存越大,这个阈值就越大,而如果磁盘能力没有跟上,可能一次性会刷几十GB的脏页,导致磁盘的IO能力打爆,影响正常业务。

相关参数

1、os 内核参数

vm.dirty_background_bytes = 409600000  
vm.dirty_background_ratio = 0  
vm.dirty_bytes = 0  
vm.dirty_expire_centisecs = 3000  
vm.dirty_ratio = 95  
vm.dirty_writeback_centisecs = 100  

2、数据库参数

shared_buffers = 8GB                    # min 128kB  
                                        # (change requires restart)  
  
# - Checkpoints -  
  
#checkpoint_timeout = 5min              # range 30s-1d  
#max_wal_size = 1GB  
#min_wal_size = 80MB  
#checkpoint_completion_target = 0.5     # checkpoint target duration, 0.0 - 1.0  
#checkpoint_flush_after = 256kB         # measured in pages, 0 disables  
#checkpoint_warning = 30s               # 0 disables  

小结

为了尽量的降低数据库检查点带来的IO突增,影响业务。应该根据磁盘IO能力来修正检查点设置的经验值,避免IO HANG的问题。

同时OS层面的道理也一样,要设置好对应的OS刷脏页的调度参数。

参考

《DBA不可不知的操作系统内核参数》

《PostgreSQL 检查点性能影响及源码分析 - 7》

《PostgreSQL 检查点性能影响及源码分析 - 6》

《PostgreSQL 检查点性能影响及源码分析 - 5》

《PostgreSQL 检查点性能影响及源码分析 - 4》

《PostgreSQL 检查点性能影响及源码分析 - 3》

《PostgreSQL 检查点性能影响及源码分析 - 2》

《PostgreSQL 检查点性能影响及源码分析 - 1》

《PostgreSQL 9.6 检查点柔性优化(SYNC_FILE_RANGE) - 在单机多实例下的IO Hang问题浅析与优化》

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
1月前
|
DataWorks Java 关系型数据库
DataWorks常见问题之将预警信息发送至邮箱
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
34 1
|
6月前
|
SQL 关系型数据库 测试技术
沉浸式学习PostgreSQL|PolarDB 20: 学习成为数据库大师级别的优化技能
在上一个实验《沉浸式学习PostgreSQL|PolarDB 19: 体验最流行的开源企业ERP软件 odoo》 中, 学习了如何部署odoo和polardb|pg. 由于ODOO是非常复杂的ERP软件, 对于关系数据库的挑战也非常大, 所以通过odoo业务可以更快速提升同学的数据库优化能力, 发现业务对数据库的使用问题(如索引、事务对锁的运用逻辑问题), 数据库的代码缺陷, 参数或环境配置问题, 系统瓶颈等.
761 1
|
5月前
|
缓存 关系型数据库 数据库
PostgreSQL技术大讲堂 - 第32讲:数据库参数调整
从零开始学PostgreSQL技术大讲堂 - 第32讲:数据库参数调整
446 2
|
4月前
|
SQL 关系型数据库 数据库
postgresql数据库修改参数的方式
在PostgreSQL数据库中,你可以通过多种方式修改数据库参数,以更改其行为。以下是一些常见的修改数据库参数的方式: 1. **通过配置文件修改(postgresql.conf):** PostgreSQL的配置文件是 `postgresql.conf`。你可以直接编辑该文件,找到要修改的参数,修改其值,然后重新启动PostgreSQL服务以使更改生效。 通常,`postgresql.conf` 文件位于 PostgreSQL 数据目录下。修改完毕后,确保重新启动 PostgreSQL 服务。 2. **使用 ALTER SYSTEM 命令:** PostgreSQL
101 1
|
17天前
|
存储 JSON 关系型数据库
PostgreSQL Json应用场景介绍和Shared Detoast优化
PostgreSQL Json应用场景介绍和Shared Detoast优化
|
2月前
|
关系型数据库 Java 分布式数据库
PolarDB for PostgreSQL参数问题之参数删除失败如何解决
PolarDB for PostgreSQL是基于PostgreSQL开发的一款云原生关系型数据库服务,它提供了高性能、高可用性和弹性扩展的特性;本合集将围绕PolarDB(pg)的部署、管理和优化提供指导,以及常见问题的排查和解决办法。
|
3月前
|
弹性计算 关系型数据库 数据库
开源PostgreSQL在倚天ECS上的最佳优化实践
本文基于倚天ECS硬件平台,以自顶向下的方式从上层应用、到基础软件,再到底层芯片硬件,通过应用与芯片的硬件特性的亲和性分析,实现PostgreSQL与倚天芯片软硬协同的深度优化,充分使能倚天硬件性能,帮助开源PostgreSQL应用实现性能提升。
|
3月前
|
关系型数据库 分布式数据库 数据库
如何为PolarDB数据库设置透明数据加密(TDE)
如何为PolarDB数据库设置透明数据加密(TDE) 透明数据加密(TDE,Transparent Data Encryption)是PolarDB数据库提供的一种实时I/O加密和解密功能,数据在写入磁盘之前进行加密,从磁盘读入内存时进行解密,而不会增加数据文件的大小。开发人员无需更改任何应用程序,即可使用TDE功能。
57 3
|
3月前
|
关系型数据库 网络安全 分布式数据库
如何为PolarDB数据库设置SSL加密以提高链路安全性
如何为PolarDB数据库设置SSL加密以提高链路安全性 为了保障网络安全,提高链路安全性,您可以为PolarDB数据库启用SSL(Secure Sockets Layer)加密,并安装SSL CA证书到相关的应用服务。SSL在传输层对网络连接进行加密,能提升通信数据的安全性和完整性,但可能会增加网络连接响应时间。
54 2
|
3月前
|
弹性计算 关系型数据库 MySQL
设置PolarDB MySQL版集群IP白名单教程
设置PolarDB MySQL版集群IP白名单教程 内容: 在创建PolarDB MySQL版数据库集群后,为了保证集群的安全性,您需要设置集群的IP白名单。只有添加到白名单中的IP地址或安全组中的ECS实例才能访问该集群。本文将详细介绍如何设置IP白名单。
119 2

相关产品

  • 云原生数据库 PolarDB