KingbaseESV8R6延迟提交参数
前言
队列理论在我们生活中的应用随处可见,例如我们去食堂打饭需要排队,我们生活中随处可见排队的场景。
在计算机领域中,性能诊断等地方使用队列理论的案例也很多。服务器硬件分为动态设备和静态设备。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延迟提交参数的更多相关文章
- Form 表单提交参数
今天因为要额外提交参数数组性的参数给form传到后台而苦恼了半天,结果发现,只需要在form表单对应的字段html空间中定义name = 后台参数名 的属性就ok了. 后台本来是只有模型参数的,但是后 ...
- Spark on Yarn:任务提交参数配置
当在YARN上运行Spark作业,每个Spark executor作为一个YARN容器运行.Spark可以使得多个Tasks在同一个容器里面运行. 以下参数配置为例子: spark-submit -- ...
- 关于 Ajax 提交参数格式,及返回类型json
function Login() { $.ajax({ //提交方式 type:&q ...
- android向web提交参数的4种方式总结,附带网站案例源码
第一种:基于http协议通过get方式提交参数 1.对多个参数的封装 public static String get_save(String name, String phone) { /** * ...
- java 、Android 提交参数转码问题
1.解决Android.JAVA.ajax提交中文.URL中文参数传递后的乱码问题的解决办法 2.JAVA 中URL链接中文参数乱码的处理方法 3.JAVA URL中带有中文时的处理 在提交参数的 ...
- Spring MVC url提交参数和获取参数
[转载:http://blog.csdn.net/mahoking] 普通URL提交参数 该格式url为:url.do?param1=mahc¶m2=8888.00 需 ...
- 延迟提交form
提交按钮延迟提交form表单 function a(){document.getElementById('form1').submit();}setTimeout(a,5000);
- 解决get方法提交参数中文乱码问题:
解决get方法提交参数中文乱码问题: 1找到你们的tomcat的目录 2在这个目录下面\tomcat61-32\tomcat61\conf 3找到server.xml ,用notepad打开(没有就下 ...
- 接口调用,输出结果为Json格式(ConvertTo-Json),提交参数给URL(WebRequest)
1.直接输出为json格式: Get-Process -Id $pid | ConvertTo-Json | clip.exe 2.自定义结果为json格式: $serverinfoj = @&quo ...
- url提交参数类
url提交参数类 type /// <summary> /// 准备url /// </summary> TynUrl = class private FUrl, FComma ...
随机推荐
- CSS实现图形效果
CSS实现图形效果 CSS实现正方形.长方形.圆形.半圆.椭圆.三角形.平行四边形.菱形.梯形.六角星.五角星.心形.消息框. 正方形 <section> <div id=" ...
- Fiddler捕获Java发送的HttpURLConnection请求
1.说明 平常使用Fiddler抓包工具查看浏览器的请求和响应信息很方便, 但有时候我们也需要拦截java代码执行的http请求. 以便更好的调试程序.具体方法如下: 2.编写Java代码 // 配置 ...
- Python之机器人卡牌
介绍 这个例子主要利用turtle库实现根据输入动态展示不同机器人的图像和属性信息. 代码部分非原创只是做了些许修改和整理使得更易阅读. 图片和文件资源请访问git仓库获取: https://gite ...
- Java Console类
用于从控制台设备读取字符信息,通常是文本和密码.尤其读取密码字符时是看不见的. 下面给出一个例子: import java.io.Console; /** * @author xusucheng * ...
- 【libGDX】ApplicationAdapter生命周期
1 前言 libGDX 中,用户自定义的渲染窗口需要继承 ApplicationAdapter 类,ApplicationAdapter 实现了 ApplicationListener 接口,但实 ...
- 【Android逆向】算法还原2
这题比较简单 1. app-release.apk 安装至手机 提示需要输入账号和密码 2. jadx 打开看看 public native boolean check(byte[] bArr, by ...
- iterables/generators/yield
iterables # 当你创建了一个列表,你可以一个一个的读取它的每一项,这叫做iteration: >>> mylist = [1,2,3] >>> for i ...
- go语言变量的零值和nil
Go语言中无论是全局变量还是局部变量,只要定义了一个变量都有默认的0值 int/int8/int16/int32/int64/uint/uint8/uint16/uint32/uint64/byte/ ...
- 【LeetCode链表#11】环形链表II(双指针)
环形链表II 力扣题目链接(opens new window) 题意: 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,使用整数 pos 来表示 ...
- Emqx高可用架构
目录 优化前架构 主要问题 haproxy问题 优化后架构 优化功能点 emq版本升级 linux系统调优 haproxy调优 测试工具 依赖安装 配置erl环境变量 安装压测软件 测试指令与结果展示 ...