spdk-nvmf指南
spdk-nvmf指南
- 概述
- 名詞解釋
- nvme over fabric
- spdk nvmf
- nvmf initiator 和 target
- spdk nvmf target
- linux kernel NVMeOF initiator
- multipath
- 實(shí)踐注意事項(xiàng)
- 參考鏈接
概述
NVMe協(xié)議制定了本機(jī)高速訪問(wèn)PCIe SSD的規(guī)范,為了把本地高速訪問(wèn)的優(yōu)勢(shì)暴露給遠(yuǎn)端應(yīng)用, 誕生了NVMe-oF 協(xié)議。NVMe-oF target 是NVMe協(xié)議在不同傳輸網(wǎng)絡(luò) (transport) 上面的延伸。NVMe-oF 協(xié)議中的 transport 可以多種多樣, 諸如 Ethernet, Fibre Channel,Infiniband等。當(dāng)前比較流行的transport實(shí)現(xiàn)是基于RDMA的Ethernet transport, Linux Kernel 和SPDK的NVMe-oF target 都支持。
名詞解釋
nvme over fabric
- controller:nvme的字符設(shè)備,對(duì)應(yīng)為/dev/nvmeX,是我們下發(fā)控制命令的設(shè)備。
- namespace:nvme的塊設(shè)備,對(duì)應(yīng)為/dev/nvmeXnX,也是我們下發(fā)IO的設(shè)備。
- host:client端。
- target:處理client請(qǐng)求,連接實(shí)際存儲(chǔ)設(shè)備。
- transport:Transport是連接Host和Target的橋梁,可以是PCIE/RDMA/FC/TCP
- subNQN:用于識(shí)別遠(yuǎn)程N(yùn)VMe存儲(chǔ)目標(biāo)controller. 保存在identify controller
- EUI64/UUID/NGUID: 用于識(shí)別遠(yuǎn)程N(yùn)VMe namespace. 保存在NVMe Namespace Descriptor List,EUI64/NGUID同時(shí)保存在identify namespace
- 注意:spdk使用uuid作為identifier連接kernel nvme initiator,在重連的時(shí)候有bug,這個(gè)bug在kernel5.13上才被修復(fù)掉。
spdk nvmf
subsystem:spdk創(chuàng)建的nvme controller。相當(dāng)于nvme controller,擁有了subsystem就可以被nvme host識(shí)別到并掛載了,就算他名下沒(méi)有namespace。
nvmf initiator 和 target
主要介紹 linux kernel nvme initiator + spdk nvmf target。spdk的nvmf initiator使用方法和訪問(wèn)pcie盤類似,不再詳述。
spdk nvmf target
nvmf和vhost一樣都是spdk的一個(gè)模塊。啟動(dòng)nvmf模塊就相當(dāng)于啟動(dòng)了一個(gè)nvme over fabrics target。啟動(dòng)后可以通過(guò)rpc創(chuàng)建nvmf subsystem,并把bdev掛載到namespace上。最后通過(guò)監(jiān)聽端口,實(shí)現(xiàn)遠(yuǎn)端nvme initiator的訪問(wèn)。
spdk nvmf target 創(chuàng)建示例:
# 創(chuàng)建相應(yīng)的transport,可以使TCP或者RDMA python scripts/rpc.py nvmf_create_transport -t RDMA -u 8192 -p 2 -c 4096 # 創(chuàng)建一個(gè) bdev python scripts/rpc.py construct_malloc_bdev bdev_test # 創(chuàng)建一個(gè)NVM subsystem python scripts/rpc.py nvmf_create_subsystem nqn.2020-05.io.spdk:bdev_test -a -m 10 # -a = allow all # 給NVM subsystem 增加一個(gè)namespace,使用malloc bdev。 python scripts/rpc.py nvmf_subsystem_add_ns nqn.2020-05.io.spdk:bdev_test bdev_test -g 9EF1D3DAB2044ABA8F83B0427E58AEB0 # 讓nvmf subsystem監(jiān)聽對(duì)應(yīng)的端口,至此一塊nvmf 盤已經(jīng)建立成功,可以成功的被遠(yuǎn)端host discover到。 python scripts/rpc.py nvmf_subsystem_add_listener nqn.2020-05.io.spdk:bdev_test -t rdma -a 172.0.0.1 -s 4420linux kernel NVMeOF initiator
- nvme over fabrics驅(qū)動(dòng)默認(rèn)不會(huì)被加載,我們一般看到的nvme驅(qū)動(dòng)是pcie驅(qū)動(dòng)。我們使用modprobe nvme-rdma啟動(dòng) nvmf rdma驅(qū)動(dòng)
- 使用命令工具nvme讓nvme host掛載對(duì)應(yīng)target上的盤,下面是一個(gè)示例:
multipath
同一個(gè)subsystem在initiator端掛載兩次(例如從兩個(gè)IP連過(guò)來(lái)),initiator端能識(shí)別到兩次掛載實(shí)際上是同一塊盤,這就是multipath功能,開啟multipath有如下好處:;
linux kernel 4.15可以配置CONFIG_NVME_MULTIPATH啟動(dòng)multipath功能。啟動(dòng)之后,假設(shè)我們對(duì)用一個(gè)subsystem掛載兩次,nvme0和nvme1,/dev目錄會(huì)顯示如下
$ ll /dev/nvme* /dev/nvme0 /dev/nvme0n1 /dev/nvme1如果nvme0因?yàn)槟撤N原因斷開,只要nvme1不斷開,那么nvme0n1就會(huì)可用。
與之對(duì)應(yīng),如果不啟動(dòng)multipath,/dev目錄會(huì)顯示兩個(gè)controller和兩個(gè)namespace
實(shí)踐注意事項(xiàng)
參考鏈接
總結(jié)
以上是生活随笔為你收集整理的spdk-nvmf指南的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: c++的线程安全静态检查
- 下一篇: 分布式块存储QoS限速算法介绍与实践以及