5.5的flashcitrix readcache cache有人用过吗

酷勤网 C 程序员的那点事!
当前位置: >
浏览次数:次
Flashcache是facebook释放出来的开源的混合存储方案,用ssd来做cache提升IO设备的性能.很多硬件厂商也有类似的方案,比如说LSI raid卡. 但是这个方案是免费的软件方案,而且经过产品的考验,具体参见:
开源混合存储方案(Flashcache):
Flashcache新版重大变化:
但是flashcache在使用中很多人会有个误区,导致性能很低。首先我们看下flashcache的设计背景和适用场景:
Introduction :
============
Flashcache is a write back block cache Linux kernel module. This
document describes the design, futures ideas, configuration, tuning of
the flashcache and concludes with a note covering the testability
hooks within flashcache and the testing that we did. Flashcache was
built primarily as a block cache for InnoDB but is general purpose and
can be used by other applications as well.
它是为数据库这样的应用的离散读写优化。如果你用在了顺序读写,就有非常大的性能问题。
那么为什么呢?我来分析下:
flashcache把内部的cache空间分成很多set, 是以set而不是整体为单位提供cache以及flush后备操作. 也就是说当一个set里面的dirty page达到一个预设的值的时候,就需要把这么dirty page 淘汰并且flush到后备设备去,以便腾出空间给更热的数据使用。
那么每个set多大呢?
To compute the target set for a given dbn
target set = (dbn / block size / set size) mod (number of sets)
Once we have the target set, linear probe within the set finds the
block. Note that a sequential range of disk blocks will all map onto a
given set.
set默认是 512*4k = 2M大小,也就是说如果你的这个set刚好是一个文件所在的块,而且每次这个文件都不停的顺序写,很快这个set都变成dirty, 那么flashcache就选择马上刷,这样加速效果就没有了。
幸好作者Mohan认识到了这个问题,提供了解决方案:
见文档: /facebook/flashcache/blob/master/doc/flashcache-sa-guide.txt 中的章节Tuning Sequential IO Skipping for better flashcache performance
他引入了配置参数来解决这个问题:
dev.flashcache.skip_seq_thresh_kb:
Skip (don&t cache) sequential IO larger than this number (in kb).
0 (default) means cache all IO, both sequential and random.
Sequential IO can only be determined &after the fact&, so
this much of each sequential I/O will be cached before we skip
the rest. Does not affect searching for IO in an existing cache.
这样你可以把太大的顺序写操作给过滤掉了,大大提升cache的性能。
祝玩得开心!
& 相关主题:
本文来源:device mapper(1)
介绍flashcache的文章很多,我就不废话了。使用上,有余峰老哥的;原理上,有ningoo同学的。但是ningoo同学漏掉了device
mapper和flashcache的动态原理,只讲了静态的数据结构。我就钻个空子补充一下。
一般来说,我们对磁盘的read和write最后都会走到kernel里的submit_bio函数,也就是把io请求变成一个个的bio(bio的介绍看),bio是linux内核里文件系统层和block层之间沟通的数据结构(有点像sk_buffer之于网络),
图片来自 http://lwn.net/Articles/26404/
到了block层以后,一般是先做generic_make_request把bio变成request,怎么个变法?如果几个bio要读写的区域是连续的,就攒成一个request(一个request下挂多个连续bio,就是通常说的“合并bio请求”);如果这个bio跟其它bio都连不上,那它自己就创建一个新的request,把自己挂到这个request下。合并bio请求也是有限度的,如果这些连续bio的访问区域加起来超过了一定的大小(在/sys/block/xxx/queue/max_sectors_kb里设置),那么就不能再合并成一个request了。
合并后的request会放入每个device对应的queue(一个机械硬盘即使有多个分区,也只有一个queue)里,之后,磁盘设备驱动程序通过调用peek_request从queue里取出request,进行下一步的处理。(bio和request的结构详细介绍可以看这里,,)&
之所以要把多个bio合并成一个request,是因为机械硬盘在顺序读写时吞吐最大。如果我们换成SSD盘,合并这事儿就没那么必要了,这一点是可选的,在实现设备驱动时,厂商可以选择从kernel的queue里取request,也可以选择自己实现queue的make_request_fn方法,直接拿文件系统层传过来的bio来进行处理(ramdisk、还有很多SSD设备的firmware就是这么做的)。
图片来自 http://blog.csdn.net/fudan_abc/article/details/2034264
我曾经弱弱的问过:既然bio有bio_vec结构指向多个page,那么为什么不干脆把多个bio合并成一个bio呢?何必要多一个request数据结构那么麻烦?
涛哥答曰:每个bio有自己的end_io回调,一个bio结束,就会做自己对应的收尾工作,如果你合并成一个bio了,就丧失了这种灵活性。
linux kernel有一个device mapper框架(以下简称dm框架),linux上的软RAID、multipath等都是通过此框架实现的。dm框架可以将多个设备聚合成一个虚拟设备提供给用户使用,其原理就是把这个虚拟设备的make_request_fn方法实现成了自己的dm_request,这样所有发往这个虚拟设备的bio都会走进dm_request,然后dm框架通过判断这个虚拟设备是基于request(request
based)的还是基于bio(bio based)的来分别处理:
如果虚拟设备是request based,则和磁盘设备一样走generic_make_request把bio合并成request(如上),注意这些request最后放到的是虚拟设备的queue里,等到虚拟设备通过kblockd调用dm_request_fn时,dm_request_fn里会调用peek_request,从虚拟设备的queue里拿出request,将其clone(clone后的request里的bio指向的page是同一个page,只是分配了新的bio和新的request),然后调用map_request对request做映射(map_request里把map_rq接口暴露给了使用dm框架的开发者),最后把clone后的request发向底层的真实设备。
如果虚拟设备是bio based,就更简单了,调用_dm_request函数,一样要clone bio,然后调用__map_bio对bio做映射(__map_bio里把map暴露给了使用dm框架的开发者),最后把clone后的bio也是通过generic_make_request发向底层的真实设备,这次generic_make_request生成的request就是放在真实设备的queue里了,这是与request
based的不同之处。
关于flashcache的原理,还可以参考尹洋同学的。
flashcache是基于dm框架实现的,很自然的,是把一个SSD盘和一个机械硬盘聚合成一个虚拟设备供用户使用。
flashcache把cache(指SSD盘)分为多个set,每个set里有多个block(默认一个block是4KB,一个set包含512个block,即2MB),set里的block是用lru链表组织起来的,每个block还记录了自己存放的是disk的哪个sector起始的位置里对应的内容(这个起始的sector编号在flashcache的文档里被称为dbn)。
disk(这里指机械硬盘)也虚拟的分为多个set只是为了方便做hash。hash算法非常简单,先看访问的是disk的什么位置,相当于在disk的哪个set里,然后模上cache里的set数,结果就是在cache里对应的set编号了。找到cache对应的set后,继续在set的lru表里挨个儿block的比对dbn号,对上了就成功,对不上说明cache里没有缓存要读取的disk内容。
例如cache大小为10G,disk大小为100G,用户要读取磁盘上偏移54321MB处的2K内容,那么首先对54321MB这个位置做hash,2MB一个set,对应的set number是27160,cache的总set数为5120,那么 27160 mod 5120 结果为1560,也就是说应该去cache的第1560个cache去找,然后来到cache的1560 set里用 dbn
遍历查找lru。
flashcache主要是实现了dm框架暴露出来的map接口(参考flashcache_map函数),收到bio后,先做hash,然后在cache(这里指SSD盘)里查找:
A. 如果是读bio
1 如果查找成功,直接将结果返回
2 如果查找失败,则找set内空闲的block(如果没有空闲的,则用最“旧”的block),直接读取disk里对应的内容返回给用户,返回给用户后设置延时任务将读取的内容放入这个空闲block里
B. 如果是写bio(我们仅列举writeback情况)
1 如果查找成功,拿到对应的block
2 如果查找失败,拿到对应set里最“旧”的block
3 直接将数据写入此block,返回给用户(用户的write系统调用就可以返回了),完成后将该block的状态设为DIRTY并设置延时任务,任务内容为将cache里的内容写往disk(这样既能让用户的写请求迅速完成,又能一定程度保证数据最终被写往disk)。延时任务完成后,便可以去掉block的DIRTY标记了
在set里查找空闲的block时,如果block都是DIRTY的,那么就只能等(这些DIRTY的block要保证写往disk的,所以不能乱动),等到有某个block被写往disk并清除DIRTY标记了,再拿这个block来用。因此,flashcache还会不时的将cache的set里长期不被访问的DIRTY的block写往disk,以保证有足够多的干净的block供以后使用。这个“不时的”不是靠定时器实现的,而是通过在flashcache_write_miss、flashcache_read_miss等函数里调用flashcache_clean_set来做到的。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:123750次
积分:2370
积分:2370
排名:第12779名
原创:97篇
转载:150篇
(1)(1)(1)(2)(5)(1)(52)(4)(26)(65)(11)(4)(8)(1)(64)(1)Flashcache基本使用及注意事项 - 推酷
Flashcache基本使用及注意事项
2.源码安装
rpm -ivh&http://mirrors./centos/6.5/os/x86_64/Packages/kernel-headers-2.6.32-431.el6.x86_64.rpm
rpm -ivh&http://mirrors./centos/6.5/os/x86_64/Packages/kernel-devel-2.6.32-431.el6.x86_64.rpm
wget&/facebook/flashcache/archive/3.1.2.tar.gz
tar xf&3.1.2.tar.gz
cd flashcache-3.1.2
make && make install
//mirrors./centos/6.5/os/x86_64/Packages/kernel-headers-2.6.32-431.el6.x86_64.rpm
//mirrors./centos/6.5/os/x86_64/Packages/kernel-devel-2.6.32-431.el6.x86_64.rpm
///facebook/flashcache/archive/3.1.2.tar.gz
3.1.2.tar.gz
flashcache
自动加载模块
开机自动加载模块配置:
vim /etc/sysconfig/modules/flashcache.modules
#! /bin/sh
/sbin/modinfo -F filename flashcache & /dev/null 2&&1&
if [ $? -eq 0 ]; then
& & /sbin/modprobe flashcache
chmod +x&&/etc/sysconfig/modules/flashcache.modules
flashcache
#! /bin/sh
flashcache
flashcache
flashcache
模块的自动加载最好不要采用写入/etc/rc.local的方式
##加载flashcache模块
modprobe&flashcache & & & & & & & & &
##查看flashcache模块是否加载
[root@localhost&~]# lsmod |grep flashcache&
flashcache 92068 0&
dm_mod 84209 14 flashcache,dm_mirror,dm_log
##删除flashcache模块
rmmod flashcache
##加载flashcache模块
flashcache
##查看flashcache模块是否加载
# lsmod |grep flashcache&
flashcache
flashcache
##删除flashcache模块
flashcache
创建Flashcache
SSD:/dev/sdc
SAS:/dev/sdb2
创建设备名为cachedev的flashcache
flashcache_create -p back -b 4k cachedev /dev/sdc /dev/sdb2
flashcache_create
生成/dev/mapper/cachedev设备
指定flashcache的block大小与Percona的page大小相同,一般默认
flashcache_create相关参数说明:
-p:缓存模式&writeback(数据先写到SSD,随后写到普通硬盘),
writethrough(数据同时写到SSD和普通硬盘),
writearound(数据绕过SSD,直接写到普通硬盘)三种,三种模式的所有读都会被缓存到flashcache可以通过dev.flashcache.&cachedev&.cache_all参数调整
-s:缓存大小,可选项,如果未指定则整个SSD设备被用于缓存,默认的计数单位是扇区(sectors),但是可以接受k/m/g单位。
-b:指定块大小,可选项,默认为4KB,必须为2的指数。默认单位为扇区。也可以用K作为单位,一般选4KB。
-m:设备元数据块大小,只有writeback需要存储metadata块,默认4K
[root@localhost&~]# flashcache_create
Usage: flashcache_create [-v] [-p back|thru|around] [-b block size] [-m md block size] [-s cache size] [-a associativity] cachedev ssd_devname disk_devname
Usage : flashcache_create Cache Mode back|thru|around is required argument
Usage : flashcache_create Default units for -b, -m, -s are sectors, or specify in k/M/G. Default associativity is 512
# flashcache_create
flashcache_create
associativity
ssd_devname
disk_devname
flashcache_create
flashcache_create
associativity
其他帮助参考flashcache源码目录下的man目录
加载缓存设备
flashcache_load /dev/sdc &cachedev (系统重启时使用来加载已经创建过的缓存设备cachedev)
flashcache_load
系统重启时使用来加载已经创建过的缓存设备
加载已存在的flashcache操作仅用于writeback模式,writethrough和writearound模式重启机器后需要重新使用flashcache_create创建
使用Flashcache
创建好的flashcache设备是块设备,可格式文件系统后挂在使用,也可以继续对其分区等
mount /dev/mapper/cachedev /data
销毁Flashcache
flashcache_destroy /dev/sdc &
这种方式删除writeback模式的flashcache时会将SSD上的所有数据删除包括脏数据
建议使用dmsetup命令(device-mapper软件包)删除,会自动将脏数据写入磁盘
dmsetup&remove&cachedev
Flashcache参数优化
[root@localhost&]#sysctl dev.flashcache
dev.flashcache.sdc+sdb2.io_latency_hist = 0
dev.flashcache.sdc+sdb2.do_sync = 0
dev.flashcache.sdc+sdb2.stop_sync = 0
dev.flashcache.sdc+sdb2.dirty_thresh_pct = 20
dev.flashcache.sdc+sdb2.max_clean_ios_total = 4
dev.flashcache.sdc+sdb2.max_clean_ios_set = 2
dev.flashcache.sdc+sdb2.do_pid_expiry = 0
dev.flashcache.sdc+sdb2.max_pids = 100
dev.flashcache.sdc+sdb2.pid_expiry_secs = 60
dev.flashcache.sdc+sdb2.reclaim_policy = 0
dev.flashcache.sdc+sdb2.zero_stats = 0
dev.flashcache.sdc+sdb2.fast_remove = 0
dev.flashcache.sdc+sdb2.cache_all = 1
dev.flashcache.sdc+sdb2.fallow_clean_speed = 2
dev.flashcache.sdc+sdb2.fallow_delay = 900
dev.flashcache.sdc+sdb2.skip_seq_thresh_kb = 0
dev.flashcache.sdc+sdb2.clean_on_read_miss = 0
dev.flashcache.sdc+sdb2.clean_on_write_miss = 0
dev.flashcache.sdc+sdb2.lru_promote_thresh = 2
dev.flashcache.sdc+sdb2.lru_hot_pct = 75
dev.flashcache.sdc+sdb2.new_style_write_merge = 0
#sysctl dev.flashcache
flashcache
io_latency_hist
flashcache
flashcache
flashcache
dirty_thresh_pct
flashcache
max_clean_ios_total
flashcache
max_clean_ios_set
flashcache
do_pid_expiry
flashcache
flashcache
pid_expiry_secs
flashcache
reclaim_policy
flashcache
zero_stats
flashcache
fast_remove
flashcache
flashcache
fallow_clean_speed
flashcache
fallow_delay
flashcache
skip_seq_thresh_kb
flashcache
clean_on_read_miss
flashcache
clean_on_write_miss
flashcache
lru_promote_thresh
flashcache
lru_hot_pct
flashcache
new_style_write_merge
参数介绍参考:
针对MySQL作此优化
dev.flashcache.sdc+sdb2.cache_all = 1 & 默认值1表示缓存所有,0都不缓存,另外通过进程黑白名单控制
dev.flashcache.sdc+sdb2.reclaim_policy = 1 &缓存回收策略,0:FIFO,1:LRU,可动态调整
dev.flashcache.sdbc+sdb2.fast_remove = 1 &0表示不同步脏块到磁盘,1表示同步脏块到磁盘
dev.flashcache.sdc+sdb2.dirty_thresh_pct = 90 &每组脏块占有的百分比,过低会减少块覆盖,增加磁盘写操作和读缓存
dev.flashcache.sdc+sdb2.new_style_write_merge = 1&打开写入合并,提升写磁盘的性能(旧版本dev.flashcache.sdc+sdb2.write_merge)
dev.flashcache.sdb1+sda6.skip_seq_thresh_kb = 256 &表示不缓存超过256kb的顺序IO(由于SSD的随机读写比SAS好,但顺序读写相差不大,故作此优化)
flashcache
表示缓存所有,
都不缓存,另外通过进程黑白名单控制
flashcache
reclaim_policy
缓存回收策略,
,可动态调整
flashcache
fast_remove
表示不同步脏块到磁盘,
表示同步脏块到磁盘
flashcache
dirty_thresh_pct
每组脏块占有的百分比,过低会减少块覆盖,增加磁盘写操作和读缓存
flashcache
new_style_write_merge
打开写入合并,提升写磁盘的性能
flashcache
write_merge
flashcache
skip_seq_thresh_kb
表示不缓存超过
的随机读写比
好,但顺序读写相差不大,故作此优化
Flashcache开机启动
flashcache模块自动加载–flashcache设备自动加载flashcache_load /dev/sdc &cachedev
A.模块自动加载请参考安装部分
B.开机自动加载已创建的缓存设备及挂载
cd /usr/src/flashcache-3.1.2/utils
cp flashcache /etc/init.d/
chmod +x /etc/init.d/flashcache&
修改/etc/init.d/flashcache
SSD_DISK= /dev/sdc
BACKEND_DISK= /dev/sdb2
CACHEDEV_NAME= cachedev
MOUNTPOINT= /data
FLASHCACHE_NAME=sdc+sdb2
chkconfig flashcache on
flashcache
flashcache
flashcache
flashcache
BACKEND_DISK
CACHEDEV_NAME
MOUNTPOINT
FLASHCACHE_NAME
flashcache
Flashcache状态监控
dmsetup status cachedev
dmsetup table &cachedev
错误日志报告&
/proc/flashcache/sdc+sdb2/flashcache_errors
/proc/flashcache/sdc+sdb2/flashcache_stats
亦可使用flashstat命令实时查看
错误日志报告&
flashcache
flashcache_errors
flashcache
flashcache_stats
命令实时查看
到此flashcache的基本使用就是这样,看了网上很多资料都是各种抄袭,不凡错误的,最后还是读了官方的帮助,总结出自己的以便以后使用;
后续要做的就是增加了SSD缓存后,要观察SSD的使用情况及缓存命中率等在逐渐调试优化,下一篇增加MySQL数据库从系统/MySQL方面的一些优化总结和大家分享,请继续关注
推荐IO测试工具
fio、iozone 更多参考
注意事项:
flashcache_create创建了缓存设备之后挂载即可使用,如创建之后使用flashcache_load /dev/sdc &cachedev会提示Invalid Flashcache superblock的错误
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致发布时间:October 28, 2012 // 分类: //
Flashcache是Facebook技术团队开发的一个内核模块,通过在文件系统(VFS)和设备驱动之间新增一次缓存层,可以用SSD作为介质的缓存,通过将传统硬盘上的热门数据缓存到SSD上,加速服务器磁盘读写性能。
Centos5.7下安装Flashcache,查看系统及内核版本:
Linux master.www.haiyun.me 2.6.18-274.17.1.el5 #1 SMP Tue Jan 10 17:25:58 EST
x86_64 x86_64 GNU/Linux
cat /etc/issue
CentOS release 5.7 (Final)
下载安装内核源码树:
#http://www.haiyun.me
yum install rpm-build redhat-rpm-config unifdef
lftp -c "pget -n 10
http://vault.centos.org/5.7/os/SRPMS/kernel-2.6.18-274.el5.src.rpm"
rpm -i kernel-2.6.18-274.el5.src.rpm
cd /usr/src/redhat/SPECS/
rpmbuild -bp --target=$(uname -m) kernel.spec
内核模块编译准备:
cd /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18-274.*
make oldconfig
make prepare
make modules_prepare
下载编译Flashcache:
wget --no-check-certificate -O flashcache.tar.gz /facebook/flashcache/tarball/master
tar zxvf flashcache.tar.gz
cd facebook-flashcache-c4bddf6/
make install
加载Flashcache模块:
insmod /lib/modules/2.6.18-274.17.1.el5/extra/flashcache/flashcache.ko
lsmod |grep flashcache
flashcache
flashcache,dm_multipath,dm_raid45,dm_snapshot,dm_zero,dm_mirror,dm_log
创建Flashcache卷:
flashcache_create [-v] [-p back|thru|around] [-b block size] [-m md block size] [-s cache size] [-a associativity] cachedev ssd_devname disk_devname
挂载Flashcache卷:
mount /dev/mapper/cachedev
/home/wwwroot/
(13) (42) (82) (8) (17) (14) (14) (5) (4) (7) (13) (23) (3) (40) (1) (9) (3) (11) (20) (10) (18) (2) (18) (4) (7) (28) (2) (3) (18) (2) (16) (3) (25) (35) (22) (3) (10) (3) (5) (20) (14) (4) (2) (1) (1) (1) (2) (7) (13) (4) (9) (3) (1) (4) (2) (3) (6) (2) (1) (1) (3) (3) (8) (6) (4) (7) (3) (7) (2) (1) (2)
: 只需配置 服务端 的接收端口随机化就行了, 发送端口 因为 连接追踪(conntrack)的缘...
: 博主你好,按照你的教程设置了IP转发及SNAT:echo 1 > /proc/sys/net/...
: 大神, 为什么我在make clean 就出错了呢 ?你能帮我看看吗 。。。...
: 遇到相同的问题,但未能解决,请求帮助。1、遇到的问题:/target-i386_i486_uC...
: 大哥,我觉得你的技术好牛逼!能加你QQ吗
: Unknown package 'lrzsz'.Collected errors:* opkg...
: 在openwrt 15.05 下 luci 界面安装了 带操作界面的 openconnect ...
: 搭建很顺利(唯一成功的www),链接很丝滑,谢博主。
: 您好,请问一下,我客户端和服务端都编译成功了,down到本地启动是这个样子,没有Forward...
: openwrt 14 安装rp-pppoe-server问题1,客户端连接错误代码619,使用...
页面执行耗时:0.0455秒。-->您现在的位置: --> 查看专题: Flashcache
&&&& Flashcache是facebook的一个开源项目,用于数据库加速中.大致结构,在传统磁盘前面放置一个ssd装置,充当缓存,把热的数据保持在缓存中,写的过程也是在先写ssd然后由ssd同步到传统磁盘.真正的数据最终还是保持在传统磁盘中.这样ssd杯掉也不用担心数据丢失.同时又可以有大容量,高性能的体验.
&&&&前几天因为测试新版的Flashcache,为了便于监控性能指标,用Perl写了个秒级的监控程序Flashstat,一开始是通过定期获取dmsetup status的信息做解析,后来在flashcache-dev邮件列表中讨论时,Flashcache的...
&&&&我们可以用内存来模拟一个性能很好的Flash设备,当然这有一个缺点,就是主机重启后就啥都没了,不过用于实验测试这应该不是什么大问题。用内存来模拟块设备有两种方法,ramdisk或者tmpfs+loop device。由于ramdisk要调整大小需要修改grub并重启,这里我们用tmpfs来实现。
&&&&前文简单介绍了block device和device mapper。有了这两个基础,再来看flashcache的代码,就容易理解多了。Flashcache是一个内核模块,要更清晰的理解代码,还需要了解一下内核模块编写的一些基础知...
&&&&前文简单的介绍了block device,别急,虽然这个系列的主要目的是介绍Flashcache,这一篇还是不会切入正题,因为我们还需要先了解下什么是device mapper。 假如一台主机插入了多块硬盘,单块硬盘...
&&&&Cache is king. 在计算机系统中,cache的魔爪无处不在。CPU中有L1,L2,甚至L3Linux有pagecache,MySQL有buffer cache/IO系统中Raid卡/磁盘也有在大型互联网系统中,数据库前面一般也都有一层...
近3天十大热文
rightLowest
赞助商广告
& 2009 - 2017}

我要回帖

更多关于 flashcache 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信