25.19. 修改链接丢失行为
这部分论述了如何修改使用光纤通道或 iSCSI 协议的设备的链接丢失行为。
25.19.1. Fibre Channel
如果驱动程序实现了传输
dev_loss_tmo
回调,当检测到传输问题时,通过链接访问设备的尝试将被阻止。要验证设备是否被阻止,请运行以下命令:
$ cat /sys/block/device/device/state
如果设备被阻止,这个命令将返回
blocked
。如果设备正常运行,这个命令会返回 running
。
过程 25.15. 确定远程端口的状态
- 要确定远程端口的状态,请运行以下命令:
$ cat /sys/class/fc_remote_port/rport-H:B:R/port_state
- 当远程端口(以及通过它访问的设备)被阻止时,这个命令将返回
Blocked
。如果远程端口正常运行,命令将返回Online
。 - 如果没有在
dev_loss_tmo
秒内解决问题,则 rport 和设备将被取消阻塞,且在该设备上运行的所有 I/O (以及发送到该设备的任何新的 I/O)都将失败。
过程 25.16. 更改 dev_loss_tmo
- 要更改
dev_loss_tmo
值,请将所需值 echo 到该文件。例如,要将dev_loss_tmo
设置为 30 秒,请运行:$ echo 30 > /sys/class/fc_remote_port/rport-H:B:R/dev_loss_tmo
有关
dev_loss_tmo
的更多信息,请参阅 第 25.4.1 节 “光纤通道 API”。
当链接丢失超过
dev_loss_tmo
时,会删除 scsi_device
和 sdN
设备。通常,光纤通道类会将设备保留原样;例如 /dev/sdx
将保持 /dev/sdx
。这是因为,目标绑定由 Fibre Channel 驱动程序保存,因此当目标端口返回时,SCSI 地址会被重新创建。但是,无法保证这一点;只有在未进行 LUN 的存储框中配置时,才会恢复 sdx
。
25.19.2. 使用 dm-multipath的 iSCSI 设置
如果实现了 dm-multipath,建议设置 iSCSI 计时器,以立即将命令延迟到多路径层。要配置此功能,请在
/etc/multipath.conf
中的 device { 下嵌套以下行:
features "1 queue_if_no_path"
这样可确保在 dm-multipath 层中所有路径都失败时重试 I/O 错误并排队。
您可能需要进一步调整 iSCSI 计时器,以更好地监控 SAN 是否存在问题。您可以配置的可用 iSCSI 计时器为 NOP-Out Interval/Timeouts 和 replacement_timeout,后续章节将对此进行讨论。
25.19.2.1. NOP-Out Interval/Timeout
为了帮助监控 SAN 的问题,iSCSI 层向每个目标发送 NOP-Out 请求。如果 NOP-Out 请求超时,iSCSI 层将通过使任何正在运行的命令失败而做出响应,并指示 SCSI 层尽可能重新排队这些命令。
当使用 dm-multipath 时,SCSI 层将失败那些运行命令并将其延迟到多路径层。然后多路径层会对另一个路径重新尝试这些命令。如果没有使用 dm-multipath,则这些命令会在完全失败前重试五次。
NOP-Out 请求之间的间隔默认为
5
秒。要调整此功能,请打开 /etc/iscsi/iscsid.conf
并编辑以下行:
node.conn[0].timeo.noop_out_interval = [interval value]
设置之后,iSCSI 层将每隔 [interval value] 秒向每个目标发送 NOP-Out 请求。
node.conn[0].timeo.noop_out_timeout = [timeout value]
这会将 iSCSI 层设置为在 [timeout value] 秒后使 NOP-Out 请求超时。
SCSI 错误处理程序
如果 SCSI 错误处理程序正在运行,当 NOP-Out 请求在该路径上超时时,在路径上运行命令不会立即失败。相反,这些命令将在 replacement_timeout 秒后 失败。有关 replacement_timeout 的详情,请参考 第 25.19.2.2 节 “replacement_timeout”。
要验证 SCSI 错误处理程序是否正在运行,请运行:
# iscsiadm -m session -P 3
25.19.2.2. replacement_timeout
replacement_timeout 控制 iSCSI 层应等待超时路径/会话重新建立自己的时间,然后再在其上失败任何命令。默认的 replacement_timeout 值为 120 秒。
要调整 replacement_timeout,请打开
/etc/iscsi/iscsid.conf
并编辑以下行:
node.session.timeo.replacement_timeout = [replacement_timeout]
/etc/multipath.conf
中的 1 queue_if_no_path 选项设置 iSCSI 计时器,以立即将命令延迟到多路径层(请参考 第 25.19.2 节 “使用 dm-multipath的 iSCSI 设置”)。此设置可防止 I/O 错误传播到应用程序;因此,您可以将 replacement_timeout 设置为 15-20 秒。
通过配置较低 replacement_timeout,I/O 会快速发送到新路径并执行(如果发生 NOP-Out 超时),而 iSCSI 层会尝试重新建立失败的路径/会话。如果所有路径都超时,则多路径和设备映射器层将根据
/etc/multipath.conf
中的设置而不是 /etc/iscsi/iscsid.conf
中的设置在内部排队 I/O。
重要的
无论您的考虑是故障转移速度还是安全性,推荐的 replacement_timeout 值取决于其他因素。这些因素包括网络、目标和系统工作负载。因此,建议您在将其应用到关键任务系统之前,对 replacements_timeout 的任何新配置进行彻底测试。
iSCSI 和 DM 多路径覆盖
restore_tmo
sysfs
选项控制一个特定 iSCSI 设备的超时时间。以下选项会在全局范围内覆盖 recovery_tmo
值:
replacement_timeout
配置选项会全局覆盖所有 iSCSI 设备的recovery_tmo
值。- 对于由 DM 多路径管理的所有 iSCSI 设备,DM 多路径中的
fast_io_fail_tmo
选项会全局覆盖recovery_tmo
值。DM 多路径中的fast_io_fail_tmo
选项会覆盖光纤通道设备的fast_io_fail_tmo
选项。DM 多路径fast_io_fail_tmo
选项优先于replacement_timeout
。红帽不推荐使用replacement_timeout
覆盖由 DM 多路径管理的设备中的recovery_tmo
,因为在multipathd
服务重新载入时 DM 多路径总是重置recovery_tmo
。
25.19.3. iSCSI 根
当直接通过 iSCSI 磁盘访问根分区时,应设置 iSCSI 定时器,以便 iSCSI 层有多个机会尝试重新建立路径/会话。此外,命令不应快速重新排队到 SCSI 层。这与实现 dm-multipath 时应该执行的操作相反。
首先,应禁用 NOP-Outs。您可以通过将 NOP-Out 间隔和超时设置为零来实现此操作。要设置此设置,请打开
/etc/iscsi/iscsid.conf
并编辑如下:
node.conn[0].timeo.noop_out_interval = 0 node.conn[0].timeo.noop_out_timeout = 0
与此相符,应将 replacement_timeout 设置为高数字。这将指示系统等待很长时间来重新建立路径/会话。要调整 replacement_timeout,请打开
/etc/iscsi/iscsid.conf
并编辑以下行:
node.session.timeo.replacement_timeout = replacement_timeout
配置
/etc/iscsi/iscsid.conf
后,您必须对受影响的存储执行重新发现。这将允许系统加载和使用 /etc/iscsi/iscsid.conf
中的任何新值。有关如何发现 iSCSI 设备的详情,请参考 第 25.15 节 “扫描 iSCSI Interconnects”。
为特定会话配置超时
您还可以为特定会话配置超时,并使它们成为非持久性(而不是使用
/etc/iscsi/iscsid.conf
)。为此,请运行以下命令(相应地替换变量):
# iscsiadm -m node -T target_name -p target_IP:port -o update -n node.session.timeo.replacement_timeout -v $timeout_value
重要的
对于涉及根分区访问的 iSCSI 会话,建议使用此处描述的配置。对于涉及访问其他类型的存储的 iSCSI 会话(例如,在使用 dm-multipath的系统中),请参阅 第 25.19.2 节 “使用 dm-multipath的 iSCSI 设置”。