策略与队列共同决定上限
路径选择策略决定 I/O 如何在多条可用路径之间分配,队列深度决定单条路径上能同时挂多少未完成 I/O,两者一起决定多路径的性能上限。Linux 多路径里最常用的是轮询与按优先级分组:轮询在多条等价路径间均匀分发,适合双活阵列;按优先级分组则把优化路径放一组、非优化路径放另一组,只在组内轮询。队列深度不足时,即使路径再多,I/O 也会在 SCSI 层排队等待。
基本信息
| 适用平台 | Linux dm-multipath |
|---|---|
| 路径选择器 | round-robin 0、queue-length 0、service-time 0 |
| 分组策略 | failover、multibus、group_by_prio |
| 轮询粒度 | rr_min_io_rq 与 rr_weight 控制切换频率 |
| 队列深度 | /sys/block/<设备>/device/queue_depth |
| 块层队列 | /sys/block/<设备>/queue/nr_requests |
典型使用场景
- 双活阵列并发:用按优先级分组加轮询,在优化路径内分发
- 主备控制器阵列:用 failover,仅在切换时改变路径
- 提升单卷吞吐:先确认队列深度与并发数才是瓶颈,再调大
- 排障:确认 I/O 是否集中在单条路径,判断是策略还是优先级问题
- 调优前后留存路径与队列基线,便于回退与对比
观察与调整入口
观察与调整入口
# 查看映射的路径选择器与分组策略
multipathd show maps format "%n %w %s"
grep -E 'path_selector|path_grouping|rr_min_io' /etc/multipath.conf
# 单条路径的队列深度(可写,范围以 HBA 与阵列能力为准)
cat /sys/block/sdb/device/queue_depth
# 块层请求队列长度
cat /sys/block/sdb/queue/nr_requests
# 间隔采样两次,比较各路径的 I/O 分布是否均衡
multipathd show paths format "%d %t %o"参数作用与判断
| 参数 | 作用 | 判断参考 |
|---|---|---|
| path_selector | 路径间如何分配 I/O | 轮询求均匀,按服务时间偏向快路径 |
| path_grouping_policy | 路径如何分组 | 支持 ALUA 的阵列常用按优先级分组 |
| rr_min_io_rq | 每条路径连续处理多少请求后切换 | 过大导致偏载到单条路径 |
| queue_depth | 单路径并发上限 | 过小排队,过大压垮目标端口 |
| nr_requests | 块层排队长度 | 与队列深度配套调整 |
调大队列深度会同时增加对存储前端端口与 HBA 的压力,合适取值依赖阵列型号与端口数量。建议一次只改一个参数,并配合业务侧时延观测,具体上限以厂商文档为准。
队列深度是按单个 sd 设备生效的:多路径归并后每个成员的深度都会叠加到目标端口上,估算总量时不能只按单路径的数值推算。