天天看點

flashcache 介紹

rpm:

  flashcache-utils-0.0-4.1.el6.x86_64

  kmod-flashcache-0.0-3.el6.x86_64

基本介紹:

  Flashcache是Facebook技術團隊開發的一個核心子產品,通過在檔案系統(VFS)和裝置驅動之間新增一次緩存層,可以用SSD作為媒體的緩存,通過将傳統硬碟上的熱門資料緩存到SSD上,加速伺服器磁盤讀寫性能。最初是為加速MySQL設計

   Flashcache是基于dm架構實作的,很自然的,是把一個SSD盤和一個機械硬碟聚合成一個虛拟裝置供使用者使用。

  基本原理圖:

  

  Flashcache在核心的層次:

    

  

基本指令行:

  /sbin/flashcache_create

  /sbin/flashcache_destroy

  /sbin/flashcache_load

  /sbin/flashcache_scan

  /sbin/flashcache_setioctl

  /sbin/flashstat

  /sbin/get_agsize

  /usr/lib/ocf/resource.d/flashcache

  /usr/share/doc/flashcache-utils-0.0/GPL-v2.0.txt

root@vClass-tekKw queue]# rpm -ql kmod-flashcache-0.0-3.el6.x86_64
/etc/depmod.d/kmod-flashcache.conf
/lib/modules/2.6.32-220.17.6.el6.x86_64
/lib/modules/2.6.32-220.17.6.el6.x86_64/extra
/lib/modules/2.6.32-220.17.6.el6.x86_64/extra/flashcache
/lib/modules/2.6.32-220.17.6.el6.x86_64/extra/flashcache/flashcache.ko
/usr/share/doc/kmod-flashcache-0.0
/usr/share/doc/kmod-flashcache-0.0/GPL-v2.0.txt
/usr/share/doc/kmod-flashcache-0.0/README
/usr/share/doc/kmod-flashcache-0.0/flashcache-doc.txt
/usr/share/doc/kmod-flashcache-0.0/flashcache-sa-guide.txt      

flashcache_create 指令

[root@vClass-tekKw rc.d]# 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.
git commit:       

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

SSD:/dev/sdc

SAS:/dev/sdb2

建立裝置名為cachedev的flashcache

flashcache_create -p back -b 4k cachedev /dev/sdc /dev/sdb2      

生成/dev/mapper/cachedev裝置

指定flashcache的block大小與Percona的page大小相同,一般預設 

加載緩存裝置

flashcache_load /dev/sdc  cachedev (系統重新開機時使用來加載已經建立過的緩存裝置cachedev)      

加載已存在的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參數優化

1 [root@localhost ]#sysctl dev.flashcache
 2 dev.flashcache.sdc+sdb2.io_latency_hist = 0
 3 dev.flashcache.sdc+sdb2.do_sync = 0
 4 dev.flashcache.sdc+sdb2.stop_sync = 0
 5 dev.flashcache.sdc+sdb2.dirty_thresh_pct = 20
 6 dev.flashcache.sdc+sdb2.max_clean_ios_total = 4
 7 dev.flashcache.sdc+sdb2.max_clean_ios_set = 2
 8 dev.flashcache.sdc+sdb2.do_pid_expiry = 0
 9 dev.flashcache.sdc+sdb2.max_pids = 100
10 dev.flashcache.sdc+sdb2.pid_expiry_secs = 60
11 dev.flashcache.sdc+sdb2.reclaim_policy = 0
12 dev.flashcache.sdc+sdb2.zero_stats = 0
13 dev.flashcache.sdc+sdb2.fast_remove = 0
14 dev.flashcache.sdc+sdb2.cache_all = 1
15 dev.flashcache.sdc+sdb2.fallow_clean_speed = 2
16 dev.flashcache.sdc+sdb2.fallow_delay = 900
17 dev.flashcache.sdc+sdb2.skip_seq_thresh_kb = 0
18 dev.flashcache.sdc+sdb2.clean_on_read_miss = 0
19 dev.flashcache.sdc+sdb2.clean_on_write_miss = 0
20 dev.flashcache.sdc+sdb2.lru_promote_thresh = 2
21 dev.flashcache.sdc+sdb2.lru_hot_pct = 75
22 dev.flashcache.sdc+sdb2.new_style_write_merge = 0      
1 dev.flashcache.fast_remove:      删除flashcache卷時不同步髒緩存塊。這個選項用來快速删除。
 2 dev.flashcache.zero_stats:       統計資訊歸零。
 3 dev.flashcache.reclaim_policy:    緩存回收規則。有兩種算法:先進先出FIFO(0),最近最少用LRU(1).預設是FIFO。
 4 dev.flashcache.write_merge:      啟用寫入合并,預設是開啟的。
 5 dev.flashcache.dirty_thresh_pct:flachcache    嘗試保持每個單元的髒塊在這個n%以下。設定低增加磁盤寫入和降低塊重寫,但是增加了塊讀取緩存的可用性。
 6 dev.flashcache.do_sync:               排程清除緩存中的所有髒塊。
 7 dev.flashcache.stop_sync:              停止同步操作。
 8 dev.flashcache.cache_all:              全局緩存模式:緩存所有和全部不緩存。預設是緩存所有。
 9 dev.flashcache.fallow_delay:            清除髒塊的間隔。預設60s。設定為0禁止空閑,徹底清除。
