前言

队列理论在我们生活中的应用随处可见,例如我们去食堂打饭需要排队,我们生活中随处可见排队的场景。

在计算机领域中,性能诊断等地方使用队列理论的案例也很多。服务器硬件分为动态设备和静态设备。CPU和IO子系统属于动态设备,RAM属于静态设备,队列理论只对动态设备适用。

KingbaseES数据库中遇到的队列理论

一个数据库系统的响应时间(DBTIME)由两部分决定,前台进程非空闲等待时间和cpu时间。而这两部分花费时间又受到并发和IO响应速度的影响。这是队列最基本的因素。

如下图,KingbaseESV8R6在kwr报告中有一个等待事件叫walsync,它等待wal日志同步到磁盘。我们经常碰到的业务场景是,当commit次数太多,导致wal日志产生的IO频繁的被写入到磁盘,那么这个walsync等待事件可能会花费大量数据库时间。

那我们就要用到队列理论分析这个过程。我们知道,wal日志是顺序记录的,不能被打乱顺序,日志保持连续性,不能缺失某个日志,这些都出于数据库安全考虑。所以wal日志写入也需要一个个日志的顺序落盘。

这个过程会生成很多小而频繁的IO落盘,而吞吐量很小。

在KingbaseES中,有一个参数叫做commit_delay,可以通过调整它来提升系统的吞吐量。按照官方文档,commit_delay定义了一个组提交领导进程(group commit leader process)在调用XLogFlush中获得锁后,需要睡眠多少微秒来让组提交跟随者进程(group commit followers)进行排队,这样其他事务也写入到WAL buffer中,在下一次被唤醒时组提交领导者进程便可以一次刷新多个事务的WAL日志持久化到磁盘,这样一次IO可以flush多条wal日志到磁盘,从而可以提升系统的总吞吐量。吞吐量指的是磁盘每秒读写的数据量大小,例如写入速度是200mb/s。

按照这个理论思考是可以一定程度上缓解数据库等待事件walsync。

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

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

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

IO设备的响应时间取决于存储的性能。

3.当并发度很高时,IO子系统存在高延迟,响应时间很长,服务速度很慢,很快就会造成需求积压(commit频繁)。如果一个需求一个需求处理,则需求积压会越来越严重,事务延迟(等待时间)越来越长,导致系统吞吐量急剧下降。这种情况,我们可以用上面提到的参数合并提交需求,将多个需求打包一起处理,减少和慢速IO子系统的交互次数,使队列变小,系统吞吐量得以上升。

举个例子方便大家理解,机场办理登机牌时候,排很长的队,大家需要一个一个排队办理,使用合并提交需求相当于打包几个办理登机牌的人,同时一次性办理成功。

4.当并发度很高时,IO子系统延迟非常低,响应时间很快,例如使用的是SSD设备。这种情况下,需求不容易出现日志积压,可以不使用合并提交请求,这仍然属于单一事务提交处理,更低IO的延迟,可是一旦遇到大量提交操作,恐怕磁盘性能也未必撑得住,例如并发万次提交的量级;

commit_delay是针对后面两种情况来调整的,也就是高并发的情况,对于高延迟的IO子系统,希望能够尽量合并系统的提交请求来提升整体的吞吐量。一般来讲IO子系统的延迟越高,commit_delay可以设置得越大。对于低延迟的IO系统,这个值可以设得低一些。

此外,KingbaseES还有另外一个参数配合使用,称为commit_siblings。这个参数作用是达到多少并发活跃事务数,commit_delay需要休眠。

如果当前活动的事务少于commit_siblings,则commit_delay即使是非零值也不会进入休眠而且直接进行SYNC操作;

反之则进入休眠状态,等待其他事务的提交请求进来进行合并。这也是一个侦测到达速率的机制,如果并发度不高,属于前面的第1、2种情况,也就没有必要休眠等待了。对于慢速IO设备,我们希望合并的门槛低一些,尽可能地通过合并请求来提升吞吐量,所以commit_siblings可以设置得低一些;而对于低延迟高速IO设备,这个参数值可以设得高一些,使得合并没有这么容易发生。吞吐量也变得高一些。

