linux内存加速硬盘缓存,linux块设备加速缓存之bcache
linux塊設(shè)備加速緩存之bcache
什么是bcache
轉(zhuǎn)載請注明出處:http://blog.csdn.net/liumangxiong
bcache是linux內(nèi)核塊層cache。它使用類似SSD來作為HDD硬盤的cache,從而起到加速作用。
HDD硬盤便宜并且空間更大,SSD速度快但更貴。如果能兩者兼得,豈不快哉?bcache能做到。
bcache使用SSD作為其他塊設(shè)備cache。類似ZFS的L2Arc,但bcache還增加了寫回策略,并且是與文件系統(tǒng)無關(guān)的。bcache被設(shè)計(jì)成只需要最小的代價(jià),無需配置就能在所有環(huán)境中工作。默認(rèn)狀態(tài)下bcache不緩存順序IO,只緩存隨機(jī)讀寫。bcache適用于桌面、服務(wù)器,高級存儲陣列,甚至是嵌入式環(huán)境。
設(shè)計(jì)bcache目標(biāo)是讓被緩存設(shè)備與SSD一樣快(包括緩存命中、緩存不命中、透寫和回寫)。現(xiàn)在還未達(dá)到初衷,特別是順序?qū)憽M瑫r(shí)測試結(jié)果表明離目標(biāo)很接近,甚至有些情況下表現(xiàn)更好,例如隨機(jī)寫。
bcache是數(shù)據(jù)安全的。對于寫回策略緩存來說,可靠性是非常重要的,出錯(cuò)就意味著丟失數(shù)據(jù)。bcache是用電池備份陣列控制器的替代選擇,同時(shí)也要求bcache在異常掉電時(shí)也是數(shù)據(jù)安全的。對于寫而言,必須在所有數(shù)據(jù)寫到可靠介質(zhì)之后才能向上層返回寫成功,在異常掉電情況下,寫不能是部分完成的。大量工作已經(jīng)投入到這部分?jǐn)?shù)據(jù)安全的工作中。
bcache性能設(shè)計(jì)目標(biāo)是等同于SSD。最大程度上去最小化寫放大,并避免隨機(jī)寫。bcache將隨機(jī)寫轉(zhuǎn)換為順序?qū)?#xff0c;首先寫到SSD,然后回寫緩存使用SSD緩存大量的寫,最后將寫有序?qū)懙酱疟P或者陣列上。對于RAID6陣列,隨機(jī)寫性能很差,還要花費(fèi)不菲的價(jià)格購買帶有電池保護(hù)的陣列控制器。現(xiàn)在有了bcache,你就可以直接使用linux自帶的優(yōu)秀軟RAID,甚至可以在更廉價(jià)的硬件上獲取更高的隨機(jī)寫性能。
特性
1、一個(gè)緩存設(shè)備可以作為多個(gè)設(shè)備的緩存,并且可以在設(shè)備運(yùn)行時(shí)動態(tài)添加和刪除緩存。
2、異常關(guān)機(jī)恢復(fù),只有當(dāng)寫到磁盤后緩存才會確認(rèn)寫完成。
3、正確處理寫阻塞和刷緩存
4、支持writethrough, writeback和writearound
5、檢測并避開順序IO(可配置關(guān)閉該選項(xiàng))
6、當(dāng)檢測到SSD延遲超過配置邊界值,減少到SSD流量(當(dāng)一個(gè)SSD作為多個(gè)磁盤緩存時(shí)使用)
7、緩存不命中時(shí)預(yù)讀(默認(rèn)關(guān)閉)
8、高性能的writeback實(shí)現(xiàn):臟數(shù)據(jù)都是排序后再回寫。如果設(shè)置了writeback水位線,PD控制器會根據(jù)臟數(shù)據(jù)比例來平滑處理到后臺writeback流量。
9、使用高效率了B+樹,bcache隨機(jī)讀可以達(dá)到1M IOPS
10、穩(wěn)定,已經(jīng)有產(chǎn)品應(yīng)用
性能
7/25/12 隨機(jī)測試
在我的測試機(jī)上,我將SSD盤劃分為兩個(gè)相同大小的分區(qū),一個(gè)分區(qū)用于測試SSD裸盤,另一個(gè)作為硬盤緩存。
bcache配置修改:cache_mode設(shè)置為writeback,writeback_percent設(shè)置為40。(如果writeback_percent不為0,bcache使用PD控制器根據(jù)緩存的臟數(shù)據(jù)塊來平滑處理下發(fā)到磁盤的流量)。同時(shí)還關(guān)閉了擁塞閥值,因?yàn)楫?dāng)SSD延遲達(dá)到極限時(shí),如果bcache切換到writethrough將會影響結(jié)果。
SSD盤為Intel 160G MLC SSD,也就是Intel SSDSA2M160。
FIO作為性能測試,測試腳本如下:
[global] randrepeat=1 ioengine=libaio bs=4k ba=4k size=8G direct=1 gtod_reduce=1 norandommap iodepth=64
FIO運(yùn)行在SSD裸設(shè)備上,但對于這類性能測試軟件來說應(yīng)該沒有影響。
裸SSD設(shè)備上隨機(jī)寫測試結(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ū)懻埱蟀l(fā)送到SSD,但額外加入了更新索引的開銷。bcache對隨機(jī)寫做了優(yōu)化,bcache還從高IO深度(64)獲益,因?yàn)樵诟逫O深度的情況下就可以將多次下標(biāo)更新合并為一次寫請求。
高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)了波動。對于不同的寫模型會有不同的結(jié)果,我們只關(guān)注兩者的相對數(shù)值。
當(dāng)測試隨機(jī)4K寫,IO深度為1時(shí),bcache寫次數(shù)是裸SSD設(shè)備的兩倍:每一次寫都需要再更新一次索引。
隨機(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ī)寫下去的數(shù)據(jù),這樣的測試模型對于bcache是不好的。這意味btree都是4K大小,btree將比通常時(shí)候大得多。在實(shí)際應(yīng)用中,平均大小是100K。btree變大就意味著索引占用更大的內(nèi)存空間,并且有一部分是在二級索引。根據(jù)個(gè)人經(jīng)驗(yàn)這些開銷在大型機(jī)器IOPS超過500K時(shí)才會有實(shí)際影響。
如果大家有其他的測試方法或者我的測試方法中有什么問題請通知郵件告訴我。
常見問題
關(guān)機(jī)、設(shè)備移除
系統(tǒng)關(guān)機(jī)時(shí)cache仍然是臟的,就是說后端磁盤的數(shù)據(jù)并不可靠。如果要保證后端磁盤數(shù)據(jù)是安全的,就需要手動移動cache或者將cache設(shè)置為writethrough模式。
自動掛載
bcache會自動匹配cache和后端設(shè)備。匹配過程與設(shè)備對系統(tǒng)可用的次序沒有關(guān)系。
帶bcache的根目錄分區(qū)
為了讓根分區(qū)能夠使用bcache,需要添加rootdelay=3到啟動參數(shù),這樣才能讓udev規(guī)則在系統(tǒng)mount根文件系統(tǒng)之前運(yùn)行。
已格式化過的磁盤或分區(qū)
如果一個(gè)分區(qū)或者磁盤設(shè)備啟動時(shí)沒有創(chuàng)建bcache,可能是因?yàn)槌墘K發(fā)生錯(cuò)誤。為了讓bcache能夠正確檢測到之前的設(shè)備,udev規(guī)則會首先檢查是否符合bcache規(guī)則和blkid檢查。udev規(guī)則檢查設(shè)備超級塊從而識別文件系統(tǒng)類型,如果該超級塊不符合bcache文件系統(tǒng)類型那么就不會添加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將通過以下指令自動構(gòu)建:
# make-bcache -B /dev/sdc /dev/sdd -C /dev/sda2
因?yàn)樵O(shè)備/dev/sdc和/dev/sdd標(biāo)識了bcache文件系統(tǒng),因此會在系統(tǒng)啟動時(shí)自動添加,而/dev/sda2則需要手動添加。在/dev/sda2偏移1024處仍殘留有之前文件系統(tǒng)的超級塊信息,而bcache信息是從4096偏移開始記錄,修復(fù)的方法是:
# dd if=/dev/zero count=1 bs=1024 seek=1 of=/dev/sda2
在系統(tǒng)重啟之后所有磁盤被正確識別:
# 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
同樣地,殘留超級塊還會引起類似的其他錯(cuò)誤。
英文地址:http://bcache.evilpiepirate.org/
總結(jié)
以上是生活随笔為你收集整理的linux内存加速硬盘缓存,linux块设备加速缓存之bcache的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: stm32毕业设计 NBIOT远程通信系
- 下一篇: 一种linux平台下算法库二进制文件加密