分布式存储中慢盘需通过osd内500ms周期微基准测试(o_direct+o_sync)识别,连续3周期p99写延时>80ms且超集群均值3倍即初筛;meta服务聚合计算动态全局p99阈值,偏离度≥2.5确认慢盘,随后下线隔离并触发数据重构。

当分布式存储集群中某块磁盘写入时延持续飙升至毫秒级甚至百毫秒级,该盘会迅速拖垮所在节点的IO吞吐与响应一致性,引发上层业务延迟抖动、副本同步卡顿、甚至元数据超时失败。这类慢盘无法靠肉眼观察发现,必须依赖系统级时延采样、状态比对与自动决策机制完成识别与剔除。
采集写入时延并判定慢盘
在每个OSD或Store进程内,以500ms为周期对本盘执行一次16KB随机写+fsync的微基准测试,记录真实耗时;若连续3个周期测得P99写延时>80ms,且高于集群P99均值3倍以上,则触发慢盘初筛标记。
注意:该测试必须绕过Page Cache,直接使用O_DIRECT+O_SYNC打开设备文件/dev/sdX,否则缓存掩盖真实盘速,导致漏判。
将初筛结果上报至Meta服务,由Meta聚合全集群各盘时延数据,计算全局P99阈值(非固定值,按当前负载动态浮动),再比对单盘偏离度——偏离度=(本盘P99 / 全局P99)≥2.5即确认为慢盘。
隔离慢盘并冻结其数据路径
方法一:通过存储引擎原生指令下线该盘
执行dsware_agent_tool --op set_disk_state --para /dev/sdX:offline,该命令会立即停止向该盘提交新IO,并清空其write queue中所有未落盘请求,返回EIO错误给上层调用者。
【必须在离线前确保该盘无正在同步的副本任务】,否则强制中断会导致副本校验不一致,后续重建可能失败。
方法二:操作系统级屏蔽(仅作兜底)
执行echo 1 > /sys/block/sdX/device/delete,使内核彻底卸载该设备;随后运行partprobe刷新设备列表,防止后续误调度。
这一步操作起来很简单,直接敲完回车即可生效,但不可逆——设备删除后需物理重插或重启主机才能恢复识别。
启动数据重构与状态清理
第一步:Meta服务向所有含该慢盘副本的OSD下发rebuild指令,指定目标盘为同节点其他健康HDD或跨节点SSD缓存池。
第二步:Store模块按日志段(log segment)粒度逐块读取慢盘剩余有效数据,跳过已标记corrupt的block,校验CRC后写入目标盘;每写满一个4MB Object即更新CRUSH映射表。
第三步:待全部有效数据迁移完毕,执行dsware_smio_tool.sh restart重新扫描磁盘状态,清除MDC中残留的TEMP DISK SLOW DOWN标记。
第四步:编辑/opt/fusionstorage/agent/conf/agentMonitor,将其中disk_health_check_enabled字段设为True,确保下次巡检能重新纳入该盘(如已更换新盘)。











