队列理论在PostgreSQL写WAL中的应用

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 队列理论在我们生活中的应用随处可见,例如机场、海关、银行甚至排队买菜。可以说,只要有排队的地方,就可以应用队列理论进行服务优化。 在计算机领域的架构设计,性能诊断等地方使用队列理论的案例也多不胜举。曾经培训的时候听到过,有牛人可以在不了解具体技术的情况下仅凭队列理论的知识就可以快速定位系统的瓶颈所在。拿一台服务器来讲,分为动态设备和静态设备。CPU和IO子系统属于动态设备,RAM属于静态设备,队列理论只对动态设备适用。今天不打算介绍队列理论的基础知识,而想讨论一下队列理论在PG数据库对于写WAL上的应用。 一个系统的响应时间由两部分决定,等
 队列理论在我们生活中的应用随处可见,例如机场、海关、银行甚至排队买菜。可以说,只要有排队的地方,就可以应用队列理论进行服务优化。



   在计算机领域的架构设计,性能诊断等地方使用队列理论的案例也多不胜举。曾经培训的时候听到过,有牛人可以在不了解具体技术的情况下仅凭队列理论的知识就可以快速定位系统的瓶颈所在。拿一台服务器来讲,分为动态设备和静态设备。CPU和IO子系统属于动态设备,RAM属于静态设备,队列理论只对动态设备适用。今天不打算介绍队列理论的基础知识,而想讨论一下队列理论在PG数据库对于写WAL上的应用。



   一个系统的响应时间由两部分决定,等待时间和服务时间。而这两部分时间又受到到达速率和服务速度的影响。这是队列最基本的因素。



   在PostgreSQL中,有一个参数叫做commit_delay,可以通过调整它在某些情况下来提升系统的吞吐量。按照官方文档,commit_delay定义了一个组提交领导进程(group commit leader process)在调用XLogFlush中获得锁后,需要睡眠多少微秒来让组提交跟随者进程(group commit followers)进行排队,这样其他事务的WAL也可以写入到WAL buffer中,在下一次被唤醒时组提交领导者进程便可以一次刷新多个事务的WAL到持久化的IO设备中,从而可以提升系统的总吞吐量。



   那么,这个参数的调整为什么可以在某些情况下提升系统的吞吐量?对于WAL写入来讲,等待时间是指一个提交请求到达但还没有被持久化到磁盘上的WAL段的时间,服务时间则是组提交领导者进程执行SYNC操作将WAL buffer持久到磁盘上WAL的时间。磁盘的响应时间在这里是服务速度,而系统的并发度,单位时间内的commit请求数则为到达速率。这里面有几种情况:

1、当到达速率很低,也就是并发度很低的情况下,IO设备的响应时间也就是服务速度虽然慢但能够应付得过来,并不需要做任何调整。整体的响应时间基本上就是IO设备的响应时间;

2、到达速率很低,也就是并发度很低的情况下,IO设备的响应时间很快,更加不需要做任何调整。整体的响应时间基本上就是IO设备的响应时间;

3、到达速率很高,系统并发度很高,IO子系统存在高延迟,手机游戏账号转让平台响应时间很长,服务速度很慢,很快就会造成需求积压。如果一个需求一个需求处理,则需求积压会越来越严重,事务延迟(等待时间)越来越长,导致系统吞吐量急剧下降。这种情况下,我们可以合并需求,将多个需求打包一起处理,减少和慢速IO子系统的交互次数,系统吞吐量得以上升。如果难以理解,大家不妨想一下乘坐机场摆渡车的情况。但是也要考虑不能合并过多需求,否则对于每个单一需求来讲,延迟可能会高得难以忍受;

4、到达速率很高,系统并发度很高,IO子系统延迟非常低,响应时间很快,例如使用的是SSD设备。这种情况下,需求不容易出现积压,不希望合并提交请求的情况经常发生,而更愿意获得对单一事务来讲更低的延迟;

   看来,commit_delay是针对后面两种情况来调整的。对于高延迟的IO子系统,希望能够尽量合并系统的提交请求来提升整体的吞吐量。一般来讲IO子系统的延迟越高,commit_delay可以设置得越长。但前面也提到过,要防止设得过高,否则会矫枉过正,导致系统吞吐量下降。对于低延迟的IO子系统,这个值可以设得低一些或者保留缺省值。



   此外,PostgreSQL还有另外一个参数配合,称为commit_siblings。这个参数用于控制commit_delay是否需要休眠。如果当前活动的事务少于commit_siblings,则commit_delay即算是非零值也不会进入休眠而且直接进行SYNC操作;反之则进入休眠状态,等待其他事务的提交请求进来进行合并。这也是一个侦测到达速率的机制,如果到达速率不高,属于前面的第1、2种情况,也就没有必要休眠等待了。对于慢速IO设备,我们希望合并的门槛低一些,尽可能地通过合并请求来提升吞吐量,所以commit_siblings可以设置得低一些;而对于低延迟高速IO设备,这个参数值可以设得高一些,使得合并没有这么容易发生。


