本文是基于我对于ssd是否放在ssd上合适的疑惑而展开的,实际表现如何后续会亲自实验更新。
先推荐一篇很好的文章关于redo及ssd:
http://dbaplus.cn/news-10-137-1.html
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 28479848448 遍历查找lru。
-p:缓存模式 writeback(数据先写到SSD,随后写到普通硬盘),
writethrough(数据同时写到SSD和普通硬盘),
writearound(数据绕过SSD,直接写到普通硬盘)三种,三种模式的所有读都会被缓存到flashcache可以通过dev.flashcache.<cachedev>.cache_all参数调整
-s:缓存大小,可选项,如果未指定则整个SSD设备被用于缓存,默认的计数单位是扇区(sectors),但是可以接受k/m/g单位。
-b:指定块大小,可选项,默认为4KB,必须为2的指数。默认单位为扇区。也可以用K作为单位,一般选4KB。
-f:强制创建,不进行检查
-m:设备元数据块大小,只有writeback需要存储metadata块,默认4K
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
针对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好,但顺序读写相差不大,故作此优化)
处理流程图
Write-through模式处理流程:A Write-Through cache with No-Write Allocation
Write-back模式处理流程:A Write-Back cache with Write Allocation
参考文档:http://www.simlinux.com/archives/398.html
https://www.baidu.com/link?url=ur4AbBVNvs2gguHbaiWRWLIdFOaawghQaYioI1RwFvY5xG_Tq2IP1u7aPBreT0xx&wd=&eqid=ab6fdc03000453a7000000045b188b44
https://blog.csdn.net/werm520/article/details/42638897
https://blog.csdn.net/kidd_3/article/details/6984822
https://blog.csdn.net/u012317833/article/details/22094899