3.1.6 Burst I/O
Burst I/O 指的是云盘在一定时间内达到 IOPS 突发上限的能力,突发能力适用于云服务器的启动场景,如系统盘,若有持续突发能力,就能够大幅度地提升云服务器的启动速度。
Ceph RBD 设备突发能力的实现基于令牌桶。突发时,令牌的消耗速度大于令牌的生成速度,令牌的数量逐渐减少,最后 IOPS 会维持和桶生成令牌的速度一致,即达到 IOPS的上限,理论上:
可持续的突发时间 = 最初令牌桶中的令牌数 / ( 实际 I/O 请求的速度 - 令牌生成速度 )
然而实际上这样是无法控制突发速度的上限和突发时间的,这样的突发应该理解为可突发的 I/O 请求量,举例说明一下,如卷的上限 IOPS 设置为 1000 IOPS(令牌生成的速率),卷突发设置为 2000 IOPS,若实际 I/O 请求速度刚好也是 2000 IOPS,那么突发时长实际是 2s,而且实际 I/O 请求速度并没有得到限制,若实际请求速度到了 5000 IOPS,那么实际突发时长仅为 0.5s,即 0.5s 后请求速度就被稳定限制在 1000 IOPS。
为了解决上述问题,需要对令牌桶算法进行优化,将令牌桶的容量设置为 burst_second × burst,然后向该令牌桶中添加一个小桶(容量为 burst),以令牌生成速度(也即 IOPS 的上限速度)生成的令牌放入令牌桶中,令牌桶再将令牌以突发速度流入小桶中,请求总是从小桶中获取令牌。这样,当 burst_second > 1 时,RBD 设备可以获得持续的突发能力,突发上限值由小桶容量 burst 决定,突发持续时间由 burst_second 控制,这些参数都可以通过指令在线动态地去设置。下面举例说明一下。
(1)在线设置参数
设置前如图 3-25 所示。
图 3-25 参数设置前
rbd_qos_read_iops_burst :读 I/O 的突发限制。
rbd_qos_read_iops_burst_seconds :读 I/O 突发的持续时间。
rbd_qos_read_iops_limit :每秒读 I/O 限制。
设置后如图 3-26 所示。
图 3-26 参数设置后
将读 IOPS 限制设置为 1000,并将读 IOPS 突发设置为 5000,RBD 只能获得 2s 的突发级别 IOPS,然后维持限制级别。
(2)对比测试
设置前的测试结果如图 3-27 所示。
图 3-27 设置前的测试结果
设置后测试结果如图 3-28 所示。
图 3-28 设置后的测试结果
(3)测试结果分析
设置后的单卷读 IOPS 理论值计算公式如下。
iops = {rbd_qos_read_iops_burst_seconds * rbd_qos_read_iops_burst + (total_time_of_rand_read - rbd_qos_read_iops_burst_seconds) * rbd_qos_read_iops_limit} / total_time_of_rand_read
单卷随机读理论值:iops = (2 * 5000 + 98 * 1000)/100 = 1080
测试值:iops = 1097
结论:符合预期