10 dev.flashcache.io_latency_hist:          計算IO等待時間,并繪制直方圖。
11 dev.flashcache.max_clean_ios_set:          在清除塊時,每單元最大寫入出錯。
12 dev.flashcache.max_clean_ios_total:        在同步所有塊時,最大寫入問題。
13 dev.flashcache.debug:                開啟debug。
14 dev.flashcache.do_pid_expiry:            在白/黑名單上啟用逾期的pid清單。
15 dev.flashcache.pid_expiry_secs:          設定pid白/黑名單的逾期。
16 dev.flashcache.max_pids:              最大數量的pid白/黑名單。      

  參數介紹參考:https://github.com/facebook/flashcache/blob/master/doc/flashcache-sa-guide.txt

針對MySQL作此優化:

1 dev.flashcache.sdc+sdb2.cache_all = 1         預設值1表示緩存所有,0都不緩存,另外通過程序黑白名單控制
2 dev.flashcache.sdc+sdb2.reclaim_policy = 1       緩存回收政策,0:FIFO,1:LRU,可動态調整
3 dev.flashcache.sdbc+sdb2.fast_remove = 1       0  表示不同步髒塊到磁盤,1表示同步髒塊到磁盤
4 dev.flashcache.sdc+sdb2.dirty_thresh_pct = 90     每組髒塊占有的百分比,過低會減少塊覆寫,增加磁盤寫操作和讀緩存
5 dev.flashcache.sdc+sdb2.new_style_write_merge = 1  打開寫入合并,提升寫磁盤的性能(舊版本dev.flashcache.sdc+sdb2.write_merge)
6 dev.flashcache.sdb1+sda6.skip_seq_thresh_kb = 256  表示不緩存超過256kb的順序IO(由于SSD的随機讀寫比SAS好,但順序讀寫相差不大,故作此優化)      

Flashcache開機啟動

flashcache子產品自動加載–flashcache裝置自動加載flashcache_load /dev/sdc  cachedev

A.子產品自動加載請參考安裝部分

B.開機自動加載已建立的緩存裝置及挂載

1 cd /usr/src/flashcache-3.1.2/utils
 2 cp flashcache /etc/init.d/
 3 chmod +x /etc/init.d/flashcache 
 4 修改/etc/init.d/flashcache
 5 SSD_DISK= /dev/sdc
 6 BACKEND_DISK= /dev/sdb2
 7 CACHEDEV_NAME= cachedev
 8 MOUNTPOINT= /data
 9 FLASHCACHE_NAME=sdc+sdb2
10 chkconfig flashcache on      

Flashcache狀态監控

1 dmsetup status cachedev
 2 dmsetup table  cachedev
 3  
 4 錯誤日志報告 
 5 /proc/flashcache/sdc+sdb2/flashcache_errors
 6  
 7 狀态報告
 8 /proc/flashcache/sdc+sdb2/flashcache_stats
 9  
10 亦可使用flashstat指令實時檢視      

注意事項:

1.100G SSD + 2T SATA是一個具有現實參考意義的案例。

2.把Mysql的随機讀寫與順序讀寫分離(即把log直接放在後端的磁盤上,而不能放在mapper盤上),這樣性能會提高很多。

3.用來跳過順序IO的一個參數。

dev.flashcache..skip_seq_thresh_kb 
      

4.帶有flashcache的機器,在關機時需要耗費大量時間整理髒塊。

5.伺服器掉電有導緻分區損壞的可能,且通過fsck無法修複。

6.flashcache_create建立了緩存裝置之後挂載即可使用,如建立之後使用flashcache_load /dev/sdc  cachedev會提示Invalid Flashcache superblock的錯誤

參考:

  SSD+Flashcache 的了解 RAID了解          http://blog.csdn.net/caoshuming_500/article/details/7495323

  Flashcache基本使用及注意事項             http://blog.csdn.net/werm520/article/details/42638897

  命中率80%,磁盤I/O減半,Flashcache的發展史     http://www.csdn.net/article/2013-10-31/2817357-facebook-flashcache-2010-2013

  flashcache的實作與分析                http://blog.csdn.net/kidd_3/article/details/6984822

  flashcache原理                    http://www.udpwork.com/item/8437.html 

  Flashcache基本使用及注意事項             http://www.simlinux.com/archives/398.html

  Flashcache初探                    http://blog.chinaunix.net/uid-26950862-id-3948198.html

  如何使用FlashCache技術加速                 https://zhidao.baidu.com/question/1768060642827049340.html

  FlashCache初探(二)                  http://www.cnblogs.com/remimin/archive/2012/04/16/2451002.html

  Centos安裝Flashcache使用SSD緩存                         http://www.haiyun.me/archives/centos-flashcache.html

  linux核心源碼閱讀之facebook硬碟加速利器flashcache之初                      http://blog.csdn.net/liumangxiong/article/details/11643473