KingbaseESV8R6延迟提交参数的更多相关文章

  1. Form 表单提交参数

    今天因为要额外提交参数数组性的参数给form传到后台而苦恼了半天,结果发现,只需要在form表单对应的字段html空间中定义name = 后台参数名 的属性就ok了. 后台本来是只有模型参数的,但是后 ...

  2. Spark on Yarn:任务提交参数配置

    当在YARN上运行Spark作业,每个Spark executor作为一个YARN容器运行.Spark可以使得多个Tasks在同一个容器里面运行. 以下参数配置为例子: spark-submit -- ...

  3. 关于 Ajax 提交参数格式,及返回类型json

    function Login() {                   $.ajax({                           //提交方式               type:&q ...

  4. android向web提交参数的4种方式总结,附带网站案例源码

    第一种:基于http协议通过get方式提交参数 1.对多个参数的封装 public static String get_save(String name, String phone) { /** * ...

  5. java 、Android 提交参数转码问题

    1.解决Android.JAVA.ajax提交中文.URL中文参数传递后的乱码问题的解决办法  2.JAVA 中URL链接中文参数乱码的处理方法  3.JAVA URL中带有中文时的处理 在提交参数的 ...

  6. Spring MVC url提交参数和获取参数

    [转载:http://blog.csdn.net/mahoking] 普通URL提交参数         该格式url为:url.do?param1=mahc&param2=8888.00 需 ...

  7. 延迟提交form

    提交按钮延迟提交form表单 function a(){document.getElementById('form1').submit();}setTimeout(a,5000);

  8. 解决get方法提交参数中文乱码问题:

    解决get方法提交参数中文乱码问题: 1找到你们的tomcat的目录 2在这个目录下面\tomcat61-32\tomcat61\conf 3找到server.xml ,用notepad打开(没有就下 ...

  9. 接口调用,输出结果为Json格式(ConvertTo-Json),提交参数给URL(WebRequest)

    1.直接输出为json格式: Get-Process -Id $pid | ConvertTo-Json | clip.exe 2.自定义结果为json格式: $serverinfoj = @&quo ...

  10. url提交参数类

    url提交参数类 type /// <summary> /// 准备url /// </summary> TynUrl = class private FUrl, FComma ...

随机推荐

  1. 《.NET物联网从零开始系列》-开篇

    近日搞硬件网关时,那些残存的数电.模电和通信原理的记忆时常在脑海中萦绕: 想起来多年前看张高兴的博客学会了.netcore+树莓派进行物联网开发. 使用dragonboard(龙板)搭载windows ...

  2. EXPLAIN命令

    EXPLAIN命令   除了以SELECT开头的查询语句,其余的DELETE.INSERT.REPLACE以及UPDATE语句前边都可以加上EXPLAIN这个词儿,用来查看这些语句的执行计划   Ty ...

  3. 【Android 逆向】r0zapataNative.apk 破解

    1. apk 安装到手机,需要输入内容,随便输入,提示fail... 2. apk 导入到jadx中查看一下 MainActivity.java String textData = "b2F ...

  4. 项目实战:Qt+OSG三维2D文字实时效果查看工具

    需求   OSG三维中2D文字的基本属性较多,方便实时查看效果,并出对应文本代码.   Demo      工具下载地址   CSDN免积分下载地址:https://download.csdn.net ...

  5. ASP.NET XML序列化

    整理一下ASP.NET里面如何序列化实体为XML,获取解析XML内容为实体. 第一步要添加程序集引用,项目-->引用-->鼠标右键-->添加引用-->选择程序集-->Sy ...

  6. 【Java复健指南07】OOP中级02-重写与多态思想

    前情提要:https://www.cnblogs.com/DAYceng/category/2227185.html 重写 注意事项和使用细节 方法重写也叫方法覆法,需要满足下面的条件 1.子类的方法 ...

  7. 【Azure 应用服务】App Server 部署后,Docker报错,找不到8080端口

    问题描述 App Service for Container.  Docker Image 推送到ACR(向 Azure 容器注册表), 配置App Service并部署成功了.查看Docker日志( ...

  8. 【Filament】材质系统

    1 前言 ​ 本文主要介绍 Filament 的材质系统,官方介绍详见 → Filament Materials Guide.材质系统中会涉及到一些空间和变换的知识点,可以参考:[Unity3D]空间 ...

  9. ClickHouse学习笔记--ClickHouse的整体特性

    本文主要包含如下内容: ClickHouse适用场景 ClickHouse缺点 ClickHouse优点 ClickHouse表引擎-合并树 ClickHouse表引擎-合并树-稀疏索引 ClickH ...

  10. Java interface 接口的使用 implements 实现----

    1 package com.bytezreo.interfacetest; 2 3 /** 4 * 5 * @Description interface 接口的使用 implements 实现---- ...