linux内核源码阅读之facebook硬盘加速利器flashcache之初

这个星期偷着点闲看下flashcache,所谓知其然知其所以然,本着程序员追根抛底的职业素养,看看flashcache究竟是何等的三头六臂。
一、flashcache是什么
flashcache是一个linux内核模块,主要目的是用SSD加速块设备,相当于用SSD盘作为块设备的缓存。
二、flashcache在内核的哪一层
位于内核的dm层(device mapper),在块设备之上,在VFS之下。
三、flashcache适用于哪些场景
最初是作为数据库InnoDB的缓存,适用于大多数块设备为瓶颈的系统中。
四、flashcache可以作为软RAID的缓存吗
如果RAID下面的磁盘是HDD,那么可以。如果已经是SSD盘的RAID,那就多此一举了吧。
五、flashcache工作原理是什么
就是在块设备之上建立一个逻辑层,这个逻辑层缓存了读写数据,在命中的情况下,读可以立即返回不用发送到磁盘上。
同样,写也不用等待写到磁盘上,而直接返回并由后台慢慢把数据刷回。
六、flashcache可以同时用做读缓存和写缓存吗
是的。但是个人认为其优势在于写缓存,因为写SSD比写HDD等块设备还是快了不少。
如果是读的话,不命中照样得去HDD取,那命中不就快了很多吗?
理想总是丰满的,现实总是残酷的。在实际应用中,例如上面是VFS层,VFS层已有自己的缓存,对读没有明显提高。
七、那哪里可以下载到最新的版本
https://github.com/facebook/flashcache.git/ 用svn也可以下载
八、如何搭建环境
如果你已经下载代码,查看flashcache-sa-guide.txt文件吧,里面有详细的说明。
我这边暂且就当个剧透吧,说个基本。
第一,当然是编译,编译完成生成一个内核文件flashcache.ko 和三个用户态程序flashcache_create,flashcache_destroy,flashcache_load。ko文件用于在内核,放入/lib/module/version/kernel/driver/内核模块相应目录,然后depmod -a;;modprobe加载该模块。也可以添加开机加载模块脚本/etc/modules-load.d/实现。
第二,用flashcache_create创建块设备对应的缓存设备,具体参见flashcache-sa-guide.txt。
第三,创建好flashcache设备之后就可以使用该设备了。这时候就可以比较一下有flaschcache与没有之间有差别了。
九、如果你觉得还不够过瘾,那么就深入源代码看看究竟
其实源代码非常少,也不难。看看1.0版本的Makefile,内核态的也就4个文件,flashcache_conf.c flashcache_main.c flashcache_subr.c flashcache_ioctl.c,当然还有头文件,头文件的魅力是无穷的,因为写linux内核的哥们总是喜欢把最精华的设计和数据结构放在头文件里,flashcache也是继承了这一光荣传统。只要把flashcache.h中数据结构看懂,就已经入门三分之一了,把把头文件中状态宏看懂就知道读写流程的状态机了,接着再看源代码,带着这些宏观的概念再去看源代码,基本上就是游山玩水般惬意了。
 
下面介绍一下flashcache简单的使用方法:

假设现在你已经编译好了Flashcache,已经装好了ssd盘(假设是/dev/sdb)和sas盘(假设需要使用的是分区/dev/sda12,这可能是一个RAID组)。接下来,看看如何使用Flashcache将上面两个设备虚拟成一个带缓存的块设备。

1. 首次创建Flashcach设备

注:请备份你的数据先!!!特别是/dev/sdb,这个设备上的数据将会被清空;理论上/dev/sda12上的数据不会有任何丢失。

首先确保sda12没有被挂载,如果挂载了,使用umount卸载之,然后使用flashcache_create创建设备:

./flashcache_create cachedev /dev/sdb /dev/sda12

如果是sudo帐号可能会遇到如下的报错:

sh: dmsetup: command not found

可以设置PATH变量的办法,来避免:

sudo PATH=/sbin ./flashcache_create cachedev /dev/sdb /dev/sda12

这样Linux就虚拟除了一个带缓存的块设备:

$ls -lah /dev/mapper/cachedev  
brw-rw---- 1 root disk 253, 0 Oct 8 15:46 /dev/mapper/cachedev
2. 使用该设备

这样就可以像使用一般的块设备一样,来使用该设备了。如果原来分区/dev/sda12上已经有文件系统,mount后还可以正常使用;如果没有文件系统,也可以和一般的设备一样做先做文件系统,然后mount并使用之。

mount /dev/mapper/cachedev /u01

很简单吧:)

3. 如何重做Flashcache

首先需要umount相应分区,然后如果需要重新做Flashcache:

umount /u01  
dmsetup remove cachedev  
./flashcache_destroy /dev/sdb

如果需要重建,再安装上面的flashcache_create重建就可以了。

 

下面再介绍一下flashcache用户空间命令的参数:

1.简介
Flashcache 是为Linux操作系统开发的块设备回写缓存内核模块,使用了Device Mapper的方式实现,本文档可指导你快速掌握Flashcache管理工作。
2. 系统需求

Flashcache 在Linux 2.6.18 和 2.6.20 内核上编译并测试通过。如果需要在更新的内核上使用,请发送邮件给作者寻求帮助,但作者声明不会支持比2.6.18旧的内核版本


3.缓存持久性
Writethru 和writearound 没有持久性,在断电或重启后,缓存数据会丢失,writeback具有持久性,在断电或重启后,缓存数据不会丢失。?

4. Cache创建与加载工具

