去年年底的时候对flashcache做了一番研究,并进行了改造,所谓改造,其实就是希望它能支持cgroup,也就是说,当有在不同cgroup里运行的进程对flashcache进行读写时,flashcache能根据cgroup的不同权重分配这些进程以不同的iops(IO per second)。详细的资料在这里:《flashcache原理及改造》

事情还没有结束,现在能给flashcache设备设io-scheduler了,设成cfq就可以按cgroup weight来分配iops,但是,做为稀缺资源的ssd设备,其cache空间并没有像IOPS那样按比例分配给各个cgroup,所以,今年,我继续把“cache空间按cgroup比例分配给进程”的功能做完了。patch系列在这里

原理:flashcache按hash把io缓存到ssd设备的不同的LRU链表上。我加了一个“struct flashcache_group”,将cgroup的信息存入其中,同时由它来管理”子LRU“。比如,有4个cgroup的进程在对flashcache做读写,那每个LRU都要被拆成4个由"struct flashcache_group”管理的”子LRU“,每个“子LRU”所用的cache空间的大小(即flashcache所谓的block的个数),就是由它所在的cgroup的权重决定的。
当flashcache设备刚初始化好时,所有的“子LRU”都是空的,cache都在根group的手中(正好对应cgroup里的root group概念),一旦有进程的IO来了,才根据它所在cgroup的权重,慢慢将block划入它所属的”子LRU“(当然,不能超过最大比例);当该进程退出后,cgroup即被destroy,于是,对应的”子LRU“也会将自己占的cache返还给”主LRU“。

由于这些改动不仅涉及flashcache本身,还要牵扯kernel里很多block层的代码,所以,目前还不能单独提交给flashcache社区,只能先保留在ali_kernel里,想试用的同学,可以用如下方法:

1. 下载ali kernel的代码并编译dev分支,然后安装内核并重启机器

git clone git@github.com:RobinDong/ali_kernel.git
git checkout -b dev origin/dev
make localmodconfig #根据自己机器的硬件情况选择config文件
make -j20
make modules_install
make install
vim /etc/grub.conf #修改grub以启动ali kernel
reboot

2. 进入ali kernel后,下载flashcache工具并编译stable_v2.1分支

git clone git@github.com:RobinDong/flashcache.git
git checkout -b stable_v2.1 origin/stable_v2.1
make

3. 使用编译的flashcache工具创建设备(加"-r"参数以确保flashcache进去request base模式)

src/utils/flashcache_create -p back -r cachedev /dev/rxdrv /dev/sdf

咱们接着用以下fio文件做个测试:

[global]
direct=1
ioengine=libaio
runtime=60
bs=4k
rw=randwrite
iodepth=8
filename=/dev/mapper/cachedev
numjobs=1

[group1]
cgroup=test1
cgroup_weight=1000

[group2]
cgroup=test2
cgroup_weight=800

[group3]
cgroup=test3
cgroup_weight=600

[group4]
cgroup=test4
cgroup_weight=400

测试结果:

cgroup IOPS
test1 684
test2 581
test3 425
test4 264

再看看SSD设备里block的分配情况:

cat /proc/flashcache/rxdrv+sdf/flashcache_blocks

Group		Weight		Block Count
/test2		800		54865
/test1		1000		68582
/test3		600		41149
/test4		400		27433

看来cache空间的分配比例还是很准确的