1. flashcache简介
1.
1.1. 概念
flashcache使用SSD为磁盘提供缓存,大幅度提高随机读写速度。基于linux device mapper框架,具有良好的操作性和可扩展性。本文主要针对2.0版本,3.0算法改进并且支持多块硬盘共享一块ssd,有兴趣的可以阅读下代码。
1.2. 功能
flashcache具有三种模式writeback、writethrough和writearoud。
Ø writeback模式下,后端磁盘的写io先缓存到SSD中,适当的时机再写入后端存储中。读io首先从SSD中读取,如果已经缓存了数据,则直接读取返回,反之则从后端磁盘读取并将数据缓存到SSD中
Ø writethrough模式下,写io将同时写入到SSD和后端磁盘中,读io从SSD中读取。
Ø writearoud模式下,SSD被旁路,所有io操作都针对后端磁盘。
flashcache可以指定缓存或者不缓存特定的pid进程产生的io,flashcache具有white table和black table,某个进程的io数据是否缓存通过以下规则判断:
1. pid位于white table,io数据缓存
2. pid没有设置,tgid位于white table,io数据缓存;
3. pid位于black table,io数据不缓存;
4. pid没有设置,tgid位于black table,io数据不缓存。
flashcache支持顺序io过滤,超过指定大小的连续io将不会被缓存到SSD中,可以提高SSD的利用率,提高随机读写的效率。
1.2.1. flashcache优劣势
模块化设计,不需要编译内核;基于dm框架,良好的扩展性与易用性;不损坏磁盘数据,对后端文件系统透明。
使用接口相对简单,可定制策略较少。
1.2.2. 适用场景
1.3. 系统结构
flashcache由用户态接口和内核模块组成,其结构如下图所示。
内核模块为dm的target驱动,完成SSD缓存的核心功能。用户态接口分为procfs、sysctl和ioctl接口,procfs提供一些flashcache设备的状态信息,sysctl接口提供用户设置flashcache的一些可调参数,ioctl接口实现设备的ioctl,主要提供黑白表的设置功能。
2. flashcache使用
2.
2.1.1. 系统依赖
linux系统下内核版本2.6.18和3.2版本之间的内核都支持,大于3.2的内核没有测试过,官方给出的稳定版本为2.6.32版本。
2.1.2. 编译
如果之前没有编译过内核源代码,则下载相应内核的源代码依次运行
make menuconfig
make
make modules_install
make install
如果在/boot下没有生成initrd开头的文件,则需要调用以下命令
mkinitramfs -o /boot/initrd.img-xxx(内核版本号) /lib/modules/xxx(内核版本号)
下载flashcache源代码,进入源代码目录
make KERNEL_TREE=/xxx(编译好的内核源代码目录)
make install
编译之后会生成一个flashcache.ko文件,并拷贝到系统/lib/modules对应目录,此时通过insmod或者modprobe加载flashcache即可。
2.2. 用户态工具
官方提供了4个接口,新增一个接口。
表3-1 flashcache接口
名称 |
功能 |
备注 |
flashcache_create |
创建一个flashcache设备 |
|
flashcache_load |
从一个ssd设备上加载原有的flashcache设备 |
|
flashcache_destroy |
载一个ssd设备上擦出其上的flashcache设备的元数据 |
|
flashcache_remove |
快速移除flashcache设备 |
|
flashcache_setioctl |
flashcache设备的ioctl接口,主要用于设置黑白表 |
|
2.3. 接口说明
2.3.1. flashcache_create
flashcache_create |
功能 |
创建一个flashcache设备 |
|
命令形式 |
flashcache_create [-v] [-p back|thru|around] [-b block size] [-m md block size] [-s cache size] [-a associativity] cachedev ssd_devname |