linux控制cache使用值e,[轉]Linux塊設備加速緩存bcache和dm-cache:使用SSD來加速服務器...
在 LSFMM 2013 峰會(huì)上,Mike Snitzer, Kent Overstreet, Alasdair Kergon, 和 Darrick Wong 共同主持了一個(gè)討論,內(nèi)容是關(guān)於兩個(gè)彼此獨(dú)立的塊設(shè)備層緩存方案 ——
dm-cache 和
bcache。
Snitzer 首先介紹了 3.9 kernel 引入的 dm-cache。這個(gè)方案使用率內(nèi)核中的 device mapper 框架,實(shí)現(xiàn)了快速設(shè)備對(duì)慢速的“原始”設(shè)備的 writeback 或 writethrough 緩存。Snitzer 介紹到,dm-cache 的原理是使用 device mapper 核心,並在上面增加一個(gè)策略層。這個(gè)策略層“非常類(lèi)似”一個(gè)插件接口,可以實(shí)現(xiàn)不同的策略。這些策略(以及緩存的內(nèi)容)決定了緩存是否可以命中,是否需要進(jìn)行數(shù)據(jù)遷移(在原始設(shè)備與緩存設(shè)備之間進(jìn)行某個(gè)方向的數(shù)據(jù)移動(dòng))。目前已經(jīng)實(shí)現(xiàn)了包括最近最少用(LRU)、最常使用(MFU)等策略,但目前只有缺省的“mq”策略合並到內(nèi)核中了,以便減少起初需要測(cè)試到的策略數(shù)量。文件系統(tǒng)可以為策略提供 hints,比如某些塊臟了,或是某些塊已經(jīng)被放棄了。這些信息有助於策略更好地決定塊要存儲(chǔ)到的位置。
之后,Overstreet 介紹了 bcache 的狀態(tài)更新,后者已經(jīng)在排隊(duì)進(jìn)入 3.10 了。他介紹到,bcache 已經(jīng)有“很多用戶(hù)”了,而且代碼已經(jīng)比較穩(wěn)定了。他最近主要是在進(jìn)行 bug fix。與 dm-cache 實(shí)現(xiàn)的的分級(jí)存儲(chǔ)不同,按照 Overstreet 的介紹,bcache 更像一個(gè)傳統(tǒng)的緩存。它可以用來(lái)存儲(chǔ)任何 extents,甚至是是一個(gè)扇區(qū),而 dm-cache 只能對(duì)整塊數(shù)據(jù)進(jìn)行緩存。
就在峰會(huì)開(kāi)始前,Wong 給多個(gè)郵件列表(包括 dm-devel, linux-bcache, linux-kernel)發(fā)出過(guò)一封 email 來(lái)比較 bcache, dm-cache, 和 EnhanceIO。他分別編譯了帶有上述各個(gè)特性的內(nèi)核,進(jìn)行了一些測(cè)試。他發(fā)現(xiàn),EnhanceIO 是最慢的,bcache 是它的 4-6 倍,而 dm-cache 更快,達(dá)到了 15 倍,不過(guò) dm-cache 無(wú)法完成有些測(cè)試。所有比較都在一塊普通硬盤(pán)上進(jìn)行了相同的測(cè)試,有時(shí),由於未知的原因,dm-cache 的表現(xiàn)或多或少的和硬盤(pán)完全一樣。他指出,有些測(cè)試會(huì)導(dǎo)致 mkfs 創(chuàng)建的 inode table 倍緩存住,而通常這並不是一種有效的使用緩存的方法。Snitzer 表示,他曾試著去重現(xiàn) Wong 的測(cè)試結(jié)果,但結(jié)果對(duì) bcache 和 dm-cache 都得倒了更差的成績(jī)。他說(shuō)他希望和 Overstreet 一起去找出原因。而 Overstreet 則表示,不應(yīng)該過(guò)多地看綜合測(cè)試的成績(jī),這些測(cè)試是游泳的,但可能帶有誤導(dǎo)性。
Ric Wheeler 提問(wèn),Snitzer 是否“在真實(shí)工作負(fù)載下看到了實(shí)質(zhì)性的性能提升”,Snitzer提到,在不同的 Git 標(biāo)簽之間進(jìn)行切換就是 dm-cache 可以完勝的一個(gè)例子,不過(guò)他需要一些幫助來(lái)獲得更貼近實(shí)際使用的負(fù)載。一個(gè)參會(huì)者問(wèn)道,這些方案是否假設(shè)緩存設(shè)備總是存在。Snitzer 說(shuō),dm-cache 確實(shí)如此假設(shè),但這是需要改進(jìn)的地方。Overstreet 說(shuō), bcache 並不要求 cache 設(shè)備一直都在。因?yàn)?bcache 已經(jīng)在實(shí)際產(chǎn)品中使用了,所以它有機(jī)會(huì)去碰到這些疑難場(chǎng)景,並可以處理這些緩存設(shè)備無(wú)法工作的情形。Snitzer 表示,dm-cache 確實(shí)還有很多事情要做。起初,它是進(jìn)行 cache 和原始設(shè)備的並行 IO,但最終不得不回到順序 IO。而且,對(duì)於流水線中有 NVM 設(shè)備的情況下,存儲(chǔ)層次也是如此。因?yàn)?dm “到處都是分層”,dm-cache 剛好適合進(jìn)行存儲(chǔ)分層,不過(guò) Overstreet 指出,bcache 也可以做到分級(jí)存儲(chǔ)。這個(gè)討論最終沒(méi)有一個(gè)明確的結(jié)論,只是提到需要讓兩個(gè)方案的“真實(shí)世界”性能讀數(shù)變得更好。同時(shí)也指出了,不同的測(cè)試者進(jìn)行的測(cè)試得到的結(jié)論差異是巨大的,這也是真實(shí)世界的情況的一個(gè)寫(xiě)照。
- See more at:
http://wangxu.me/blog/#sthash.smQmCr76.dpuf
Linux塊設(shè)備加速緩存之bcache
什么是bcache
bcache是linux內(nèi)核塊層cache。它使用類(lèi)似SSD來(lái)作為HDD硬盤(pán)的cache,從而起到加速作用。
HDD硬盤(pán)便宜並且空間更大,SSD速度快但更貴。如果能兩者兼得,豈不快哉?bcache能做到。
bcache使用SSD作為其他塊設(shè)備cache。類(lèi)似ZFS的L2Arc,但bcache還增加了寫(xiě)回策略,並且是與文件系統(tǒng)無(wú)關(guān)的。bcache被設(shè)計(jì)成只需要最小的代價(jià),無(wú)需配置就能在所有環(huán)境中工作。默認(rèn)狀態(tài)下bcache不緩存順序IO,只緩存隨機(jī)讀寫(xiě)。bcache適用於桌面、服務(wù)器,高級(jí)存儲(chǔ)陣列,甚至是嵌入式環(huán)境。
設(shè)計(jì)bcache目標(biāo)是讓被緩存設(shè)備與SSD一樣快(包括緩存命中、緩存不命中、透寫(xiě)和回寫(xiě))。現(xiàn)在還未達(dá)到初衷,特別是順序?qū)憽M瑫r(shí)測(cè)試結(jié)果表明離目標(biāo)很接近,甚至有些情況下表現(xiàn)更好,例如隨機(jī)寫(xiě)。
bcache是數(shù)據(jù)安全的。對(duì)於寫(xiě)回策略緩存來(lái)說(shuō),可靠性是非常重要的,出錯(cuò)就意味著丟失數(shù)據(jù)。bcache是用電池備份陣列控制器的替代選擇,同時(shí)也要求bcache在異常掉電時(shí)也是數(shù)據(jù)安全的。對(duì)於寫(xiě)而言,必須在所有數(shù)據(jù)寫(xiě)到可靠介質(zhì)之后才能向上層返回寫(xiě)成功,在異常掉電情況下,寫(xiě)不能是部分完成的。大量工作已經(jīng)投入到這部分?jǐn)?shù)據(jù)安全的工作中。
bcache性能設(shè)計(jì)目標(biāo)是等同於SSD。最大程度上去最小化寫(xiě)放大,並避免隨機(jī)寫(xiě)。bcache將隨機(jī)寫(xiě)轉(zhuǎn)換為順序?qū)?#xff0c;首先寫(xiě)到SSD,然后回寫(xiě)緩存使用SSD緩存大量的寫(xiě),最后將寫(xiě)有序?qū)懙酱疟P(pán)或者陣列上。對(duì)於RAID6陣列,隨機(jī)寫(xiě)性能很差,還要花費(fèi)不菲的價(jià)格購(gòu)買(mǎi)帶有電池保護(hù)的陣列控制器。現(xiàn)在有了bcache,你就可以直接使用linux自帶的優(yōu)秀軟RAID,甚至可以在更廉價(jià)的硬件上獲取更高的隨機(jī)寫(xiě)性能。
特性
1、一個(gè)緩存設(shè)備可以作為多個(gè)設(shè)備的緩存,並且可以在設(shè)備運(yùn)行時(shí)動(dòng)態(tài)添加和刪除緩存。
2、異常關(guān)機(jī)恢復(fù),只有當(dāng)寫(xiě)到磁盤(pán)后緩存才會(huì)確認(rèn)寫(xiě)完成。
3、正確處理寫(xiě)阻塞和刷緩存
4、支持writethrough, writeback和writearound
5、檢測(cè)並避開(kāi)順序IO(可配置關(guān)閉該選項(xiàng))
6、當(dāng)檢測(cè)到SSD延遲超過(guò)配置邊界值,減少到SSD流量(當(dāng)一個(gè)SSD作為多個(gè)磁盤(pán)緩存時(shí)使用)
7、緩存不命中時(shí)預(yù)讀(默認(rèn)關(guān)閉)
8、高性能的writeback實(shí)現(xiàn):臟數(shù)據(jù)都是排序后再回寫(xiě)。如果設(shè)置了writeback水位線,PD控制器會(huì)根據(jù)臟數(shù)據(jù)比例來(lái)平滑處理到后臺(tái)writeback流量。
9、使用高效率了B+樹(shù),bcache隨機(jī)讀可以達(dá)到1M IOPS
10、穩(wěn)定,已經(jīng)有產(chǎn)品應(yīng)用
性能
7/25/12 隨機(jī)測(cè)試
在我的測(cè)試機(jī)上,我將SSD盤(pán)劃分為兩個(gè)相同大小的分區(qū),一個(gè)分區(qū)用於測(cè)試SSD裸盤(pán),另一個(gè)作為硬盤(pán)緩存。
bcache配置修改:cache_mode設(shè)置為writeback,writeback_percent設(shè)置為40。(如果writeback_percent不為0,bcache使用PD控制器根據(jù)緩存的臟數(shù)據(jù)塊來(lái)平滑處理下發(fā)到磁盤(pán)的流量)。同時(shí)還關(guān)閉了擁塞閥值,因?yàn)楫?dāng)SSD延遲達(dá)到極限時(shí),如果bcache切換到writethrough將會(huì)影響結(jié)果。
SSD盤(pán)為Intel 160G MLC SSD,也就是Intel SSDSA2M160。
FIO作為性能測(cè)試,測(cè)試腳本如下:
[global] randrepeat=1 ioengine=libaio bs=4k ba=4k size=8G direct=1 gtod_reduce=1 norandommap iodepth=64
FIO運(yùn)行在SSD裸設(shè)備上,但對(duì)於這類(lèi)性能測(cè)試軟件來(lái)說(shuō)應(yīng)該沒(méi)有影響。
裸SSD設(shè)備上隨機(jī)寫(xiě)測(cè)試結(jié)果如下:
root@utumno:~# fio ~/rw4k
randwrite: (g=0): rw=randwrite, bs=4K-4K/4K-4K, ioengine=libaio, iodepth=64
fio 1.59
Starting 1 process
Jobs: 1 (f=1): [w] [100.0% done] [0K/49885K /s] [0 /12.2K iops] [eta 00m:00s]
randwrite: (groupid=0, jobs=1): err= 0: pid=1770
write: io=8192.3MB, bw=47666KB/s, iops=11916 , runt=175991msec
cpu : usr=4.33%, sys=14.28%, ctx=2071968, majf=0, minf=19
IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%
issued r/w/d: total=0/2097215/0, short=0/0/0
Run status group 0 (all jobs):
WRITE: io=8192.3MB, aggrb=47666KB/s, minb=48810KB/s, maxb=48810KB/s, mint=175991msec, maxt=175991msec
Disk stats (read/write):
sdb: ios=69/2097888, merge=0/3569, ticks=0/11243992, in_queue=11245600, util=99.99%
添加了bcache:
root@utumno:~# fio ~/rw4k
randwrite: (g=0): rw=randwrite, bs=4K-4K/4K-4K, ioengine=libaio, iodepth=64
fio 1.59
Starting 1 process
Jobs: 1 (f=1): [w] [100.0% done] [0K/75776K /s] [0 /18.5K iops] [eta 00m:00s]
randwrite: (groupid=0, jobs=1): err= 0: pid=1914
write: io=8192.3MB, bw=83069KB/s, iops=20767 , runt=100987msec
cpu : usr=3.17%, sys=13.27%, ctx=456026, majf=0, minf=19
IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%
issued r/w/d: total=0/2097215/0, short=0/0/0
Run status group 0 (all jobs):
WRITE: io=8192.3MB, aggrb=83068KB/s, minb=85062KB/s, maxb=85062KB/s, mint=100987msec, maxt=100987msec
Disk stats (read/write):
bcache0: ios=0/0, merge=0/0, ticks=0/0, in_queue=0, util=0.00%
添加了bcache之后IOPS為18.5K,裸SSD設(shè)備為12.2K。bcache表現(xiàn)更佳是因?yàn)閎cache按順序?qū)?xiě)請(qǐng)求發(fā)送到SSD,但額外加入了更新索引的開(kāi)銷(xiāo)。bcache對(duì)隨機(jī)寫(xiě)做了優(yōu)化,bcache還從高IO深度(64)獲益,因?yàn)樵诟逫O深度的情況下就可以將多次下標(biāo)更新合並為一次寫(xiě)請(qǐng)求。
高IO深度就代表著高系統(tǒng)負(fù)載,當(dāng)IO深度下調(diào)時(shí)IOPS也出現(xiàn)變化:
IO depth of 32: bcache 20.3k iops, raw ssd 19.8k iops
IO depth of 16: bcache 16.7k iops, raw ssd 23.5k iops
IO depth of 8: bcache 8.7k iops, raw ssd 14.9k iops
IO depth of 4: bcache 8.9k iops, raw ssd 19.7k iops
SSD性能在不同IO深度時(shí)出現(xiàn)了波動(dòng)。對(duì)於不同的寫(xiě)模型會(huì)有不同的結(jié)果,我們只關(guān)注兩者的相對(duì)數(shù)值。
當(dāng)測(cè)試隨機(jī)4K寫(xiě),IO深度為1時(shí),bcache寫(xiě)次數(shù)是裸SSD設(shè)備的兩倍:每一次寫(xiě)都需要再更新一次索引。
隨機(jī)讀
IO depth of 64: bcache 29.5k iops, raw ssd 25.4k iops
IO depth of 16: bcache 28.2k iops, raw ssd 27.6k iops
bcache略勝一籌,可能跟要讀的數(shù)據(jù)相關(guān)。這里的結(jié)論是隨機(jī)讀時(shí)bcache與裸SSD讀性能是相同的。
這里要注意的是,讀4K隨機(jī)寫(xiě)下去的數(shù)據(jù),這樣的測(cè)試模型對(duì)於bcache是不好的。這意味btree都是4K大小,btree將比通常時(shí)候大得多。在實(shí)際應(yīng)用中,平均大小是100K。btree變大就意味著索引占用更大的內(nèi)存空間,並且有一部分是在二級(jí)索引。根據(jù)個(gè)人經(jīng)驗(yàn)這些開(kāi)銷(xiāo)在大型機(jī)器IOPS超過(guò)500K時(shí)才會(huì)有實(shí)際影響。
如果大家有其他的測(cè)試方法或者我的測(cè)試方法中有什么問(wèn)題請(qǐng)通知郵件告訴我。
常見(jiàn)問(wèn)題
關(guān)機(jī)、設(shè)備移除
系統(tǒng)關(guān)機(jī)時(shí)cache仍然是臟的,就是說(shuō)后端磁盤(pán)的數(shù)據(jù)並不可靠。如果要保證后端磁盤(pán)數(shù)據(jù)是安全的,就需要手動(dòng)移動(dòng)cache或者將cache設(shè)置為writethrough模式。
自動(dòng)掛載
bcache會(huì)自動(dòng)匹配cache和后端設(shè)備。匹配過(guò)程與設(shè)備對(duì)系統(tǒng)可用的次序沒(méi)有關(guān)系。
帶bcache的根目錄分區(qū)
為了讓根分區(qū)能夠使用bcache,需要添加rootdelay=3到啟動(dòng)參數(shù),這樣才能讓udev規(guī)則在系統(tǒng)mount根文件系統(tǒng)之前運(yùn)行。
已格式化過(guò)的磁盤(pán)或分區(qū)
如果一個(gè)分區(qū)或者磁盤(pán)設(shè)備啟動(dòng)時(shí)沒(méi)有創(chuàng)建bcache,可能是因?yàn)槌?jí)塊發(fā)生錯(cuò)誤。為了讓bcache能夠正確檢測(cè)到之前的設(shè)備,udev規(guī)則會(huì)首先檢查是否符合bcache規(guī)則和blkid檢查。udev規(guī)則檢查設(shè)備超級(jí)塊從而識(shí)別文件系統(tǒng)類(lèi)型,如果該超級(jí)塊不符合bcache文件系統(tǒng)類(lèi)型那么就不會(huì)添加bcache。
# cat /usr/lib/udev/rules.d/61-bcache.rules
....
# Backing devices: scan, symlink, register
IMPORT{program}="/sbin/blkid -o udev $tempnode"
# blkid and probe-bcache can disagree, in which case don't register
ENV{ID_FS_TYPE}=="?*", ENV{ID_FS_TYPE}!="bcache", GOTO="bcache_backing_end"
...
# lsblk -o NAME,MAJ:MIN,RM,SIZE,TYPE,FSTYPE,MOUNTPOINT,UUID,PARTUUID
NAME MAJ:MIN RM SIZE TYPE FSTYPE MOUNTPOINT UUID PARTUUID
sda 8:0 0 111.8G disk
├─sda1 8:1 0 3G part vfat /esp 7E67-C0BB d39828e8-4880-4c85-9ec0-4255777aa35b
└─sda2 8:2 0 108.8G part ext2 93d22899-cd86-4815-b6d0-d72006201e75 baf812f4-9b80-42c4-b7ac-5ed0ed19be65
sdb 8:16 0 931.5G disk
└─sdb1 8:17 0 931.5G part ntfs FAD2B75FD2B71EB7 90c80e9d-f31a-41b4-9d4d-9b02029402b2
sdc 8:32 0 2.7T disk bcache 4bd63488-e1d7-4858-8c70-a35a5ba2c452
└─bcache1 254:1 0 2.7T disk btrfs 2ff19aaf-852e-4c58-9eee-3daecbc6a5a1
sdd 8:48 0 2.7T disk bcache ce6de517-7538-45d6-b8c4-8546f13f76c1
└─bcache0 254:0 0 2.7T disk btrfs 2ff19aaf-852e-4c58-9eee-3daecbc6a5a1
sde 8:64 1 14.9G disk
└─sde1 8:65 1 14.9G part ext4 / d07321b2-b67d-4daf-8022-f3307b605430 5d0a4d76-115f-4081-91ed-fb09aa2318d
在上面的例子中有一個(gè)分區(qū)之前是ext2文件系統(tǒng)。bcache將通過(guò)以下指令自動(dòng)構(gòu)建:
# make-bcache -B /dev/sdc /dev/sdd -C /dev/sda2
因?yàn)樵O(shè)備/dev/sdc和/dev/sdd標(biāo)識(shí)了bcache文件系統(tǒng),因此會(huì)在系統(tǒng)啟動(dòng)時(shí)自動(dòng)添加,而/dev/sda2則需要手動(dòng)添加。在/dev/sda2偏移1024處仍殘留有之前文件系統(tǒng)的超級(jí)塊信息,而bcache信息是從4096偏移開(kāi)始記錄,修復(fù)的方法是:
# dd if=/dev/zero count=1 bs=1024 seek=1 of=/dev/sda2
在系統(tǒng)重啟之后所有磁盤(pán)被正確識(shí)別:
# lsblk -o NAME,MAJ:MIN,RM,SIZE,TYPE,FSTYPE,MOUNTPOINT,UUID,PARTUUID
NAME MAJ:MIN RM SIZE TYPE FSTYPE MOUNTPOINT UUID PARTUUID
sda 8:0 0 111.8G disk
├─sda1 8:1 0 3G part vfat /esp 7E67-C0BB d39828e8-4880-4c85-9ec0-4255777aa35b
└─sda2 8:2 0 108.8G part bcache 93d22899-cd86-4815-b6d0-d72006201e75 baf812f4-9b80-42c4-b7ac-5ed0ed19be65
├─bcache0 254:0 0 2.7T disk btrfs 2ff19aaf-852e-4c58-9eee-3daecbc6a5a1
└─bcache1 254:1 0 2.7T disk btrfs 2ff19aaf-852e-4c58-9eee-3daecbc6a5a1
sdb 8:16 0 931.5G disk
└─sdb1 8:17 0 931.5G part ntfs FAD2B75FD2B71EB7 90c80e9d-f31a-41b4-9d4d-9b02029402b2
sdc 8:32 0 2.7T disk bcache 4bd63488-e1d7-4858-8c70-a35a5ba2c452
└─bcache1 254:1 0 2.7T disk btrfs 2ff19aaf-852e-4c58-9eee-3daecbc6a5a1
sdd 8:48 0 2.7T disk bcache ce6de517-7538-45d6-b8c4-8546f13f76c1
└─bcache0 254:0 0 2.7T disk btrfs 2ff19aaf-852e-4c58-9eee-3daecbc6a5a1
sde 8:64 1 14.9G disk
└─sde1 8:65 1 14.9G part ext4 / d07321b2-b67d-4daf-8022-f3307b605430 5d0a4d76-115f-4081-91ed-fb09aa2318dd
同樣地,殘留超級(jí)塊還會(huì)引起類(lèi)似的其他錯(cuò)誤。
bcache是按照SSD特性來(lái)設(shè)計(jì)的,只按擦除桶大小進(jìn)行分配,使用btree和日志混合方法來(lái)跟蹤緩存數(shù)據(jù),緩存數(shù)據(jù)可以是桶上的任意一個(gè)扇區(qū)。bcache最大程度上減少了隨機(jī)寫(xiě)的代價(jià),它按順序填充一個(gè)桶,重新使用時(shí)只需將桶設(shè)置為無(wú)效。
bcache支持寫(xiě)直達(dá)和回寫(xiě)策略。回寫(xiě)默認(rèn)情況下是關(guān)閉的,可以在運(yùn)行時(shí)改變。bcache還在最大程度上保護(hù)你的數(shù)據(jù),在系統(tǒng)異常關(guān)機(jī)時(shí)數(shù)據(jù)仍然是可靠的。因?yàn)樗辉O(shè)計(jì)為只有在數(shù)據(jù)完全寫(xiě)回存儲(chǔ)設(shè)備才確認(rèn)寫(xiě)成功。
回寫(xiě)策略能夠緩存絕大多數(shù)的寫(xiě)請(qǐng)求,然后再按照索引將臟數(shù)據(jù)按次序?qū)懟氐胶蠖舜鎯?chǔ)設(shè)備。
SSD的特點(diǎn)就是隨機(jī)IO速度很快,而對(duì)於大塊順序IO的提升卻並不大。bcache會(huì)檢測(cè)順序IO並忽略;還會(huì)對(duì)每一個(gè)任務(wù)記錄動(dòng)態(tài)的平均IO大小,當(dāng)平均IO大小超過(guò)截止值時(shí)該任務(wù)后面的IO將會(huì)被忽略,這樣就可以透?jìng)鱾浞莼蛘叽笪募截悺?/p>
在flash上發(fā)現(xiàn)數(shù)據(jù)IO錯(cuò)誤時(shí),首先會(huì)嘗試讀以恢復(fù)數(shù)據(jù)或者將該緩存項(xiàng)置為無(wú)效。對(duì)於不可恢復(fù)的錯(cuò)誤,例如元數(shù)據(jù)或臟數(shù)據(jù),bcache將會(huì)自動(dòng)關(guān)閉緩存。如果有臟數(shù)據(jù)在緩存中,這時(shí)會(huì)首先關(guān)閉回寫(xiě)策略然后再等待臟數(shù)據(jù)刷回。
從這里開(kāi)始
首先需要安裝bcache-tools,它提供了make-bcache工具。緩存設(shè)備和后端磁盤(pán)在使用前都需要先初始化:
make-bcache?-B?/dev/sdb
make-bcache?-C?/dev/sdc
make-bcache提供了同時(shí)初始化多個(gè)設(shè)備的功能,並自動(dòng)綁定緩存設(shè)備和后端磁盤(pán):
make-bcache?-B?/dev/sda?/dev/sdb?-C?/dev/sdc
bcache-tools現(xiàn)在已經(jīng)包含了udev規(guī)則文件,bcache設(shè)備可以立即被內(nèi)核感知。如果沒(méi)有udev規(guī)則,需要手動(dòng)注冊(cè)設(shè)備:
echo?/dev/sdb>/sys/fs/bcache/register
echo?/dev/sdc?>/sys/fs/bcache/register
注冊(cè)了后端磁盤(pán)后,bcache設(shè)備會(huì)出現(xiàn)在/dev/目錄下,現(xiàn)在就可以格式化然后使用了。bcache設(shè)備默認(rèn)是透?jìng)髂J?#xff0c;因此需要綁定緩存。
bcache顯示如下:
/dev/bcache
還有(有udev規(guī)則文件時(shí)):
/dev/bcache/by-uuid/
/dev/bcache/by-label/
如果要開(kāi)始使用:
mkfs.ext4?/dev/bcache0
mount?/dev/bcache0?/mnt
bcache的sysfs控制項(xiàng)在/sys/block/bcache/bcache。
bcache設(shè)備是按集合來(lái)管理的,但目前一個(gè)集合只支持一個(gè)bcache設(shè)備,將來(lái)會(huì)支持多個(gè)設(shè)備、元數(shù)據(jù)和臟數(shù)據(jù)鏡像。新cache設(shè)備顯示為/sys/fs/bcache/
cache綁定:
在緩存設(shè)備和后端設(shè)備都注冊(cè)之后,還要將緩存設(shè)備綁定到后端設(shè)備從而使用緩存。綁定操作如下:
echo ?> /sys/block/bcache0/bcache/attach
這個(gè)操作只需要做一次就可以了。下一次系統(tǒng)重啟時(shí),只需要重新注冊(cè)所有bcache設(shè)備。如果后端設(shè)備還有未定回的緩存數(shù)據(jù),那么就不會(huì)創(chuàng)建/dev/bcache,直到緩存設(shè)備回來(lái),尤其在寫(xiě)回策略時(shí)特別重要。
如果需要在沒(méi)有緩存設(shè)備的時(shí)候強(qiáng)制使用設(shè)備:
echo?1>/sys/block/sdb/bcache/running
注意這里參數(shù)是后端設(shè)備,而不是bcache設(shè)備,何況此時(shí)bcache設(shè)備還沒(méi)有創(chuàng)建。如果是使用分區(qū)創(chuàng)建的bcache設(shè)備,例如sdb2對(duì)應(yīng)的目錄是/sys/block/sdb/sdb2/bcache。
在強(qiáng)制使用bcache設(shè)備后,緩存設(shè)備添加到系統(tǒng),這個(gè)緩存設(shè)備的所有緩存數(shù)據(jù)將會(huì)設(shè)置為無(wú)效。緩存設(shè)備的臟數(shù)據(jù)是不會(huì)繼續(xù),因?yàn)檫@些臟數(shù)據(jù)將有可能使現(xiàn)在文件系統(tǒng)崩潰。
錯(cuò)誤處理
bcache嘗試處理IO錯(cuò)誤而不影響正常操作,但如果錯(cuò)誤數(shù)超過(guò)閥值(默認(rèn)是0,可配置)會(huì)關(guān)閉緩存並切換到透?jìng)髂J健?/p>
-如果是讀錯(cuò)誤則嘗試直接從后端設(shè)備讀
-如果是寫(xiě)直達(dá)寫(xiě)錯(cuò)誤,將緩存對(duì)應(yīng)數(shù)據(jù)塊設(shè)置為無(wú)效
-去綁定時(shí),刷回臟數(shù)據(jù)。臟數(shù)據(jù)寫(xiě)回失敗目前是沒(méi)有處理的。
性能相關(guān)問(wèn)題
bcache有很多配置選項(xiàng)和可調(diào)參數(shù)。默認(rèn)值適合於典型配置,如果想要更好性能則需要調(diào)整相關(guān)參數(shù)。
-寫(xiě)性能差
如果寫(xiě)性能不理想,那么建議調(diào)到寫(xiě)回策略
#echo?writeback>/sys/block/bcache0/cache_mode
-性能差,或者流量並沒(méi)有緩存到SSD
默認(rèn)情況下,bcache不會(huì)緩存順序IO和大文件。
打開(kāi)順序IO緩存:
#echo?0>/sys/block/bcache0/bcache/sequential_cutoff
設(shè)置回默認(rèn)值:
#echo?4M>/sys/block/bcache0/bcache/sequential_cutoff
-流量小,緩存不命中
現(xiàn)實(shí)生活中,並不是所有SSD都能提供足夠快的速度作為磁盤(pán)的緩存,特別一個(gè)SSD作為多塊磁盤(pán)的緩存,或者順序IO時(shí)。所以需要避免SSD成為系統(tǒng)瓶頸。
為了避免bcache設(shè)備因?yàn)镾SD變慢,當(dāng)延遲超過(guò)閥值時(shí)逐漸減少流量。需要關(guān)閉擁塞控制項(xiàng):
#echo?0>/sys/fs/bcache//congested_read_threshold_us
#echo?0?>/sys/fs/bcache//congested_write_threshold_us
對(duì)於讀,默認(rèn)值是2000us(2ms),對(duì)於寫(xiě)是20000.
SYSFS - 后端設(shè)備
/sys/block//bcache, /sys/block/bcache*/bcache, /sys/fs/bcache//bdev*
SYSFS - 緩存集合
/sys/fs/bcache/
SYSFS - 緩存設(shè)備
/sys/block//bcache
英文:Documentation/bcache.txt
使用 LVM (基於dm-cache) 新的緩存特性
如果你有一臺(tái)帶有慢速硬盤(pán)和快速SSD的電腦,你想使用SSD作為快速持久緩存用來(lái)提升訪問(wèn)硬盤(pán)的速度。然而直到最近,你有三個(gè)選擇:bcache和dm-cache都upstream,或者Flashcache/EnhanceIO。Flashcache不是upstream。dm-cache要求你首先坐下來(lái),使用計(jì)算器計(jì)算塊的偏移。bcache是三個(gè)選擇中最全面的。
但是最近LVM已經(jīng)增減了緩存的支持(構(gòu)建在dm-cache之上),因此在理論上,你能讓已存在的邏輯卷轉(zhuǎn)換到已緩存的設(shè)備。
安裝
為了在實(shí)踐中了解是怎樣工作的,我在以前的無(wú)盤(pán)虛擬群集中添加了3塊硬盤(pán)。
在鏡像配置中有兩個(gè)2TB的WD硬盤(pán)。通過(guò)藍(lán)色(冷)線連接。在左側(cè)是三星EVO 250GB SSD,作為緩存的紅色(熱)盤(pán)。
另一個(gè)新聞:哦,現(xiàn)在品牌制造商的SSD是真的便宜!
lsblk輸出如下,sda和sdb是WD硬盤(pán),sdc是三星SSD:
性能
在創(chuàng)建 緩存之前,先看看硬盤(pán)的速率如何. ?以下數(shù)據(jù)包含了 ext4 和 LVM overhead (ie. 體現(xiàn)在文件系統(tǒng)里,並非塊存儲(chǔ)). 我還用了 O_DIRECT.
HDD writes: 114 MBytes/sec?HDD reads: 138 MBytes/sec?SSD writes: 157 MBytes/sec?SSD reads: 197 MBytes/sec
這些數(shù)字並沒(méi)有體現(xiàn)出SSDs的好處?— 就是隨機(jī)訪問(wèn)硬盤(pán)時(shí),性能沒(méi)有什么區(qū)別.
Terminology
lvmcache(7) [沒(méi)有什么能拷貝的地方] 文檔指出了一些用到的術(shù)語(yǔ):
創(chuàng)建 LVs
文檔中很誇張的提到,移除錯(cuò)誤的?LV 將會(huì)完全顛覆之前的 OriginLV, 為了測(cè)試這一特性我 在有幾個(gè)鏡像文件的慢速HDDs上創(chuàng)建了一個(gè) OriginLV:
需要注意的是resizing cached LVs功能目前並未提供 (可能以后出來(lái) — 現(xiàn)在只能先移除緩存,從新分配大小再重新創(chuàng)建緩存).
創(chuàng)建緩存層
從文件的角度來(lái)說(shuō),這並不明確,但是一切都必須在一個(gè)簡(jiǎn)單的卷組中.也就是說(shuō),你必須創(chuàng)建一個(gè)既包括慢速和快速的磁盤(pán)卷組 - 它並不是簡(jiǎn)單工作。
因此,我的第一個(gè)步驟是擴(kuò)大我現(xiàn)有的VG ,包括快盤(pán):
我創(chuàng)建了快速的SSD兩個(gè)LVs 。一個(gè)是CacheDataLV ,這就是緩存發(fā)生。另一個(gè)是用於存儲(chǔ)被高速緩存在CacheDataLV的數(shù)據(jù)塊的索引的CacheMetaLV 。該文件說(shuō), CacheMetaLV應(yīng)該是千分之一的CacheDataLV的大小,但最少為8MB 。由於我的總可用空間快是232GB ,而我希望有一個(gè)1000:1的分裂,我大方的選擇一個(gè)1GB的CacheMetaLV , 229G的CacheDataLV ,而且會(huì)留下一些遺留下來(lái)的空間(我最終的分割結(jié)果是229:1 ) 。
(你會(huì)發(fā)現(xiàn),我的緩存大於我的測(cè)試OriginLV ,但是這很好,因?yàn)橐坏┪乙呀?jīng)制定了所有的陷阱,我真正的OriginLV將超過(guò)1 TB).
為什么要在PV上留下2.88GB的空間?我也不太清楚,只是第一次使用時(shí),我並沒(méi)有預(yù)留空間,結(jié)果執(zhí)行?lvconvert命令后 [如下] 提示需要1GB的擴(kuò)展空間。
把 CacheDataLV和CacheMetaLV 放到“緩存池”里 :
接著把緩存池連到OriginLV來(lái)創(chuàng)建最終的緩存工程:
結(jié)果
看起來(lái)還不錯(cuò)? 在使用緩存 LV后,得到的數(shù)據(jù)如下:
LV-cache writes: 114 MBytes/sec?LV-cache reads: 138 MBytes/sec
和原來(lái)硬盤(pán)的結(jié)果一致.
接下來(lái)我會(huì)創(chuàng)建一些請(qǐng)求,然后看看他們的性能如何?(就是剛才我提到的問(wèn)題).
總結(jié)
以上是生活随笔為你收集整理的linux控制cache使用值e,[轉]Linux塊設備加速緩存bcache和dm-cache:使用SSD來加速服務器...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 软件工程学习笔记概要
- 下一篇: 3_树莓派机载计算机的硬件资源样例教程—