SPDK发布V19.10新版本啦!
新版本性能有很大的提升:
NVMe over TCP Target的相关优化提高了单个CPU Core的性能30%
SPDK NVMe初始化时间得到了10倍的改进,以增强应用程序重启的可服务性
此版本包含以下新功能
分区bdev API:区域是bdev接口的扩展。该概念来自ATA / SCSI,目前正作为NVMe TP使用。现在可以查询Bdev以检查区域语义。
Opal bdev:已添加新的opal bdev,以支持通过Opal规范管理NVMe自加密驱动器。此功能目前是实验性的。
NVMe字符设备:添加了基于CUSE库的NVMe字符设备实现。它允许在Linux内核中为控制器和名称空间(即/ dev / nvmeXnY)创建NVMe设备节点。这些字符设备可由nvme-cli之类的工具使用。此功能目前是实验性的。
通过RPC挂载BlobFS :通过RPC挂载BlobFS并添加到主机的路径上。
OCF:添加了对OCF v19.06的支持。添加了只写,写无效和写回模式支持。
DPDK:添加了对DPDK 19.08的支持。
RPC名称:在不同组件之间简化的RPC调用的名称。以前的RPC名称可用,但是将不建议使用。
完整版本更新于:https://github.com/spdk/spdk/releases/tag/v19.10
点击阅读全文获取最新SPDK19.10版本
rpc
在此版本中,许多SPDK的RPC被重命名为更加一致和直观。
旧名称将继续使用,但是将显示弃用警告。
在'bdev_nvme_set_options'RPC方法中添加了可选参数'--arbitration-burst'和'--low / medium / high-priority-weight' 。
在'construct_null_bdev'RPC方法中添加了可选参数'--md-size'。
在'construct_null_bdev'RPC方法中添加了可选参数'--dif-type'和'--dif-is-head-of-md' 。
添加了blobfs_detect
RPC方法来检测给定bdev上是否存在blobfs。
添加了blobfs_create
RPC方法以在给定的bdev上构建blobfs。
添加了blobfs_mount
RPC方法,以通过FUSE将给定bdev上的blobfs挂载到主机路径。
然后,在主机路径上,用户可以直接执行一些文件操作,这些文件操作将映射到blobfs。
bdev
向spdk_bdev_io_complete_nvme_status()
和spdk_bdev_io_get_nvme_status()
中添加了新参数cdw0,该参数允许设置/获取NVMe完成队列DW0条目。这允许供应商特定的IO命令将命令特定的完成信息返回给启动器。
添加了spdk_bdev_get_write_unit_size()
用于检索写操作所需的逻辑块数的功能。
新的与区域相关的字段已添加到get_bdevs
RPC调用的结果中:
zoned
:指示该设备是分区设备还是常规阻止设备zone_size
:单个区域中的块数max_open_zones
:最大开放区域数optimal_open_zones
:开放区域的最佳数量该zoned
字段是一个布尔值,并且始终存在,而其余字段仅适用于分区的bdev。新功能spdk_bdev_open_ext已添加,并且
spdk_bdev_open
功能被弃用。
新的open函数引入了提供回调函数的需求,该回调函数将被诸如bdev删除之类的异步事件调用。spdk_bdev_open_ext
函数接受bdev名称作为参数,而不是bdev结构,以避免在调用(根据名称获取其结构)和实际打开bdev之间删除bdev时出现竞争状态。
添加了新的“调整大小”事件,以通知有关块设备的块计数属性的更改。
仅当使用spdk_bdev_open_ext
功能打开了块设备时,才传送事件。
zone bdev API
为分区的bdev添加了新的公共头。分区bdev是bdev接口的扩展。
spdk_bdev_get_zone_size()
,spdk_bdev_get_max_open_zones()
,spdk_bdev_get_optimal_open_zones()
被用于检索分区的设备信息添加的API。spdk_bdev_get_zone_info()
添加了API,以检索有关分区设备中区域的信息。
添加了spdk_bdev_zone_management()
用于更改区域状态的API。spdk_bdev_zone_append()
并且spdk_bdev_zone_append_with_md()
添加了用于将数据追加到区域的API 。
添加了spdk_bdev_io_get_append location()
用于检索I / O附加位置的功能。
添加了spdk_bdev_is_zoned()
用于检查bdev是否支持分区名称空间语义的功能。
Opal bdev
实验:已添加新的Opal bdev,以支持通过Opal规范支持对NVMe自加密驱动器的管理。如果包含该命名空间的控制器支持Opal ,则用户可以从NVMe命名空间bdev创建opal bdev 。当前仅支持名称空间ID = 1。下面的RPC已添加到支持Opal:bdev_nvme_opal_init
,bdev_nvme_opal_revert
,bdev_opal_create
,bdev_opal_delete
,bdev_opal_get_info
,bdev_opal_new_user
,bdev_opal_set_lock_state
。
它不支持在应用程序重启后重新创建Opal bdev。该bdev模块应被视为非常试验性的,并且RPC在将来的发行版中可能会发生重大变化。
delay bdev
添加了bdev_delay_update_latency
以允许用户更新给定的延迟bdev的延时值。
compress bdev
一个新的RPC bdev_compress_get_orphans被添加到compress bdevs列表中,由于缺少持久化Metadata文件而无法加载。在这种情况下只能删除它们。
null bdev
元数据支持已添加到Null bdev模块。
保护信息支持已添加到Null bdev模块。
nvme
添加no_shn_notification
到NVMe控制器初始化选项后,用户可以为NVMe控制器启用它。启用该选项后,控制器将不会执行关闭过程,而只是禁用控制器,用户可以稍后再次启动其应用程序以将控制器初始化为就绪状态。
添加了一个控制器标志SPDK_NVME_CTRLR_WRR_SUPPORTED
,以指示控制器
可以支持加权轮循仲裁功能与提交队列。
为仲裁功能增加arbitration_burst
选项,并增加三个low/medium/high_priority_weight
加权轮循仲裁选项。
新增spdk_nvme_ns_cmd_write_uncorrectable
。
添加了新的错误处理和报告功能。这包括几个新的API函数,用以在qpair或
控制器发生故障时促进应用程序恢复。
spdk_nvme_ctrlr_reconnect_io_qpair
-重新连接失败的I / O qpair。spdk_nvme_ctrlr_set_trid
-设置现有控制器的Trid。在故障转移情况下可以用来更改trid。
spdk_nvme_ctrlr_is_failed
-返回控制器的失败状态。spdk_nvme_ctrlr_fail
-强制控制器进入故障状态。
修改了多个API函数的返回行为,以便在qpair失败时更好地向应用程序指示。此功能列表包括:
spdk_nvme_qpair_process_completions
spdk_nvme_ns_cmd_*
spdk_nvme_ctrlr_process_admin_completions
spdk_nvme_ctrlr_cmd_*
现在,当这些函数在其上运行的qpair或控制器发生故障时,它们将返回-ENXIO 。
实验:添加了NVMe字符设备支持,以允许在Linux内核中为控制器以及命名空间创建NVMe设备节点,并照常从Linux环境中处理ioctl请求。
nvmf
该spdk_nvmf_tgt_create
函数现在接受类型的对象spdk_nvmf_target_opts
作为其唯一参数。这个新结构包含先前传递给该函数的max_subsystems参数。
添加了新的公共API函数spdk_nvmf_get_tgt
,该函数允许用户通过提供对象名称来检索指向该spdk_nvmf_tgt
对象的指针。在RPC或应用程序仅创建单个目标的特殊情况下,此函数可以接受空名称参数,并将返回唯一可用的目标。
现在,大多数NVMe-oF RPC都接受可选的tgt_name参数。这将使这些RPC与创建多个目标的应用程序一起使用。
三个新的NVMe-oF RPC被添加,nvmf_create_target
,nvmf_delete_target
和nvmf_get_targets
。这些新的RPC提供了用于管理多个目标对象的基本接口。在SPDK中,目标对象定义了唯一的发现服务。从此版本开始,这些RPC不能与树状SPDK目标应用程序spdk_tgt和nvmf_tgt一起使用,它们使用单个全局目标结构。因此,它们不包含在scripts / rpc.py中。还添加了三个新的标头函数,以帮助处理多个目标。
spdk_nvmf_tgt_get_name
将目标指针作为参数并返回其可读名称。spdk_nvmf_get_first_target
不接受任何参数,并返回全局列表中的第一个目标。spdk_nvmf_get_next_tgt
将目标指针用作参数并返回全局列表中的下一个指针。
spdk_nvmf_tgt_accept
接受额外的参数,允许传递任意的new_qpair
回调信息。当具有多个nvmf目标或不适合从全局变量检索上下文信息时,这将简化代码。
blobstore
新功能spdk_bdev_create_bs_dev_from_desc已添加,并且不建议使用spdk_bdev_create_bs_dev功能。
新的create函数可以与spdk_bdev_open_ext
函数协同使用,后者提供回调函数,可以通过异步事件(如bdev移除)调用该回调函数。
blobfs_bdev
添加了一个新的blobfs模块bdev,以简化bdev在bdev上的操作。
添加spdk_blobfs_bdev_detect函数来检测给定块上是否存在blobfs设备。
添加spdk_blobfs_bdev_create函数来在给定块设备上创建blobfs。
通过FUSE 将函数spdk_blobfs_bdev_mount添加到给定块设备上的blobfs挂载到主机路径,然后,专门为一个挂载点创建一个新线程来处理blobfs API的FUSE请求。
build
选项将FUSE组件构建到blobfs_bdev模块中,以便安装blobfs文件系统。
这需要安装libfuse3。默认情况下,它是禁用的。如果./configure
与--with-fuse
选项一起运行,它将被启用。
iSCSI
iSCSI Portal (入口)将不再与cpumask关联。新的连接的调度转向更加动态的机制。
添加一个新的RPCiscsi_portal_group_set_auth来设置特定于现有iSCSI Portal组的CHAP的认证。此RPC通过iSCSI Portal组的全局参数覆盖设置。
socket
添加spdk_sock_is_connected
以检查套接字当前是否已连接。spdk_sock_group_poll
现在返回成功事件的数量。
env
添加spdk_pci_device_unclaim()
了清理pciq声明文件的功能。
event
framework_start_init
RPC在初始化期间,不再因错误而停止应用程序。
DPDK
将DPDK子模块更新为DPDK 19.08。
ocf
将OCF子模块更新为OCF v19.06
与更新一起,添加了新的缓存模式“只写”。
通过RPC添加了新的缓存模式,可以使用wi-写入无效和wa-写入。
新版本的OCF提供了完全异步的管理API。
特别感谢
本次版本包含来自44位作者的845次提交,其中包含超过44k行代码更改。我们特别要感谢所有第一次提交代码的贡献者:
Benjamin Saunders
Kay Bouché
Marcin Dzięgielewski
Michael Haeuptle
Michal Ben Haim
Tom Nabarro
Yang Fan
Yan Wang
Yao Liu
SPDK开源社区衷心感谢大家的贡献和努力!