前言

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

在计算机领域中,性能诊断等地方使用队列理论的案例也很多。服务器硬件分为动态设备和静态设备。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. YOLOV3目标检测模型训练实例

    YOLOV3目标检测 从零开始学习使用keras-yolov3进行图片的目标检测,比较详细地记录了准备以及训练过程,提供一个信号灯的目标检测模型训练实例,并提供相关代码与训练集. DEMO测试 YOL ...

  2. mktemp命令

    mktemp命令 mktemp命令用于安全地创建一个临时文件或目录,并输出其名称,TEMPLATE在最后一个组件中必须至少包含3个连续的X,如果未指定TEMPLATE,则使用tmp.XXXXXXXXX ...

  3. ORACLE ROLLUP和CUBE介绍

    http://blog.csdn.net/wanghai__/article/details/4817920 ------------------ ROLLUP,是GROUP BY子句的一种扩展,可以 ...

  4. Layui项目实战干货总结(精品)

    写代码时遇到的知识点拿出来分享. 1.layer弹出层显示在top顶层 // 监听工具条 table.on('tool(tb-book)', function (obj) { var data = o ...

  5. 【Android逆向】frida 破解 jwxdxnx02.apk

    apk 路径: https://pan.baidu.com/s/1cUInoi 密码:07p9 这题比较简单,主要是用于练习frida 1. 安装apk到手机 需要输入账号密码 2. 使用jdax 查 ...

  6. OpenCV开发笔记(六十):红胖子8分钟带你深入了解Harris角点检测(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  7. SSH 客户端

    简介 OpenSSH 的客户端是二进制程序 ssh.它在 Linux/Unix 系统的位置是/usr/local/bin/ssh. Linux 系统一般都自带 ssh,如果没有就需要安装. # Ubu ...

  8. CoaXPress 协议的CRC及其具体实现

    CoaXPress CRC 在CXP协议中,CRC用在stream packet和control packet中,用于指示数据是否错误,如果是control packet, device发现CRC错误 ...

  9. 以下总结了Java一些面试前准备和技术参考题,希望对你有所帮助

    以下真实模拟JAVA面试场景: 感谢您参加我们的面试: 以下是我们总结一些面试前准备和技术参考题,希望对你有所帮助. 首先,你需要先准备下工作相关的自我介绍,包括以下内容: 几年 Java 开发经验, ...

  10. 在Vue中使用Canvas绘制背景

    好家伙, 在vue中使用canvas绘制与在html中使用canvas绘制大致相同, 但又有所区别  法一(无图片资源): vue中canvas的使用 - 掘金 (juejin.cn) 找到canca ...