这部分有三个工具: flashcache_create, flashcache_load 和flashcache_destroy. 这些工具实际上内部调用dmsetup命令,包装了一个比较简单的界面来处理创建、加载和销毁flashcache 卷的工作。希望能帮助大部分用户来避免使用到较复杂的dmsetup指令。

4.1 flashcache_create

功能:创建一个新的flashcache卷。命令语法:

flashcache_create -p back|around|thru [-s cache size] [-b block size] cachedevname ssd_devname disk_devname

-p:缓存模式 writeback,writethrough,writearound三种。

-s:缓存大小,可选项,如果未指定则整个SSD设备被用于缓存,默认的计数单位是扇区(sectors),但是可以接受k/m/g单位。

-b:指定块大小,可选项,默认为4KB,必须为2的指数。默认单位为扇区。也可以用K作为单位,一般选4KB。

-f:强制创建,不进行检查。

举例:

flashcache_create -p back -s 1g -b 4k cachedev /dev/sdc /dev/sdb

创建一个1GB回写的缓存卷,名称为“cachedev”,目标磁盘是磁盘 /dev/sdb(SAS盘或SATA盘),缓存盘是/dev/sdc(SSD盘),快大小为4KB。

flashcache_create -p thru -s 2097152 -b 8 cachedev /dev/sdc /dev/sdb

创建一个2097152扇区(1G)的通写缓存卷,块大小为8KB。其他同上面。

4.2 flashcache_load

功能:加载一个已经存在的flashcache卷,命令语法:

flashcache_load cachedevname ssd_devname disk_devname

举例:

flashcache_load cachedev /dev/sdc /dev/sdb

加载一个已经存在writeback 缓存的 /dev/sdc设备。

一般是为了重启后可继续使用。

4.3 flashcache_destroy

功能:销毁一个存在的flashcache卷,所有的数据将被丢失。

语法:flashcache_destroy ssd_devname

举例:flashcache_destroy /dev/sdc

销毁卷/dev/sdc

5 删除 flashcache 卷

需要使用 dmsetup remove 命令来删除一个 flashcache 卷。

对于writeback模式,默认的remove行为是将“脏”的cache数据写到磁盘上,一直到所有的数据写到磁盘,该命令才会返回成功。磁盘清理的过程被报告给控制台。另外机器reboot同样会触发将Cache里的脏数据同步到磁盘的动作。

对于writethrough和writearound模式的缓存,磁盘删除或者重启,卷都会被删除。

举例:dmsetup remove cachedev

删除的flashcache 卷的名称为cachedev,删除之前会清理掉所有的块。

6 Cache统计信息

可以使用 “dmsetup status”命令来查询cache的统计信息。

“dmsetup table”命令可以dumps出来achce相关的统计信息。

举例:

dmsetup status cachedev

dmsetup table cachedev

另外proc文件系统中也有相应的状态和错误的统计报告:

flashcache 卷的错误信息报告在

/proc/flashcache/<cache name>/flashcache_errors 里

flashcache 卷的统计信息报告在

/proc/flashcache/<cache name>/flashcache_stats 里

7.缓存块大小选择

缓存块大小的选择对于好的缓存利用率和性能来说很关键。

4KB的缓存块可用于绝大多数的工作量或文件系统来说

8.缓存元数据块大小的选择

元数据块的选择只适用于回写缓存模式,对于writethrough和writearound模式存储没有缓存元数据。

在flashcache版本1中,元数据块的大小被确定为1个扇区,即512B。在flashcache版本2中取消了这个限制。在版本2中,可以自己设定更大的flashcache元数据块大小。在第2版本中的缓存向后兼容,对于这些情况,512B的元数据块将继续使用。

flashcache_create –m选项可以用于配置元数据块的大小,默认为4KB。理想的元数据块大小是4KB(默认)或者8KB。选择元数据块的大小有以下规则:

1) 元数据块的大小必须是2的指数

2) 元数据快的大小不能比SSD盘配置的扇区尺寸小

3) 一个单一的元数据块不能有2个数据缓存设置。

选择比512B元数据块大的数据的优势:

1) 允许SSD被设置更大的扇区。例如,一些SSD允许选择4KB扇区,往往有更好的性能选择。

2) 允许flashache做更好的元数据更新, 有可能减少元数据的更新,写SSD变小,减少写入放大和更高的SSD寿命。

9、使用 dmsetup命令创建和加载flashcache卷

很少有人需要使用dmsetup原生命令去创建和加载flashcache卷。本节包含的内容如下:

dmsetup create device_name table_file

device_name 被创建或加载的flashcache设备名

table_file 其他缓存格式,如果被省略,则从标准输入读取。

table_file格式:

0 <disk dev sz in sectors> flashcache <disk dev> <ssd dev> <cache mode> <flashcache cmd> <blksize in sectors> [size of cache in sectors] [cache set size]

cache 模式:1: Write Back 2: Write Through 3: Write Around

flashcache 命令: 1: load existing cache (加载已存在的缓存)

2: create cache (创建新的缓存)

3: force create cache (overwriting existing cache):(强制创建缓存)

扇区块大小的选择: 4KB(8扇区,每页)是最佳选择对应大多数应用。

扇区缓存大小的选择:2的指数被

缓存尺寸设置:默认512

10、缓存控制:

Flashcache能被设置成两种模式:Cache Everything or Cache Nothing,默认的是Cache Everything。

 

 

你可能感兴趣的:(linux内核源码阅读之facebook硬盘加速利器flashcache之初)