SRP - SCSI RDMA Protocol

SRP - SCSI RDMA Protocol

SCSI RDMA 协议 (SRP) 旨在充分利用 InfiniBand 架构提供的协议卸载和 RDMA 功能。SRP 允许在 InfiniBand 架构上轻松使用大量 SCSI 软件。SRP 发起方控制与 SRP 目标的连接,以便提供对跨 InfiniBand 结构的远程存储设备的访问。kSRP Target驻留在IO单元中并提供存储服务。

SRP Initiator

该 SRP 启动器基于 OpenFabrics ( www.openfabrics.org ) 的开源代码,实现了 SCSI RDMA Protocol-2 (SRP-2)。SRP-2 在文档 # T10/1524-D 中进行了描述,可从http://www.t10.org获取。
SRP启动器支持

基本 SCSI 主命令 -3 (SPC-3)( www.t10.org/ftp/t10/drafts/spc3/spc3r21b.pdf )

基本 SCSI 块命令 -2 (SBC-2)( www.t10.org/ftp/t10/drafts/sbc2/sbc2r16.pdf )

基本功能、任务管理和有限的错误处理

Loading SRP Initiator

要加载 SRP 模块:

modprobe ib_srp(OFED驱动启动后执行该命令。)

或者

1. 在/etc/infiniband/openib.conf中将SRP_LOAD值设置为“ yes”。
2. 运行/etc/init.d/openibd restart以使更改生效。

备注:加载ib_srp模块时,可以设置模块参数srp_sg_tablesize.这是每个 I/O 收集/分散条目的最大数量(默认值:12)

SRP Module Parameters

加载SRP模块时,可以设置以下参数(可通过“modinfo ib_srp”命令查看):

参数说明
cmd_sg_entriesSRP 命令中收集/分散条目的默认数量(默认为 12,最大 255)
allow_ext_sg映射后有超过 cmd_sg_entries S/G 条目时的默认行为;false 时请求失败(默认 false)
topspin_workarounds启用 Topspin/Cisco SRP 目标错误的解决方法
reconnect_delay连续重新连接尝试之间的时间。SRP 启动器连续尝试重新连接到断开连接的目标之间的时间,直到 dev_loss_tmo 计时器到期(如果启用),之后 SCSI 目标将被删除
fast_io_fail_tmo观察到传输层错误与所有 I/O 失败之间的秒数。增加此超时可以提高对传输错误的容忍度,但是,这样做会增加发生严重传输故障时的总故障转移时间。注意:fast_io_fail_tmo 值必须小于 reconnect_delay 的值
dev_loss_tmoSRP 传输应隔离传输层错误的最大秒数。超过此时间后,SCSI 目标将被删除。通常建议将其设置为 -1(禁用),这永远不会删除 scsi_host。在不同 SRP 目标频繁连接和断开连接的部署中,可能需要启用此超时,以便清理代表不再存在的目标的旧 scsi_hosts

参数之间的约束:

dev_loss_tmo、fast_io_fail_tmo、reconnect_delay不能全部为disabled或负值。

reconnect_delay 必须为正数。

fast_io_fail_tmo 必须小于 SCSI 块设备超时。

fast_io_fail_tmo 必须小于 dev_loss_tmo。

SRP Remote Ports Parameters

多个 SRP 远程端口参数可在现有连接上在线修改。
将 dev_loss_tmo 修改为 600 秒

echo 600 > /sys/class/srp_remote_ports/port-xxx/dev_loss_tmo

将 fast_io_fail_tmo 修改为 15 秒:

echo 15 > /sys/class/srp_remote_ports/port-xxx/fast_io_fail_tmo

将 reconnect_delay 修改为 10 秒:

echo 20 > /sys/class/srp_remote_ports/port-xxx/reconnect_delayc

手动建立SRP连接

以下步骤描述如何手动加载启动器和 SRP 目标之间的 SRP 连接。

确保 ib_srp 模块已加载,SRP 目标可以访问 SRP 发起方,并且 SM 正在运行。

要与 SRP 目标建立连接并在 /dev 下为该目标创建 SRP (SCSI) 设备,请使用以下命令:

