经过我测试发现,ceph基于令牌桶算法的流量和IOPS上限限制还是比较精准的。之前的测试报告找不到了,以后我会补上。源码地址为:https://github.com/ShiqiCooperation/shiqiceph
本次修改是基于0.94.3版本,之后的版本rbd源码可能有变化,但是在实现上大同小异。
一,在librbd模块,做限制
因为librbd模块的代码具有很明确的length,在librados层length就会被拆分成基于对象的length。所以我们基于librbd层做,具体为Internal .cc文件
二,设计构架
Librdb分为5层
Librbd接口层 :读配置,设置配置对象watch功能
Internal :所有librbd接口读写的汇总
Osdc : 对用户数据流切片
Objectcache: 用户数据缓冲层
Send op: 数据操作发送层
三,令牌桶算法
流量限制尝试了很多方案,但是只有采用令牌桶算法,才能限制的最为精准。
令牌桶算法的基本过程如下:
假如用户配置的平均发送速率为r,则每隔1/r秒一个令牌被加入到桶中