前言
队列理论在我们生活中的应用随处可见,例如我们去食堂打饭需要排队,我们生活中随处可见排队的场景。
在计算机领域中,性能诊断等地方使用队列理论的案例也很多。服务器硬件分为动态设备和静态设备。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 KingbaseESV8 KingbaseESV 参数 8Rkingbaseesv8r6 kingbaseesv8 kingbaseesv参数 kingbaseesv8r6 kingbaseesv8r6 kingbaseesv8 kingbaseesv权限 kingbaseesv8r6 kingbaseesv8 kingbaseesv kbbench kingbaseesv8r6 kingbaseesv8 kingbaseesv pageinspect kingbaseesv8r6全局kingbaseesv8 kingbaseesv kingbaseesv8r6 kingbaseesv8 kingbaseesv字母 kingbaseesv8r6 kingbaseesv8 kingbaseesv索引 末端kingbaseesv8r6 kingbaseesv8 kingbaseesv 使用率kingbaseesv8r6 kingbaseesv8 kingbaseesv