echo -n id_ext=[GUID value],ioc_guid=[GUID value],dgid=[port GID value],\
pkey=ffff,service_id=[service[0] value] > \
/sys/class/infiniband_srp/srp-mlx[hca number]-[port number]/add_target

有关如何获取此 echo 命令中的参数的说明,请参阅“ SRP 工具 - ibsrpdm、srp_daemon 和 srpd 服务脚本”部分。

注意事项:

> 执行上述“echo”命令可能需要一些时间
> 命令执行时 SM 必须正在运行
> 可以在 echo 命令中包含附加参数:
      > max_cmd_per_lun - 默认:62
      > max_sect(max_sectors 的缩写)- 设置命令的请求大小
      > io_class - 默认值:0x100,如规范的 rev 16A 中(在 rev 10 中,默认值为 0xff00)
      > tl_retry_count - 2..7 范围内的数字,指定 IB RC 重试计数。默认值:2
      > comp_vector,0..n-1 范围内的数字,指定 MSI-X 完成向量。一些 HCA 为每个 HCA 端口分配多个 (n) MSI-X 矢量。如果这些中断的 IRQ 关联掩码已配置为每个 MSI-X 中断由不同的 CPU 处理,则可以使用 comp_vector 参数将 SRP 完成工作负载分散到多个 CPU 上。
      > cmd_sg_entries,范围为 1..255 的数字,指定存储在 SRP_CMD 信息单元本身中的数据缓冲区描述符的最大数量。当allow_ext_sg=0时,参数cmd_sg_entries定义了单个SRP_CMD的最大S/G列表长度,并且S/G列表折叠后S/G列表长度超过此限制的命令将失败。
      > initiator_ext - 请参阅“从启动器 InfiniBand 端口到目标的多个连接”部分。
> 要列出通过 echo 命令添加的新 SCSI 设备,可以使用以下两种方法之一:
      > 执行“fdisk -l”。该命令列出所有设备;新设备包含在此列表中。
      > 执行“dmesg”或查看 /var/log/messages 以查找带有新设备名称的消息。

SRP sysfs Parameters

用于使 ib_srp 连接到新目标的接口。通过将逗号分隔的登录参数列表写入此 sysfs 属性,可以请求 ib_srp 连接到新目标。支持的参数有:

参数说明
id_ext16 位十六进制数字,指定 16 字节 SRP 目标端口标识符中的 8 字节标识符扩展。目标端口标识符由 ib_srp 在 SRP_LOGIN_REQ 请求中发送到目标。
ioc_guid一个 16 位十六进制数,指定 16 字节目标端口标识符的八字节 I/O 控制器 GUID 部分。
dgid指定目标 GID 的 32 位十六进制数。
pkey指定 InfiniBand 分区键的四位十六进制数字。
service_id16 位十六进制数字,指定用于与 SRP 目标建立通信的 InfiniBand 服务 ID。如何找出服务ID的值在SRP目标的文档中指定。
max_sect一个十进制数,指定通过单个 SCSI 命令传输的 512 字节扇区的最大数量。
max_cmd_per_lun一个十进制数,指定单个 LUN 的未完成命令的最大数量。
io_class指定 SRP I/O 类别的十六进制数字。必须是 0xff00(修订版 10)或 0x0100(修订版 16a)。I/O 类定义 SRP 发起方和目标端口标识符的格式。
initiator_ext16 位十六进制数字,指定 SRP 发起方端口标识符的标识符扩展部分。该数据由发起方在 SRP_LOGIN_REQ 请求中发送到目标。
cmd_sg_entries1…255 范围内的数字,指定存储在 SRP_CMD 信息单元本身中的数据缓冲区描述符的最大数量。当allow_ext_sg=0时,参数cmd_sg_entries定义单个SRP_CMD的最大S/G列表长度,并且S/G列表折叠后S/G列表长度超过此限制的命令将失败。
allow_ext_sg是否允许 ib_srp 在 SRP_CMD 中包含部分内存描述符列表而不是整个列表。如果部分内存描述符列表已包含在 SRP_CMD 中,则剩余内存描述符将通过附加 RDMA 传输从发起方传送到目标方。将allow_ext_sg 设置为1 可增加通过单个SCSI 命令在启动器和目标之间传输的最大数据量。由于并非所有 SRP 目标实现都支持部分内存描述符列表,因此该选项的默认值为 0。
sg_tablesize1…2048 范围内的数字,指定允许 SCSI 层传递给 ib_srp 的最大 S/G 列表长度。仅当启用部分内存描述符列表支持 (allow_ext_sg=1) 时,指定超过 cmd_sg_entries 的值才是安全的。
comp_vector0…n-1 范围内的数字,指定 MSI-X 完成向量。一些 HCA 为每个 HCA 端口分配多个 (n) MSI-X 矢量。如果这些中断的 IRQ 关联性掩码已配置为每个 MSI-X 中断由不同的 CPU 处理,则可以使用 comp_vector 参数将 SRP 完成工作负载分散到多个 CPU 上。
tl_retry_count2…7 范围内的数字,指定 IB RC 重试计数。

