去年年底的时候对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空间的分配比例还是很准确的
网友评论已有0条评论, 我也要评论