了解 Linux SCSI 队列深度

了解 Linux SCSI 队列深度

我正在试验运行 CentOS Linux 5.4(x86_64)的戴尔服务器上不同 SCSI 队列深度值的影响。

服务器有两个 QLogic QLE2560 FC HBA,通过多路径连接到存储系统。存储系统已为服务器分配两个 LUN,每个 LUN 通过四条路径以主动-主动-主动-主动循环配置连接。总而言之,这两个 LUN 以八个/dev/sdX设备,由两个设备表示/dev/mpath

我目前调整队列深度值/etc/modprobe.conf并通过查看第七列来检查结果(重新启动后)/proc/scsi/sg/设备

与此相关的两个问题:

  • 有没有办法调整队列深度而无需重新启动或卸载 qla2xxx 内核模块?例如,我可以将新的队列深度值回显到某些/进程或者/系统类似文件来更新队列深度?

  • 如果我将队列深度设置为 128,那么

    • qla2xxx 模块处理的所有设备总共有 128 个?或者
    • 每个 HBA 128 个?(总共 256 个),或者
    • 八个 /dev/sdX 设备各 128 个(总共 1024 个)?或者
    • 两个 /dev/mpath/... 设备各 128 个(总共 256 个)?

    了解这一点对我来说很重要,这样我的服务器就不会淹没存储系统,影响与其连接的其他服务器。

答案1

在 rr 多路径配置中,队列深度通常按 LUN/路径计算。它非常依赖于多路径驱动程序的实现,您必须查看多路径驱动程序的文档,在您的情况下,它是设备映射器的多路径,据我所知,它使用与 ESX 相同的概念,其中所有路径的队列深度是任何路径的最小队列深度,请参见此处的 ESX 示例:

ESX 的本机多路径将 rr 多路径配置中的队列深度配置为所有相关队列的最小公共深度。即,每个 LUN/路径的深度为 32,4 条路径的总队列深度仅为 32!这就是一些供应商提供自己的驱动程序(如 EMC 的 powerpath)的原因。从性能角度来看,循环负载分配 ESX 不会在每个 IO 的任何给定路径上循环,默认情况下,前 1000 个 IO 会通过第一条路径,接下来的 1000 个 IO 会根据每个 VM 进行下一条路径的调度,这应该会平滑所有路径上的整体负载,因为每个单个 IO 路径切换都会对每个 IO 产生延迟惩罚。

答案2

我对此的理解来自 ESX 环境,其中路径队列深度Luns 将是 1024。如果 CentOS 有所不同,我会感到非常惊讶。

相关内容