SRP Tools - ibsrpdm, srp_daemon and srpd Service Script

OFED 发行版提供了两个实用程序:ibsrpdm 和 srp_daemon:

它们检测发起者可到达的结构上的目标(步骤 1)

以适合在上述“echo”命令中使用的格式输出目标属性(步骤 2)

服务脚本 srpd 可以在堆栈启动时启动

这些实用程序可以在 /usr/sbin/ 下找到,并且是 srptools RPM 的一部分,可以使用 OFED 安装进行安装。有关这些实用程序的各种选项的详细信息由其手册页提供。

下面介绍了这些实用程序的几种使用场景。

ibsrpdm

ibsrpdm 具有以下作用:

  1. 检测可到达的目标。

要检测 SRP 启动器可通过默认 umad 设备 (/sys/class/infiniband_mad/umad0) 访问的所有目标,请执行以下命令:

ibsrpdm

此命令将在检测到的每个 SRP 目标上产生可读的输出信息。样本:

IO Unit Info:
     port LID:        0103
     port GID:        fe800000000000000002c90200402bd5
     change ID:       0002
     max controllers: 0x10
  controller[  1]
      GUID:      0002c90200402bd4
      vendor ID: 0002c9
      device ID: 005a44
      IO class : 0100
      ID:        LSI Storage Systems SRP Driver 200400a0b81146a1
      service entries: 1
      service[  0]: 200400a0b81146a1 / SRP.T10:200400A0B81146A1

要检测 SRP 启动器可通过另一个 umad 设备访问的所有 SRP 目标,请使用以下命令:

ibsrpdm -d <umad device>
  1. 协助创建 SRP 连接。

要生成适合在“手动建立 SRP 连接”部分中的“echo”命令中使用的输出,请将“-c”选项添加到 ibsrpdm:

ibsrpdm -c

示例输出:

id_ext=200400A0B81146A1,ioc_guid=0002c90200402bd4,
dgid=fe800000000000000002c90200402bd5,pkey=ffff,service_id=200400a0b81146a1

要使用上面“ibsrpdm -c”示例的输出建立与 SRP 目标的连接,请执行以下命令:

echo -n id_ext=200400A0B81146A1,ioc_guid=0002c90200402bd4,
dgid=fe800000000000000002c90200402bd5,pkey=ffff,service_id=200400a0b81146a1 > /sys/
class/infiniband_srp/srp-mlx5_0-1/add_target

SRP 连接现在应该已启动;新创建的 SCSI 设备应出现在通过“fdisk -l”命令获得的列表中。

  1. 在给定 InfiniBand HCA 名称和端口的情况下发现可访问的 SRP 目标,而不是仅通过运行/sys/class/infiniband_mad/umadwhere是数字。
srpd

srpd 服务脚本允许自动激活和终止所有系统活动 InfiniBand 端口上的 srp_daemon 实用程序。

srp_daemon

srp_daemon 实用程序基于 ibsrpdm 并扩展了其功能。除了上述 ibsrpdm 功能之外,srp_daemon 还可以:

