PowerFlex:过多的数据角色切换会导致 IO 延迟和错误
Сводка: 本文介绍了数据过多的角色切换如何导致 I/O 延迟和错误。
Симптомы
在某些群集状态转换下,MDM 角色平衡逻辑可跨多个 Comb(跟踪哪些 SDS 节点存储每条卷数据的内部数据结构)生成快速、重复的主要/辅助角色切换。每个角色切换都会使客户端 (SDC) 梳子映射失效,并强制重试 I/O。当有足够多的 comb 同时受到影响时,累积重试开销会导致 SDC 主机上出现 I/O 延迟峰值和 I/O 错误。根据主机环境的不同,这可能会导致应用程序 I/O 超时、虚拟机进入只读状态或文件系统不可用。
此行为已在多个触发情形下观察到,并且不限于任何单个操作过程。
常见迹象
MDM_DATA_DEGRADED事件后跟持续 1-15+ 分钟的持续 I/O 延迟- SDC 主机在降级窗口内报告 I/O 错误和/或 I/O 超时
- VMware (ESXi):VMFS 心跳超时,SCSI 硬件错误 (
sense data: 0x4 0x0 0x0),虚拟机进入只读状态,潜在的 HA 故障切换 - Linux:系统日志中的 I/O 错误 (
/var/log/messages, dmesg),应用程序可能会遇到 I/O 超时或文件系统重新装载只读的情况
- VMware (ESXi):VMFS 心跳超时,SCSI 硬件错误 (
- MDM 事件日志显示,对于单个 SDS 丢失,系统处于 DEGRADED 状态的时间比预期的要长
- 系统最终自行恢复到正常状态,无需手动干预(通常)
情况 1:非正常 SDS 丢失(无维护模式)
何时可能发生:
- 这种情况很少见。要在非正常 SDS 丢失期间发生快速、重复的角色切换事件,必须同时存在几个特定条件:
-
- 大规模环境 — 大量 SDS 节点和卷
- 繁重的生产 I/O 负载 — SDS 失败时有大量 I/O 活动
- 重建工作负载超过处理能力 — 需要重建的元数据行数超过 MDM 平衡器每个周期限制 1,024 行
每个重新平衡周期最多可处理 1,024 个元数据行。当必须重新生成更多行时,平衡器在生成下一个计划之前无法完成当前计划。
会发生什么情况:
- SDS 突然与 MDM 分离(事件 SDS_DECOUPLED)
- 连接到该 SDS 的所有 SDC 都会在 SDC 断开连接事件→失去连接
- MDM 将群集标记为 DEGRADED(事件)
MDM_DATA_DEGRADED) - 由于要重建的行数超过 1,024,因此 MDM 平衡器无法完成当前的重新平衡计划
- 平衡器在上一个计划仍在运行时启动新计划,从而产生快速、重复的角色切换事件
- 客户端 SDC 看到连续 I/O 故障 (
IO_FAULT_NOT_PRI, SCSI sense 0x4)。重试次数用尽后,主机操作系统会报告 I/O 错误、超时或只读文件系统 - MDM 跟踪证据:
当重新平衡工作负载超过 1,024 行的限制时,MDM 跟踪显示超过阈值:
2026/03/28 22:43:53.246702 MED:7f1f984aedb0:balanceExec_HandleDegradedRows:00343: BALANCER: Storage Pool: 1193844800000000 - 1024 rows processed out of 1098 degraded rows. 0 allocation failures. 0 cumulative allocation failures.
这表示 1,098 行需要重新构建,但在当前周期中只能处理 1,024 行。在上一个计划完成之前,剩余行将触发新的重新平衡计划,从而启动反馈循环。
一连串事件:
Log Source Event / Pattern MDM events SDS_DECOUPLED — SDS formally declared dead MDM events MDM_DATA_DEGRADED — Cluster enters DEGRADED state SDS traces Flood of IO_FAULT_NOT_PRI — SDS received IO for a comb it is no longer primary for ESXi vmkernel SCSI sense data: 0x4 0x0 0x0 — Hardware error MDM events MULTIPLE_SDC_CONNECTIVITY_CHANGES — Mass SDC connectivity storm MDM events SDC_DISCONNECTED_FROM_SDS_IP — SDCs losing contact with the failed SDSMDM 事件序列示例:
SDC_DISCONNECTED_FROM_SDS_IP SDC disconnected from SDS <name> SDS_DECOUPLED SDS <name> decoupled MDM_DATA_DEGRADED The system is now in DEGRADED state
情况 2:SDS 在 PMM 条目期间关闭电源
何时可能发生:
这是一种罕见的方案,需要同时有两个事件:
- SDS 正在进入受保护维护模式 (PMM)
- 在 PMM 转换完成之前,SDS 发生故障或已关闭
会发生什么情况:
- MDM 接收 PMM 条目命令并将其记录为成功
- 当 PMM 条目仍在进行时,SDS 意外分离
- MDM 将群集标记为“DEGRADED”
- 角色平衡器在整个 PMM 进入阶段进入持续的角色切换循环
- 非 PMM 数据行在整个存储池中重复进行角色切换
- 风暴会一直持续到 SDS 重新加入群集并完成维护模式转换
一连串事件:
Log Source Event / Pattern MDM events CLI_COMMAND_SUCCEEDED — enter_protected_maintenance_mode command succeeded MDM events SDS_DECOUPLED — SDS decoupled before maintenance mode started MDM events MDM_DATA_DEGRADED — Cluster enters DEGRADED state SDS traces Repeated role-switch operations across non-PMM rows
MDM 事件序列示例:
CLI_COMMAND_SUCCEEDED Command enter_protected_maintenance_mode succeeded SDS_DECOUPLED SDS <name> decoupled MDM_DATA_DEGRADED The system is now in DEGRADED state
当 SDS 重新加入且 PMM 完成时:
SDS_MAINTENANCE_MODE_STARTED SDS maintenance mode started MDM_DATA_NORMAL The system is now in NORMAL state
情况 3:即时维护模式 (IMM) 下的 SDS
何时可能发生:
SDS 进入或退出即时维护模式 (IMM)。当单个 SDS 处于维护模式并且系统无法决定哪个 SDS 应处理特定数据的 I/O 时,会发生这种情况。
会发生什么情况:
- 系统会反复更改负责提供相同数据的 SDS
- 这些持续的变化意味着应用程序不知道将 I/O 请求发送到何处
- I/O 发送到错误的 SDS,导致重试和延迟
- 应用程序在尝试访问受影响的数据时遇到延迟或超时
影响:
- 客户影响:当 SDS 处于 IMM 状态时,应用程序报告延迟和超时
- 持续时间:SDS 处于 IMM 状态时继续
- 恢复:自动 — 在 SDS 退出 IMM 时解决
一连串事件:
Log Source Event / Pattern SDS traces Repeated role-switch operations on the same data SDS traces Primary and secondary role switches on identical data
情况 4:SDS 退出受保护维护模式 (PMM)
何时可能发生:
SDS 退出受保护维护模式 (PMM)。这种情况发生在每次 PMM 退出期间 - 这不是罕见事件,但严重性取决于维护模式操作持续的时间。
会发生什么情况:
- 当 SDS 退出 PMM 时,角色平衡器必须重新分配数据段以包括返回的 SDS
- 重新平衡过程会影响整个存储池,而不仅仅是返回的 SDS 上的数据
- 在重新集成期间,角色切换发生在许多数据段中
- 随着角色分配的稳定,应用程序可能会遇到短暂的 I/O 错误或延迟
影响:
- 客户影响:对于较短的维护窗口(不到 5 秒),影响几乎不明显。对于使用活动 I/O 进行长时间维护,可能会发生数千次角色切换,从而导致持续的 I/O 停滞
- 持续时间:在重新整合阶段继续,直到重新平衡完成
- 恢复:自动
一连串事件:
Log Source Event / Pattern MDM events Role-switch operations across the storage pool during exit SDS traces Repeated role-switch operations during reintegration
MDM 事件序列示例:
SDS_MAINTENANCE_MODE_EXIT_STARTED SDS maintenance mode exit started SDS_MAINTENANCE_MODE_EXIT_COMPLETED SDS maintenance mode exit completed
日志输出:
MDM 事件日志:MDM 事件日志显示群集级别序列。关键指标是维护模式退出期间的角色切换操作。
SDS 跟踪日志:在 SDS 节点上,跟踪日志显示重新集成期间重复的角色切换操作:
raidComb_SetPriTgtGenNum: combId <id> combGenNum: cur <gen> new <gen> contCmd_SetCombState: CombId <id> devId <id> PRI->SEC Switch roles contCmd_SetCombState: CombId <id> devId <id> SEC->PRI Switch roles
短时间窗口内有大量切换角色条目(几秒钟内有数千个或更多)是此问题的明确 SDS 端指示器。
SDC/主机日志:VMware (ESXi) SDC I/O 重试次数(显示梳子、目标 SDS 和故障代码):
vmkernel log PowerFlex mapVolIO_Do_CK:1496 :Mit: <addr>. Retrying IO Type WRITE. Failed comb: <id>. SDS_ID <id>. Comb Gen <gen>. Head Gen <gen>. PowerFlex mapVolIO_Do_CK:1510 :Mit: <addr>. Vol ID <id>. Last fault Status IO_FAULT_NOT_PRI(12). Retry count (1)
如果重试次数耗尽,将返回 SCSI 错误:
sense data: 0x4 0x0 0x0 -- SCSI Hardware Error
诊断提示:如果您在多个 SDS 节点(而不仅仅是出现问题的节点)上看到 I/O 错误,这可能表示角色切换风暴,而不是正常的降级状态行为。如果 I/O 错误隔离到单个 SDS,这是预期的降级状态行为。
情况 5:维护模式相变
何时可能发生:
在 SDS 进入或退出维护模式(IMM 或 PMM)的过渡期间,此时状态将从正常更改为 MM,或从 MM 变回正常。
会发生什么情况:
- 角色平衡器会重新分配数据责任以适应更改
- 当系统适应新排列时,角色切换会发生短暂的突发
- 在过渡期间,应用程序可能会遇到短暂的延迟高峰
影响:
- 客户影响:持续几秒到几分钟的短暂延迟峰值。通常低于应用程序超时阈值
- 持续时间:持续几秒到几分钟,然后安定下来
- 恢复:自动
一连串事件:
Log Source Event / Pattern SDS traces Brief role-switch operations during phase transitions
Причина
当群集由于 SDS 丢失或维护模式操作而转换状态时,MDM 角色平衡逻辑中的软件缺陷会导致反馈循环。
在某些情况下,MDM 会反复将负责为 I/O 提供服务的 SDS 节点重新分配给受影响的梳子。每次重新分配都会使 SDC 的数据所在位置的缓存视图失效,从而强制重试 I/O。当多个梳子同时受到影响时,重新分配量会超过 SDC 的更新能力,从而导致跨多个主机的持续 I/O 错误。
风暴通常是自限性的。群集稳定后会解决问题,但持续时间取决于事件发生时保护域的大小和 I/O 负载。
Разрешение
此问题已在 PowerFlex Core 版本 4.5.6 中得到解决。一旦可用,请升级到此版本。有关发布时间表信息,请联系 戴尔支持 。
对于计划内维护操作:
- 在 MDM 记录之前,请勿重启或重新启动 SDS
SDS_MAINTENANCE_MODE_STARTED。在继续物理维护之前,验证 SDS 是否已完全进入维护模式。 - 在进入或退出维护模式时监视延迟峰值。
对于计划外 SDS 中断:
- 风暴具有自我限制性,通常会在群集稳定后几分钟内解决。如果发现问题,请收集
getinfo在事件发生后尽快从保护域中的所有 SDS 节点和所有管理器 MDM 收集日志,并联系 戴尔支持。
在问题无法自行解决的极少数情况下,临时禁用并重新启用重建可使 MDM 保持稳定:
scli --set_rebuild_mode --protection_domain_name <pd_name> --storage_pool_name <sp_name> --disable_rebuild
# 等待 5-10 秒,然后启用重建:
scli --set_rebuild_mode --protection_domain_name <pd_name> --storage_pool_name <sp_name> --enable_rebuild
scli --query_all 命令输出。