zoukankan      html  css  js  c++  java
  • flashcache以及ssd技术

    本文是基于我对于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。
     

    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。
    -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

  • 相关阅读:
    使用树莓派打造一个音乐播放器
    关于ESP8266 NodeCMU固件无法刷入新代码的解决方法
    推荐一个好用的免费开源的笔记本软件CherryTree
    忘记数据库密码?通过Navicat找回!!
    Kettle删除日志文件
    windows下解决10点前生成时间命名的文件无效问题
    windows下备份Linux服务器上的MySQL
    Windows下安装mysql
    【EXCEL】按天计算,分摊到每年的费用金额,只用内置函数 无需编写VB
    windows 7 安装visual studio 2019 闪退问题解决
  • 原文地址:https://www.cnblogs.com/huayng/p/9150901.html
Copyright © 2011-2022 走看看