自行建立SRP连接(无需发出“手动建立SRP连接”部分中描述的“echo”命令)

继续在后台运行,检测新目标并与它们建立 SRP 连接(守护进程模式)

给定 infiniband HCA 名称和端口,而不仅仅是通过数字来发现可到达的/dev/umadSRP目标

启用高可用性操作(与设备映射器多路径一起)

有一个配置文件来确定要连接的目标:

  1. srp_daemon 命令相当于 ibsrpdm:
"srp_daemon -a -o" is equivalent to "ibsrpdm"
"srp_daemon -c -a -o" is equivalent to "ibsrpdm -c"

注意:当 /etc/srp_daemon.conf 不为空时,这些 srp_daemon 命令的行为可能与等效的 ibsrpdm 命令不同。

  1. srp_daemon 对 ibsrpdm 的扩展。

要发现可从 HCA 设备 和端口 访问的 SRP 目标(并生成适合“echo”的输出),请执行:

host1# srp_daemon -c -a -o -i <InfiniBand HCA name> -p <port number>

注意:要获取 InfiniBand HCA 设备名称列表,您可以使用 ibstat 工具或运行“ls /sys/class/infiniband”。

要发现 SRP 目标并与它们建立连接,只需在上述命令中添加 -e 选项即可。

在不带 -a 选项的情况下通过端口执行 srp_daemon 将仅显示通过该端口可到达且启动器未连接的目标。如果使用 -e 选项执行,最好省略 -a。

建议使用-n选项。此选项将 initiator_ext 添加到连接字符串(请参阅“从启动器 InfiniBand 端口到目标的多个连接”部分)。

srp_daemon有一个可以设置的配置文件,默认为/etc/srp_daemon.conf。使用 -f 提供不同的配置文件来配置允许 srp_daemon 连接的目标。配置文件还可用于设置附加参数的值(例如,max_cmd_per_lun、max_sect)。

连续的后台(守护进程)操作,提供自动持续检测和连接功能。请参阅“自动发现和连接到目标”部分。

Automatic Discovery and Connection to Targets

确保 ib_srp 模块已加载,SRP 启动器可以到达 SRP 目标,并且 SM 正在运行。

要连接到结构中的所有现有目标,请运行“ srp_daemon -e -o”。该实用程序将扫描结构一次,连接到它检测到的每个目标,然后退出。

注意:srp_daemon 将遵循它在 /etc/srp_daemon.conf 中找到的配置。因此,它将忽略配置文件中不允许的目标。

要连接到结构中的所有现有目标以及连接到将加入结构的新目标,请执行 srp_daemon -e。该实用程序将继续执行,直到被用户终止或遇到连接错误(例如结构中没有 SM)。

要在所有端口上将 SRP 守护程序作为守护程序执行:
srp_daemon.sh(位于 /usr/sbin/ 下)。srp_daemon.sh 将其日志发送到 /var/log/srp_daemon.log。
启动srpd服务脚本,运行service srpd start

要使 openib.conf 中的更改生效,请运行:

/etc/init.d/openibd restart

Multiple Connections from Initiator InfiniBand Port to the Target

某些系统配置可能需要从 SRP 启动器到同一 SRP 目标的多个 SRP 连接:到同一目标 IB 端口,或到同一目标 HCA 上的不同 IB 端口。
在单个目标 IB 端口的情况下,即 SRP 连接使用相同路径,则为每个 SRP 连接使用不同的 initiator_ext 值来启用配置。initiator_ext 值是连接命令中指定的 16 位十六进制数字值。

此外,在从单个启动器 IB 端口到同一目标 HCA 上的两个不同 IB 端口的两个物理连接(即网络路径)的情况下,每个路径上需要不同的 initiator_ext 值。约定是使用目标端口 GUID 作为相关路径的 initiator_ext 值。

如果您使用带 -n 标志的 srp_daemon,它会根据此约定自动分配 initiator_ext 值。例如:

id_ext=200500A0B81146A1,ioc_guid=0002c90200402bec,\
dgid=fe800000000000000002c90200402bed,pkey=ffff,\ service_id=200500a0b81146a1,initiator_ext=ed2b400002c90200

