Linux/多路径不使用所有路径,并且不会使用队列长度路径选择器?

Linux/多路径不使用所有路径,并且不会使用队列长度路径选择器?

我有以下硬件:

  • 2 台 SuperMicro 服务器(128GB RAM、2 台 8 核 AMD)
  • 2x/服务器 LSI SAS2008 PCIe MPT-Fusion2 HBA(每张卡 2 个 SAS 端口)
  • 1x LSI CTS2600 DAS,配备 24x WD 15.7k RPM 600GB SAS 驱动器。

服务器运行的是 OpenSuSE 11.4,带有从上游构建的自定义多路径工具,并结合了 OpenSuSE 11.3 补丁集。每台服务器上的所有 4 个 SAS 端口都连接到 DAS,每个 DAS RAID 控制器有 2 个端口。

DAS 设置了 22 个驱动器,采用 RAID10、128k 条带。我在阵列上创建了一个 500GB 的卷组,并将其导出到其中一台服务器。

多路径设置为对导出到服务器的 500GB LUN 进行多路径 I/O。以下是 multipath.conf 文件:

defaults {
    path_checker            "directio"
    path_selector           "queue-length 0"
    path_grouping_policy    "multibus"
    prio                    "random"
    features                "1 queue_if_no_path" #queue IO if all paths are lost
}

multipath -l输出:

pg (360080e50001b658a000005104df8c650) dm-0 LSI,INF-01-00
size=500G features='3 queue_if_no_path pg_init_retries 50' hwhandler='1 rdac' wp=rw
|-+- policy='round-robin 0' prio=0 status=active
| |- 4:0:0:1 sda 8:0   active undef running
| `- 5:0:0:1 sde 8:64  active undef running
`-+- policy='round-robin 0' prio=0 status=enabled
  |- 4:0:1:1 sdc 8:32  active undef running
  `- 5:0:1:1 sdg 8:96  active undef running

请注意,第二组路径为“status=enabled”,而不是前两组路径为“status=active”。现在,查看 iostat 可发现我们确实只使用了前两个路径:

Linux 2.6.37.6-0.5-default (slipdb01-primary)   07/07/2011      _x86_64_        (16 CPU)                                                       

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util                                      
sda               0.00     0.00    1.18  441.70    30.44  4748.62    21.58     0.79    1.79   0.24  10.60                                      
sdb               0.00     0.00    0.00    0.00     0.00     0.00    14.22     0.00   83.56  82.92   0.00                                      
sdc               0.00     0.00    0.00    0.00     0.00     0.00     8.06     0.00  334.53 331.73   0.02                                      
sdd               0.00     0.00    0.00    0.00     0.00     0.00    16.99     0.00   98.73  95.76   0.00                                      
sde               0.00     0.00    1.18  441.70    30.43  4747.77    21.58     0.79    1.79   0.24  10.60                                      
sdf               0.00     0.00    0.00    0.00     0.00     0.00    14.43     0.00   77.17  76.66   0.00                                      
sdg               0.00     0.00    0.00    0.00     0.00     0.00     8.06     0.00  301.72 297.05   0.02                                      
sdh               0.00     0.00    0.00    0.00     0.00     0.00    14.29     0.00   83.12  82.69   0.00                                      
sdi               0.00     0.00    0.08    0.48     8.73    35.82   159.00     0.06   99.95   1.08   0.06                                      
sdj               0.00  2311.06    0.00  340.49     0.01 10606.18    62.30     0.04    0.12   0.08   2.83                                      
dm-0              0.02  1353.74    2.36  883.40    60.86  9496.39    21.58     0.95    1.08   0.13  11.20                                      
dm-2              0.00     0.00    2.38 2237.14    60.86  9496.39     8.54     1.90    0.84   0.05  11.20

据我了解,将 path_grouping_policy 设置为“多总线”应平衡所有路径上的 IO,因此我应该看到 4 条活动路径。如果我将 path_grouping_policy 更改为“故障转移”,则会看到相同的 2 条活动路径。

此外,请注意,我已将 path_selector 设置为“queue-length 0”,但“multipath -l”的输出清楚地显示它正在使用循环。

有谁知道为什么多路径工具不使用所有 4 条路径,以及为什么它忽略了我选择的路径选择算法?

非常感谢...

答案1

嗯,似乎阵列不是我想象中的主动/主动阵列……也不是我想象中的常见定义。CTS2600 是一个主动/主动阵列,它可以为控制器 A 的 LUN1 和控制器 B 的 LUN2 提供服务,但不能为控制器 A、B 的 LUN1 提供服务。因此,看起来我无法让所有 4 条路径都通向一个 LUN。

但是,我确实发现我可以在两个控制器之间平衡 IO 负载。我通过在 CTS2600 阵列上创建一个 22 驱动器 RAID10 卷组、创建两个卷并将卷 A 的首选路径设置为控制器 A、将卷 B 的首选路径设置为控制器 B 并将它们导出到服务器来实现此目的。然后,我使用 /dev/mapper/ 下的名称将它们初始化为 LVM2 物理卷。接下来,我创建了一个包含两个物理卷的 LVM2 卷组。由于我有两个 LUN,因此在执行“lvcreate”时,我添加了选项“--stripes 2”。然后,我像往常一样格式化、安装和使用该设备。通过观察“iostat”和 SANtricity 内置性能监视器,很明显 IO 分布在两个控制器上,正如预期的那样。

感谢 #postgres 上的一位好心人,他提醒我使用 --stripes 选项来实现这一点(特别是因为 LSI 不愿意或无法提供帮助)。

答案2

此外,我省略了有关队列长度和路径选择器位的详细信息。我使用的存储设备已在多路径数据库中,因此已设置某些默认值,如队列长度和路径选择器。我的 /etc/multipath.conf 缺少“ devices { device { ”部分,您可以在其中覆盖默认选项。进行该更改后,我能够确认我可以更改(并且多路径将使用)队列长度和路径选择器。我添加到 /etc/multipath.conf 的部分:

   devices {
     device {
     vendor  "LSI"
     product "INF-01-00"
     no_path_retry   fail
     features        0
     #path_grouping_policy   "multibus"
     }
   }

希望这对某人有帮助。

答案3

这有时被称为“双主动”,而不是真正的主动/主动 FC SAN 工程师所习惯的。供应商可以更好地描述其基于 SAS 的产品的局限性。本文解释所有模式很好。

相关内容