Linux NVMe 多路径

本文档介绍了 Linux NVMe 主机驱动程序支持的 NVMe 多路径及其路径选择策略。

简介

Linux 中的 NVMe 多路径功能将具有相同标识符的命名空间集成到一个单一的块设备中。使用多路径增强了 I/O 访问的可靠性和稳定性,同时提高了带宽性能。当用户向此合并后的块设备发送 I/O 时,多路径机制会根据配置的策略选择底层块设备(路径)之一。不同的策略会导致不同的路径选择。

策略

所有策略都遵循 ANA(非对称命名空间访问)机制,这意味着当存在优化路径时,将优先选择该路径,而不是非优化路径。目前 NVMe 多路径策略包括 numa(默认)、round-robin(轮询)和 queue-depth(队列深度)。

要设置所需的策略(例如 round-robin),请使用以下方法之一
  1. echo -n “round-robin” > /sys/module/nvme_core/parameters/iopolicy

  2. 或者将 “nvme_core.iopolicy=round-robin” 添加到命令行 (cmdline) 中。

NUMA

NUMA 策略选择距离当前 CPU 的 NUMA 节点最近的路径进行 I/O 分配。该策略基于网络接口连接维护到每个 NUMA 节点的最近路径。

何时使用 NUMA 策略
  1. 多核系统:优化多核和多处理器系统中的内存访问,尤其是在 NUMA 架构下。

  2. 高亲和性工作负载:将 I/O 处理绑定到 CPU,以减少跨节点的通信和数据传输延迟。

Round-Robin(轮询)

Round-robin(轮询)策略将 I/O 请求均匀分布到所有路径上,以提高吞吐量和资源利用率。每个 I/O 操作都会按顺序发送到下一个路径。

何时使用 round-robin 策略
  1. 均衡工作负载:对于 I/O 大小和类型相似的均衡且可预测的工作负载非常有效。

  2. 同构路径性能:当性能特征(例如延迟、带宽)相似时,可以有效地利用所有路径。

Queue-Depth(队列深度)

Queue-depth(队列深度)策略根据每条路径当前的队列深度来管理 I/O 请求,选择处理中 I/O 数量最少的路径。

何时使用 queue-depth 策略
  1. 高负载且小 I/O:当负载较高且 I/O 操作由较小、相对固定大小的请求组成时,可有效地平衡跨路径的负载。