注意事项:

建议对所有 srp_daemon 调用使用 -n 标志。

ibsrpdm 没有相应的选项。

srp_daemon.sh 始终使用 -n 选项(无论是由用户手动调用,还是在启动时通过将 SRP_DAEMON_ENABLE 设置为 yes 自动调用)。

High Availability (HA)

高可用性使用 Device-Mapper (DM) 多路径和 SRP 守护程序发挥作用。每个启动器都从多个端口/HCA 连接到同一目标。DM 多路径负责将不同路径连接到同一目标,并在其中一条路径离线时在路径之间进行故障转移。多路径将在新加入的 SCSI 设备上执行。
每个启动器应执行 SRP 守护程序的多个实例,每个端口一个。启动时,每个 SRP 守护程序都会检测结构中的 SRP 目标,并向 ib_srp 模块发送请求以连接到每个目标。这些 SRP 守护进程还会检测随后加入结构的目标,并发送 ib_srp 模块请求以连接到它们。

Operation

当到目标的路径(从端口 1)出现故障时,ib_srp 模块将启动错误恢复过程。如果该进程进入reset_host阶段并且没有从该端口到目标的路径,ib_srp将删除该scsi_host。删除 scsi_host 后,多路径会切换到此目标的另一条路径(从另一端口/HCA)。
当故障路径恢复时,SRP 守护程序将检测到它。然后,SRP 守护进程将请求 ib_srp 连接到该目标。连接建立后,该目标将有一个新的 scsi_host。多路径将在此主机的设备上执行,返回到原始状态(路径失败之前)。

Manual Activation of High Availability

初始化 - 每次驱动程序启动后执行:

执行modprobe dm-multipath

执行modprobe ib-srp

确保您已如上所述创建文件 /etc/udev/rules.d/91-srp.rules

对每个端口和每个 HCA 执行:

srp_daemon -c -e -R 300 -i <InfiniBand HCA name> -p <port number>

可以通过执行 srp_daemon.sh 来执行此步骤,它将其日志发送到 /var/log/srp_daemon.log。

现在可以访问 /dev/mapper/ 上的 SRP LUN。

备注:

常规(非 SRP)LUN 也可能存在;SRP LUN 可以通过其名称来识别。您可以配置 /etc/multipath.conf 文件来更改多路径行为。

SRP LUN 也可能不会出现在 /dev/mapper/ 下。如果 SRP LUN 位于多路径黑名单中,则可能会发生这种情况。编辑 /etc/multipath.conf 中的“黑名单”部分并确保 SRP LUN 未列入黑名单。

Automatic Activation of High Availability

启动srpd服务,运行:

service srpd start

从下次加载驱动程序开始,将可以访问 /dev/mapper/ 上的 SRP LUN

也可能存在常规(非 SRP)LUN。SRP LUN 可以通过其名称来识别。

可以在 /var/log/srp_daemon.log 中查看 SRP 守护程序的输出

Shutting Down SRP

SRP 可以通过使用“rmmod ib_srp”关闭,或者通过停止 OFED 驱动程序(“/etc/init.d/openibd stop”)关闭,或者作为系统完全关闭的副产品。
在关闭 SRP 之前,请删除对其的所有引用。您需要采取的操作取决于 SRP 的加载方式。分三种情况:

  1. 没有高可用性

    在没有高可用性的情况下工作时,您应该卸载在关闭 SRP 之前安装的 SRP 分区。

  2. 手动激活高可用性之后

    如果您手动激活 SRP 高可用性,请执行以下步骤:

卸载所有已安装的 SRP 分区。

停止服务 srpd(终止 SRP 守护进程实例)。

确保没有正在运行的多路径实例。如果有多个实例,请等待它们结束或杀死它们。

run:multipath -F

  1. 自动激活高可用性之后
    如果自动激活 SRP 高可用性,则 SRP 关闭必须是驱动程序关闭(“/etc/init.d/openibd stop”)的一部分,该驱动程序执行上述情况 b 的步骤 2-4。但是,您仍然需要卸载驱动程序关闭之前安装的所有 SRP 分区。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值