`
weitao1026
  • 浏览: 1053539 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Facebook flashcache介绍与使用

 
阅读更多
1、简介

传统的HDD具备大容量的优势,但是性能相对偏低,尤其是随机IO性能,经常成为系统的性能瓶颈,在虚拟机化环境下表现的更明显,因为虚拟化场景会加剧IO随机化。相比HDD,SSD具有高性能的优势,尤其在随机IO这方面,优势非常明显,但是SSD的硬件成本比较高。目前业界在结合HDD的大容量和SSD的高性能方面做了一些优化,基本思路是使用SSD作为HDD的cache,计算机领域,cache的思想无处不在,比如CPU的L1、L2 cache,raid card上的cache,TLB cache等。关于SSD作为HDD的cache的优化方案,主要有Linux bcache,Linux dm-cache,Facebook flashcache,btier,IBM flashcache等,本文主要介绍Facebook flashcache,它目前由Facebook维护,没有merge到kernel mainstream。

2、原理介绍

flashcache是建立在Linux devicemapper之上的,由devicemapper在SSD和backing HDD之上创建了一个逻辑的mapped device,用户使用的就是这个mapped device。flashcache把cache(SSD)按照哈希的方式进行结构化管理,如下图所示,每个方格代表一个block,默认大小是4KB,每个block对应一个per-block metadata,存放在flash中,metadata中记录了该block缓存的backing device的sector号,以及cache的状态(DIRTY, VALID, INVALID);每一行是一个cache set,set大小(buckets)默认是512。总的cache大小,block大小,set大小在创建flashcache时可以指定,根据flashcache的大小以及buckets的大小,一个每个block的大小,就可以计算出buckets数。
flashcache.png

当访问一个sector N时,其对应的cache set为:(N / block size / set size) mod (number of sets),number of sets也就是上图中的n,一旦找到cache set,就可以在该set中查找对应的block。这么做可以做到一个范围的顺序disk block可以cache在一个set中。

flashcache的cache mode分为以下三种:
writethrough:disk write会在cache中保留一份,但同时也会把数据write到backing disk中,直到write backing disk完成才会返回。
writearound:disk write会bypass cache,直接写到backing disk中,disk read会把从backing disk中读取的数据在cache中缓存。
针对writethrough和writearound,disk read首先根据目的sector找到对应的cache set,然后查找有没有相应的block,如果找到了,也就是cache hit,则直接从cache中读取,如果没有找到,就从backing disk中读取数据,同时也在cache中进行缓存。
writeback:write首先会写到cache中,然后更新metadata中得dirty bit,数据并不会立即同步到backing disk中。

另外,flashcache还会在flash上保存cache superblock,用来记录flashcache create时的一些参数(这些参数可以用来reload恢复),以及cache shutdown有没有clean,正常关机会clean,但是crash或者掉电时不会clean的,cache clean后,block对应的metadata中的状态会标识为~dirty。在一个clean cache shutdown,所有cache block的metadata都会刷到flash中,如果是正常关机,下次开机后做flashcache reload时,VALID和DITRY cache都会存在ssd中,如果时crash或者掉电后重新开机,只有DIRTY cache会在SSD中,crash和掉电不会导致数据丢失,只是会失去VALID和non-DIRTY cache。

cache block metadata的更新是有可能会合并的,如果pending的几个write的目标sector对应的cache block metadata是同一个则会合并。

dirty cache是在后台以lazy的方式刷到backing disk中,这个可以通过dirty threshold来控制,flashcache会把每个cache set的dirty percent保持在dirty threshold以下,当超过了dirty threshold,flashcache会根据策略把一部分cache同步到backing disk中。同时,还有一个dirty cache idle clean功能,即根据cache block的idle时间(也就是距离该block最近一次读写的时间)超过一个值(可以通过dev.flashcache.fallow_delay配置)进行同步,当fallow_delay=0时,则关闭idle clean。

当发生了dirty cache block clean时,flashcache会遍历该block set中得block,然后进行排序,合并成大IO同步到backing disk中。

有一点需要注意,devicemapper会根据blocksize把它接收到得IO进行划分,然后再递交给flashcache,如果IO size小于blocksize,flashcache则不会缓存该IO,而是先查找cache中有没有overlap的脏数据,如果有的花,就先刷脏数据,然后再把刚才从devicemapper传来的IO写到backing disk上,如果没有脏数据,则直接写到backing disk上,这也就是为什么当使用fio测试小于4KB的随机IO时,flashcache几乎没有效果。

3、使用方法

【获取flashcache source】
https://github.com/facebook/flashcache
上面有很多版本,针对centos6.x,下载flashcache-stable-v3.1.3或者flashcache-3.1.2

【编译,安装】
make && make install

【创建flashcache】
flashcache_create [-v] -p back|around|thru [-s cache size] [-b block size] cachedevname ssd_devname disk_devname
-v : verbose.
-p : cache mode (writeback/writethrough/writearound).
-s : cache size. Optional. If this is not specified, the entire ssd device
is used as cache. The default units is sectors. But you can specify
k/m/g as units as well.
-b : block size. Optional. Defaults to 4KB. Must be a power of 2.
The default units is sectors. But you can specify k as units as well.
(A 4KB blocksize is the correct choice for the vast majority of
applications. But see the section "Cache Blocksize selection" below).
-f : force create. by pass checks (eg for ssd sectorsize).
Examples :
flashcache_create -p back -s 1g -b 4k cachedev /dev/sdc /dev/sdb
Creates a 1GB writeback cache volume with a 4KB block size on ssd
device /dev/sdc to cache the disk volume /dev/sdb. The name of the device
created is "cachedev".
以上来自:https://github.com/facebook/flashcache/blob/3.1.2/doc/flashcache-sa-guide.txt

【格式化,mount】
flashcache_create创建出来的逻辑磁盘,其实就是devicemapper创建出来的逻辑磁盘,你可以像使用普通磁盘一样去使用它,分区,格式化文件系统都可以。
mkfs.ext4 /dev/mapper/cachedev
mount -t ext4 /dev/mapper/cachedev [mount point]

【tuning & configuration】
sysctls common for all cache modes:
dev.flashcache..cache_all: 该参数有两个取值,0和1,前者代表cache nothing,后者代表cache everything,默认是cache everything。cache everything时,可以通过进程ID black list指定哪些进程的IO不进行cache,cache nothing时,可以使用进程ID white list指定哪些进程进行cache。有一点需要注意的是black list只对O_DIRECT IOs有效果,因为针对buffered IOs,pdflush,kswapd会在后台write这些buffered IOs,flashcache仍然会cache这些IOs,那么black list就没有效果了。我们可以通过cat /proc/flashcache/[cache name]/flashcache_pidlists查看具体的white list和black list设置。我们可以通过ioctl(/dev/mapper/cachedev, CMD, pidlist)来设置进程的white/black list,具体CMD如下,
FLASHCACHEADDBLACKLIST: add the pid (or tgid) to the blacklist.
FLASHCACHEDELBLACKLIST: Remove the pid (or tgid) from the blacklist.
FLASHCACHEDELALLBLACKLIST: Clear the blacklist. This can be used to cleanup if a process dies.
FLASHCACHEADDWHITELIST: add the pid (or tgid) to the whitelist.
FLASHCACHEDELWHITELIST: Remove the pid (or tgid) from the whitelist.
FLASHCACHEDELALLWHITELIST: Clear the whitelist. This can be used to cleanup if a process dies.

dev.flashcache..zero_stats: FIFO (0) vs LRU (1). 默认是 FIFO. 支持运行时切换。

dev.flashcache..io_latency_hist: 用来计算IOs的时延,并可以通过柱状图显示出来,可以通过dmsetup status查看。单位是250us。该功能默认是关闭的,因为flashcache是使用gettimeofday()来计算时延的,对于某些时钟源来说,这个开销太大,一般很少开启这个功能。

dev.flashcache..max_pids: 进程pid white/black list中允许设置的最多pid数。

dev.flashcache.do_pid_expiry: enable/disable white/black list中的pid的expiry。

dev.flashcache.pid_expiry_secs: 设置white/black list中pid的expiry时间。

dev.flashcache..skip_seq_thresh_kb: 配置是不是对满足一定条件的IO不进行cache,条件就是如果顺序IO大于这个threshold,则不进行cache,当threshold为0时(默认值)意味着cache所有的IO,不管时顺序的还是随机的。顺序IO是根据最近的IO判断的。

sysctls for writeback mode only:
dev.flashcache..fallow_delay: idle clean的idle时间,单位是秒,当距离该cache block最近一次访问的时间大于该idle时,就会触发同步该block所在的cache set同步dirty block。
默认值时900s,0表示禁止idle clean功能。

dev.flashcache..fallow_clean_speed: 该值是精确控制idle clean的,每个cache block每秒允许clean的最多block数,默认是2。

ev.flashcache..fast_remove: 决定当remove cache时要不要同步 dirty cache,0代表同步,1代表不同步,默认是同步。如果不同步,在reload时,dirty和valid block都在cache中。这个选项可以用于快速的cache remove。

dev.flashcache.dirty_thresh_pct: ditry block的threshold,flashcache会尽量让一个cache set中的dirty block的低于这个threshold,一旦达到这个值就会触发flashcache sync 该cache set中的部分dirty block到backing disk。当这个值比较小时,会触发比较多得IO write,但是会增加更多的backing disk sector放到cache中。

dev.flashcache..stop_sync: 停止正在进行的IO同步操作。

dev.flashcache..do_sync: 触发同步所有的dirty block到backing disk。

【注意事项】
1)创建flashcache前,要确保backing hdd没有被挂载,因为一旦创建好flashcache后,backing hdd上以前的数据就没办法获取到了,正常情况下在创建flashcache后,也会对新生成的mapped device进行格式化文件系统。

2)在关机前最好调用dmset remove cachedev,这样会把所有的dirty cache同步到backing disk上。针对writeback mode,开机时需要调用flashcache_load [SSD]来恢复之前的flashcache配置,保证不会发生数据丢失。这些可以通过在/etc/init.d/下增加一个init脚本来做,可以参考https://github.com/facebook/flashcache/blob/3.1.2/doc/flashcache-doc.txt中的“Using Flashcache sysVinit script”。

3)当devicemapper递交给flashcache的IO小于cache block size,flashcache不会缓存这些IO。

4)关于顺序IO,flashcache有没有效果,取决于你的HDD的顺序IO性能怎么样,如果你的HDD的顺序IO性能比SSD的性能还好,建议配置dev.flashcache..skip_seq_thresh_kb=[256,512,1024,...]参数跳过cache满足条件的顺序IO,具体参见上面关于dev.flashcache..skip_seq_thresh_kb的说明。

4、测试验证

配置:HDD partition size 16G, SSD partition size 8GB,
flashcache创建命令:flashcache_create -p back -s 8g cachedev1 /dev/sdb /dev/sda2
综合测试结果如下图所示,
flashcache2.png

以下是详细测试命令及结果,
【fio测试】
随机写:
raw HDD, fio -filename=/dev/sda2 -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=4k -size=5G -numjobs=8 -runtime=300 -group_reporting -name=mytest
flashcache-test-randwrite-hdd.png

flashcache, fio -filename=/dev/mapper/cachedev1 -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=4k -size=5G -numjobs=8 -runtime=300 -group_reporting -name=mytest
flashcache-randwrite-flashcache.png

随机读:
raw HDD, fio -filename=/dev/sda2 -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=4k -size=5G -numjobs=8 -runtime=300 -group_reporting -name=mytest
flashcache-randread-hdd.png

flashcache,fio -filename=/dev/sda2 -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=4k -size=5G -numjobs=8 -runtime=300 -group_reporting -name=mytest
flashcache-randread-flashcache.png

随机混合读写,读写各占50%:
raw HDD,fio -filename=/dev/sda2 -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=50 -ioengine=psync -bs=4k -size=5G -numjobs=8 -runtime=300 -group_reporting -name=mytest
flashcache-randrw-hdd.png

flashcache,fio -filename=/dev/mapper/cachedev1 -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=50 -ioengine=psync -bs=4k -size=5G -numjobs=8 -runtime=300 -group_reporting -name=mytest
flashcache-randrw-flashcache.png

5、结论

针对随机IO(包括随机写、随机读、随机混合读写),flashcache可以数十倍的提高IOPS,并显著的降低IO latency。
另外,关于顺序IO,flashcache有没有效果,取决于你的HDD的顺序IO性能怎么样,像我以上测试环境用的是曙光I620r-T,它上面的HDD的顺序写性能达到46K IOPS,而SSD的性能只有20K IOPS左右,所以这时要通过配置dev.flashcache..skip_seq_thresh_kb=x,以使得不对大于xKB顺序IO进行cache,x值可以根据具体情况进行调整,一般可以选择128,256,512等。
分享到:
评论

相关推荐

    facebook flashcache安装资源

    Facebook FlashCache是一款开源的缓存解决方案,主要用于提升类Unix系统的存储性能。FlashCache利用SSD(固态硬盘)作为缓存层,通过将频繁访问的数据存储在高速的SSD上,来减少对传统HDD(机械硬盘)的访问,从而...

    flashcache架构详解

    FlashCache之所以被Facebook开发,是因为它需要将现有的服务器升级,使用Flash存储以提高IO性能。它需要易于部署和使用,并且期望能够利用缓存来优化IO访问模式。在开发过程中,有数位工程师参与,包括设计和实现的...

    flashcache的实现问题

    #### Devicemapper与Flashcache概览 - **Devicemapper**:作为Linux内核的一部分,Devicemapper提供了一种动态管理块设备的方法,允许用户通过创建虚拟块设备(mapped_device)来实现对物理设备的高级功能,如快照...

    混合存储中Flashcache使用的误区以及解决方案1

    Flashcache是一种由Facebook开源的混合存储解决方案,它利用SSD(固态硬盘)作为缓存来提高I/O设备的性能,特别适用于提升数据库等需要高速随机读写的应用。该技术被设计为一个Linux内核模块,可以通用并适用于多种...

    Using SSD as MySQL/InnoDB L2 Cache

    - **Facebook的Flash Cache**:Facebook采用了一种基于dm-cache的解决方案,支持Write Back/Write Through模式,这是一种通用的缓存方案,已经在Facebook取得了成功。 - **SSD厂商提供的解决方案**:如STEC ...

    nginx优化Memblaze高速IO应用

    Flashcache是一种由Facebook开发的开源缓存解决方案。安装后,通过`flashcache_create`命令创建缓存,例如: ``` flashcache_create -p back -a 2048 flash0 /dev/memdiska /dev/sdb ``` 这将创建一个write-back策略...

    基于磁盘和固态盘的混合存储系统性能测试与分析

    本研究主要采用Facebook开源项目FlashCache来构建混合存储系统。FlashCache是一种块层缓存机制,能够在Linux操作系统中将SSD作为HDD的缓存,有效提升后者的读写速度。具体实施方案包括: 1. **硬件配置**:选用一块...

    SSD在新浪数据库平台优化实践

    - **FlashCache:** - SSD作为读写缓冲区,适用于热点数据集。 - Facebook开发的开源项目,广泛应用于生产环境。 - 最新版本3.0增强了淘汰算法和读写效率。 - 微博核心数据库曾使用此方案。 - **LSI CacheCade &...

    分享最好的HTML5编码教程和参考手册

    - **Getting Offline Access with HTML5 Application Cache**:介绍如何利用HTML5的Application Cache实现离线访问。 - **HTML5 Grayscale Image Hover**:展示如何使用HTML5创建灰度图像悬停效果。 - **...

    基于互联网业务的MySQL内核优化之路.pdf

    1. **InnoDB Flash Cache (SSD Cache)**:利用SSD作为缓存层,提高I/O性能。 2. **TopSQL、Role Table、Profiler、TNT/NTSE**:这些工具用于监控和优化SQL查询,提升数据库性能。 3. **Replication增强**:包括半...

    欧美时尚休闲网站模板是一款HTML5模板,适合时尚女性类网站模板下载。_html网站模板_网页源码移动端前端_H5模板.rar

    5. 商品展示与购物功能:如果涉及在线销售,模板会包含商品展示、购物车、结账等功能,可能使用Ajax技术实现无刷新操作。 6. 用户评论与评分系统:鼓励用户参与,提供反馈,增加网站的活跃度和可信度。 7. SEO优化...

    H5 简单demo示例模板

    3. **多媒体支持**:H5直接支持音频、视频播放,无需Flash插件,`<audio>`和`<video>`标签让媒体元素的使用更加便捷。 4. **Canvas绘图**:提供了一个二维画布,通过JavaScript可以进行动态图形绘制,实现了丰富的...

    java开源包8

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    最好的HTML5编码教程和参考手册推荐.doc

    例如,在设计博客时,可以使用定义头部,用于导航,表示文章主体,用于分段,则定义底部信息。 HTML5还强化了表单控件,新增了、等类型,增强了用户输入体验。同时,通过标签的new attribute如required、...

    java开源包1

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包11

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包2

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包3

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包6

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

Global site tag (gtag.js) - Google Analytics