优化原理
bcache盘在writeback缓存模式下,bucket中既缓存未命中缓存的读数据,又缓存脏数据,在读多写少的场景下,当一个bucket被填满时,可能大部分都是干净的读数据,只有少量的脏数据,干净bucket消耗较快,容易出现写性能降级问题。
为了解决这个问题,我们对bcache的bucket分配方法进行了优化。如下图所示,改进后的分配方法新增加了一个回写活跃bucket查询链表,当有新数据需要缓存时,首先判断是否writeback操作,若是writeback操作则从回写活跃bucket链表中查找符合条件的bucket。若是其他不会产生脏数据的操作(如同步写、未命中缓存的读操作等),则在原来的活跃bucket链表中查找bucket。
效果验证
为了验证读写分离优化的效果,采用4K混合随机读写(70%读 30%写)进行对比测试。为了缩短测试时间每个bcache设备只分配了2GB缓存。
应用读写分离优化之后缓存空间的消耗速度大幅度降低,在同样写入215MiB数据的情况下,未启用优化的只剩下58%的干净缓存,优化后剩余86%的干净缓存。
测试过程中,两块混合盘的读写IOPS以及时延如下所示,说明该优化对性能无影响。