附官方文档的一些建议:

1、在一些平台上,休眠最高的精度是10ms,所以在这些平台上,commit_delay设置1到10000的效果都是一样的;

2、在某些平台也可能导致休眠的时间稍长于commit_delay设置值;

3、如果需要设置commit_delay,建议以写入一个8k数据块平均时间的一半做为commit_delay的开始点;

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
6月前
|
存储 Oracle 关系型数据库
postgresql数据库|wal日志的开启以及如何管理
postgresql数据库|wal日志的开启以及如何管理
1120 0
|
关系型数据库 物联网 PostgreSQL
沉浸式学习PostgreSQL|PolarDB 11: 物联网(IoT)、监控系统、应用日志、用户行为记录等场景 - 时序数据高吞吐存取分析
物联网场景, 通常有大量的传感器(例如水质监控、气象监测、新能源汽车上的大量传感器)不断探测最新数据并上报到数据库. 监控系统, 通常也会有采集程序不断的读取被监控指标(例如CPU、网络数据包转发、磁盘的IOPS和BW占用情况、内存的使用率等等), 同时将监控数据上报到数据库. 应用日志、用户行为日志, 也就有同样的特征, 不断产生并上报到数据库. 以上数据具有时序特征, 对数据库的关键能力要求如下: 数据高速写入 高速按时间区间读取和分析, 目的是发现异常, 分析规律. 尽量节省存储空间
757 1
|
人工智能 关系型数据库 Serverless
阿里函数计算FC、文件存储NAS和RDS PostgreSQL的应用体验报告
本次体验的目的,旨在详细介绍如何通过阿里函数计算FC部署ChatGLM6B大语言模型,并借助文件存储NAS和RDS PostgreSQL搭建一个AI知识库问答应用,以实现PDF、TXT、HTML等文件和URL类型资料的轻松读取和处理。
302 62
|
6月前
|
SQL 关系型数据库 数据库
实时计算 Flink版产品使用合集之同步PostgreSQL数据时,WAL 日志无限增长,是什么导致的
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6月前
|
存储 JSON 关系型数据库
PostgreSQL Json应用场景介绍和Shared Detoast优化
PostgreSQL Json应用场景介绍和Shared Detoast优化
|
6月前
|
关系型数据库 数据库 PostgreSQL
Docker【应用 03】给Docker部署的PostgreSQL数据库安装PostGIS插件(安装流程及问题说明)
Docker【应用 03】给Docker部署的PostgreSQL数据库安装PostGIS插件(安装流程及问题说明)
365 0
|
6月前
|
关系型数据库 数据库 PostgreSQL
PostgreSQL【应用 01】使用Vector插件实现向量相似度查询(Docker部署的PostgreSQL安装pgvector插件说明)和Milvus向量库对比
PostgreSQL【应用 01】使用Vector插件实现向量相似度查询(Docker部署的PostgreSQL安装pgvector插件说明)和Milvus向量库对比
572 1
|
6月前
|
SQL 关系型数据库 C语言
PostgreSQL【应用 03】Docker部署的PostgreSQL扩展SQL之C语言函数(编写、编译、载入)计算向量余弦距离实例分享
PostgreSQL【应用 03】Docker部署的PostgreSQL扩展SQL之C语言函数(编写、编译、载入)计算向量余弦距离实例分享
91 0
|
6月前
|
SQL 关系型数据库 数据库
PostgreSQL【应用 02】扩展SQL之C语言函数(编写、编译、载入)实例分享
PostgreSQL【应用 02】扩展SQL之C语言函数(编写、编译、载入)实例分享
196 0
|
存储 关系型数据库 数据库
《PostgreSQL物化视图:创建、维护与应用》
《PostgreSQL物化视图:创建、维护与应用》
132 0
下一篇
无影云桌面