作者簡介:惠春陽,Intel 軟件工程師,主要從事spdk,isa-l開發和存儲軟件性能優化的工作。
緩存助力存儲加速
隨着用戶對存儲速度的要求越來越高,市面上出現了很多高速,超高速的存儲設備,比如借助Intel® Optane技術實現的NVDIMM, NVMe SSD等。然而,受限於成本因素,這類高速設備目前並沒有大量普及,數據中心依然被SATA SSD甚至HDD占據。SPDK 在 19.01 的release中,引入了新的bdev模塊OCF(全稱:Open CAS Framework),可以充分利用高速介質(內存,Optane SSD,NVMe SSD等)為其他已有的bdev提供緩存服務來提高吞吐量。
OCF是Intel® CAS (Intel® Cache Acceleration Software) 的開源版本, 要了解OCF就要先從CAS講起。
OCF與SPDK介紹及用法
1、什么是CAS?
CAS是 Intel® 通過I/O分類和在高速介質上緩存經常使用的數據來加速存儲性能而開發的企業級軟件解決方案。支持Linux和Windows平台。CAS通過加載到kernel的方式,將一塊高速盤和慢速盤“融合”為一塊盤,像其他的物理盤一樣,掛載到文件系統上。因此不需要對系統或應用做任何修改就可以使用,可以認為CAS運行在內核態。
CAS 通過和內存的交互管理建立多層次的緩存,來優化系統內存的使用,同時也能夠自動根據數據本身特性去確定最好的緩存分配。CAS 目前已經在業界廣泛使用,能夠以很小的額外成本,顯著提升I/O性能。
CAS 引入了很多術語,在后面的介紹中都會用到。首先,我們把大容量,慢速的存儲設備稱為core device, 在上圖中可以認為HDD就是core device. 然后把小容量,高速的存儲設備稱為cache device。
CAS提供了五種工作模式:
(1)Write-Through(WT):
I/O在寫到cache device的同時,也會直接write-through到后端的core device。WT模式保證了數據在core device和cache device總是同步的,因此不用擔心突然掉電造成的緩存數據丟失。因為每次數據依然要寫到慢速的后端設備,所以這個模式只能夠加速數據讀取的過程.
(2)Write-Back (WB):
I/O寫時,數據首先寫到cache device,然后就會告訴應用寫完畢。這些寫操作會周期性的寫回到core device。這里CAS可以選擇不同的cleaning policy。比如ALRU(Approximately Least Recently Used),ACP(Aggressive Cleaning Policy)或者 NOP(No Operation,即不自動寫回,而由用戶主動的做flush操作)。因此,WB模式能夠既加速讀操作,又加速寫操作。但是也會有突然掉電造成緩存數據沒有及時寫回到core device而導致數據丟失的情況。
(3)Write-Around (WA):
講這個模式之前,先介紹一下緩存污染(cache pollution)。首先我們要知道cache device和core device其實是通過cache line和core line的mapping確定對應關系的。緩存污染表示很多不常用的數據被緩存到了cache device中。那么在后面新的寫I/O的情況下,沒有空閑的cache line,沒有足夠的空間去做mapping,此時需要逐出(evict)某條對應的cache line mapping,這就造成了額外的開銷。
WA模式有點類似於WT模式,不同的是,寫操作只有在cache line有對應的core line的情況下(即這部分數據已經被讀緩存過)會同時更新cache device和core device。其他情況,則直接寫到core device。因此WA模式也只能加速讀操作,並且保證了數據的一致性。而且還能避免緩存污染這樣的情況。
(4)Write-Invalidate(WI)
在這個模式中,只有讀操作會被map到緩存中。對於寫操作,會直接寫入到core device,同時,如果有對應的cache line在緩存中,就讓這條cache line變為無效。WI模式對於讀密集型I/O有更好的加速作用。並且能夠減少緩存的evict操作。
(5)Pass-Through (PT)
很好理解,PT模式即所有IO直接繞過cache device直接和core device交互。
2、 OCF 以及 SPDK
CAS 相當於企業版的OCF library + Linux Adapter。OCF 其實就是CAS 的cache engine的開源庫。
SPDK在v19.01中提供了SPDK Adapter, 整合了OCF。
OCF 在SPDK中作為一個新的 virtual bdev, 可以用不同的其他bdev作為core device和cache device。
3、OCF的配置和測試
講了這么多,我們來實戰一下。使用SPDK提供的fio-plugin來測試一下OCF能夠為你的慢速盤帶來多少活力。
(1)創建一個OCF vbdev。(首先,編譯SPDK)
./configure --with-fio=/path/to/fio/ --with-ocf make NRHUGE=10240 ./scripts/setup.sh
接下來,更新配置文件。OCF要求使用兩個bdev作為base bdev。OCF要使用的bdev也應出現在配置文件中。比如我們使用一個AIO設備和一個NVMe設備。我們可以使用example/bdev/fio_plugin 中的bdev.conf.in 作為配置文件。
[Nvme] TransportID "trtype:PCIe traddr:0000:81:00.0" Nvme0 #Split Nvme0 to 2 10GB pieces, leaving the rest inaccessible [Split] Split Nvme0n1 2 10240 [AIO] AIO /dev/sdb AIO0 [OCF] OCF wb_test wb Nvme0n1p1 AIO0
(2)fio測試
(更新example/bdev/fio_plugin 中的example_config.fio)
[global] ioengine=path/to/spdk/examples/bdev/fio_plugin/fio_plugin spdk_conf=path/to/spdk/examples/bdev/fio_plugin/bdev.conf.in thread=1 group_reporting=1 direct=1 verify=0 time_based=1 ramp_time=60 runtime=300 iodepth=128 rw=randrw bs=4k 更新過后,就可以啟動fio測試了。 fio example_config.fio--filename=wb_test
4、貢獻
SPDK作為一個日趨成熟的開源社區,正在以自己的影響力,帶動越來越多的Intel®或者第三方項目加入開源軟件的行列。而OCF就是這其中踴躍的參與者。我們始終歡迎越來越多的開發者加入進來,為開源存儲的發展貢獻力量。
歡迎訪問OCF 官方網站:
https://open-cas.github.io 以獲得更加詳細的文檔和資料。
也歡迎向OCF代碼庫:
https://github.com/Open-CAS/ocf 貢獻代碼。
References:
[1]https://www.Intel®.com/content/www/us/en/software/Intel®-cache-acceleration- software-performance.html
[2] https://open-cas.github.io/index.html
[3] https://spdk.io/news/2019/04/24/summit_presentations/
文章轉載自DPDK與SPDK開源社區
附加:
Linux下SSD緩存加速之open cas試用步驟
https://www.mr-mao.cn/archives/open-cas-linux-performance-testing.html