Linux dm-multipath 的 checker tur / rdac 与 path_checker 超时设置

11次阅读

应将 tur 超时设为 5 秒并启用 rdac 检查器:tur 默认 1 秒易误判,需在 multipath.conf 中配置 checker_timeout “5”;rdac 阵列须匹配 vendor/product 并设 path_checker “rdac”,其检测由 polling_interval(毫秒)控制,建议设为 3000–5000。

Linux dm-multipath 的 checker tur / rdac 与 path_checker 超时设置

path_checker tur 超时太短导致路径频繁 flapping

Linux dm-multipath 默认用 tur(Test Unit Ready)做路径健康检查,但它的超时值默认只有 1 秒——对某些响应慢的存储阵列(比如带加密、压缩或高负载的 LUN),tur 很容易误判为路径失效,触发不必要的路径切换甚至 I/O 暂停。

实操建议:

  • tur 的实际超时由内核模块参数 scsi_mod.use_blk_mq=0 和设备队列深度共同影响,但更直接可控的是 multipath.conf 中的 checker_timeout
  • defaults 或具体 devices 块里加:
    checker_timeout "5"

    (单位秒,支持整数,最大建议不超过 10)

  • 改完后必须 sudo systemctl reload multipathd,且需确认 multipath -t 输出中该值已生效
  • 注意:部分老版本 multipath-tools(如 RHEL 7.6 之前)不识别 checker_timeout,得升级到 >= 0.7.4

rdac checker 在 Dell EMC Unity/VNX 上必须配 vendor/product

rdac 是专为 Dell EMC(原 EMC)存储设计的路径检测器,它依赖 SCSI INQUIRY 返回的 vendor/product 字符串匹配才能启用。如果没配对,multipath 会悄悄 fallback 到 directiotur,而后者在 RDAC 阵列上可能无法正确识别“伪离线”状态(比如控制器接管中)。

实操建议:

  • 先查设备真实标识:sudo sg_inq /dev/sdb | grep -E "(vendor|product)",典型输出是 vendor: EMC ,product: SYMMETRIXVNX
  • devices 块中显式声明:
    device {vendor "EMC     "     product "VNX.*"     path_checker "rdac"}

    (注意 vendor 字段必须补足空格到 8 字符)

  • product 支持正则,VNX.* 可覆盖 VNX5100/VNX5300 等变种;但 SYMMETRIXVNX 不可混用
  • 若仍 fallback,检查 /etc/multipath.conf 是否有更高优先级的 generic 规则覆盖了该设备

checker_timeout 对 rdac 实际无效,得靠 polling_interval

rdac 本身不走 SCSI TUR 流程,而是通过定期发 MODE SENSE(page 0xC9)查询阵列控制器状态,所以 checker_timeout 对它完全不起作用。真正控制检测频率的是全局 polling_interval(单位毫秒),默认 5000(即 5 秒)。

实操建议:

  • 降低检测延迟可设:
    polling_interval "2000"

    ,但低于 2000ms 可能增加阵列负担,Dell 官方建议不低于 3000ms

  • 该值影响所有路径检查(包括 tur),不是 per-checker 配置项
  • 修改后同样要 systemctl reload multipathd,并用 multipathd show config | grep polling 确认生效
  • 注意:某些旧固件(如 VNX OE 05.32.000.5.022)在高并发 polling 下会返回错误码 0x29(”Command sequence error”),此时反而要调大间隔

路径检查器选错会导致 failover 失败或静默丢包

tur 对 RDAC 阵列、或选 rdac 对非 Dell 存储,不只是“检测不准”,而是可能让 multipathd 误认为路径永远 UP,从而在真实故障时拒绝 failover;更危险的是,某些场景下 I/O 会卡在 pending 状态却不报错,应用层只看到延迟飙升。

实操建议:

  • 确认存储型号和 firmware 版本,再查对应厂商文档(如 Dell EMC 的“Linux Host Connectivity Guide”)明确推荐的 path_checker
  • 不要仅凭 lsscsi 输出的 vendor 名判断——有些白牌 JBOD 也报 EMC,但实际不支持 RDAC 协议
  • 生产环境上线前,务必模拟单路径拔线,用 multipath -lldmesg | grep -i "multipath|failover" 观察是否真触发切换、I/O 是否中断
  • 如果阵列同时挂了多个品牌(比如混用 Dell 和 HPE),必须用 devices 块按 vendor/product 分别指定 checker,不能全塞进 defaults

最常被忽略的一点:checker_timeoutpolling_interval 的单位不同(秒 vs 毫秒),且前者只对 tur/directio 生效,后者才管 rdac。配错单位或混用场景,问题不会立刻报错,而是等某次存储微中断时才暴露成间歇性超时。

text=ZqhQzanResources