頻道欄目
首頁 > 資訊 > 云計算 > 正文

深入理解SPKD之重要API接口

19-02-19        來源:[db:作者]  
收藏   我要投稿

掌握SPDK 常用的API是深入理解SPDK的好方法。下面總結了SPDK 最主要的一些API。

public Interface

spdk/nvme.h
Key Functions   Description
spdk_nvme_probe()   Enumerate the bus indicated by the transport ID and attach the userspace NVMe driver to each device found if desired.
spdk_nvme_ctrlr_alloc_io_qpair()    Allocate an I/O queue pair (submission and completion queue).
spdk_nvme_ctrlr_get_ns()    Get a handle to a namespace for the given controller.
spdk_nvme_ns_cmd_read()     Submits a read I/O to the specified NVMe namespace.
spdk_nvme_ns_cmd_readv()    Submit a read I/O to the specified NVMe namespace.
spdk_nvme_ns_cmd_read_with_md()     Submits a read I/O to the specified NVMe namespace.
spdk_nvme_ns_cmd_write()    Submit a write I/O to the specified NVMe namespace.
spdk_nvme_ns_cmd_writev()   Submit a write I/O to the specified NVMe namespace.
spdk_nvme_ns_cmd_write_with_md()    Submit a write I/O to the specified NVMe namespace.
spdk_nvme_ns_cmd_write_zeroes()     Submit a write zeroes I/O to the specified NVMe namespace.
spdk_nvme_ns_cmd_dataset_management()   Submit a data set management request to the specified NVMe namespace.
spdk_nvme_ns_cmd_flush()    Submit a flush request to the specified NVMe namespace.
spdk_nvme_qpair_process_completions()   Process any outstanding completions for I/O submitted on a queue pair.
spdk_nvme_ctrlr_cmd_admin_raw()     Send the given admin command to the NVMe controller.
spdk_nvme_ctrlr_process_admin_completions()     Process any outstanding completions for admin commands.
spdk_nvme_ctrlr_cmd_io_raw()    Send the given NVM I/O command to the NVMe controller.
spdk_nvme_ctrlr_cmd_io_raw_with_md()    Send the given NVM I/O command with metadata to the NVMe controller. 

NVME Driver Design

NVME IO 提交

nvme_ns_cmd_xxx :以 nvme submittin queue entry 的形式 提交IO請求到queue pair; 無阻塞,提交完先于IO完成返回;

spdk_nvme_qpair_process_completions():應用程序通過這個API 在每個queue pair 上polling查詢在飛 的IO是否完成;

擴展的性能

NVME 驅動內部的內存使用

數據路徑上zero-copy, 這事因為IO commands沒有data buffer; 但是admin queue 可能含有數據copy,取決于用戶使用的API;

每一個queue隊列 擁有一組跟蹤調用者提交的命令的tracker; tracker的數量 取決于用戶輸入(指定的) queue size 和從capacitity 寄存器Maximum Queue Entries Supported(MQES, 0 based value) 字段讀回的值;

每個tracker 4096 Bytes (4KB), 最大的maximum memory used for each I/O queue is: (MQES + 1) * 4 KiB.

spdk_nvme_qpair_process_completions(). SQE 64B (submit queue entry size) CQE 16B (completion queue size) 每個IO queue pair 最多需要的內存大。 (MQES + 1) * (64 + 16) Bytes

上面的內存可以可以分配到host memory; 一些可能把它放到PCI memory bar上

SPDK 內部代碼層次

代碼是被分層的:

底層: nvme 命令層; API包括spdk_nvme_xxxx: 所在文件在:
示例程序:examples/nvme/hello_world/hello_world.c 中間層: spdk bdev 層,瘋轉了好需要更多細節的nvme command ,提供對外的類似操作塊一樣的接口:spdk_blk_xxxx;
示例程序:.//examples/bdev/hello_world/hello_bdev.c

上層:blob 實現了上面類似于快的塊資源分配的功能;
示例程序:.//examples/blob/hello_world/hello_blob.c

應用層: blobfs 實現了非POSIX的資源管理和申請、分配;
( demo用那種形式寫塊?可讀性高?)

問題:上面基于nvme. 命令和bdev接口的對nvme SSD的讀寫的對比,性能方便回有什么損失么?為什么?

相關TAG標簽
上一篇:臺積電:絕大多數7nm客戶都會轉向6nm_IT新聞_博客園
下一篇:最后一頁
相關文章
圖文推薦

關于我們 | 聯系我們 | 廣告服務 | 投資合作 | 版權申明 | 在線幫助 | 網站地圖 | 作品發布 | Vip技術培訓 | 舉報中心

版權所有: 紅黑聯盟--致力于做實用的IT技術學習網站

美女MM131爽爽爽毛片