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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM