我正在运行 CentOS Linux 5.4 (x86_64) 的戴尔服务器上试验不同 SCSI 队列深度值的影响。
该服务器有两个通过多路径连接到存储系统的 QLogic QLE2560 FC HBA。存储系统已为服务器分配了两个 LUN,每个 LUN 通过主动-主动-主动-主动循环配置中的四个路径连接。总而言之,这两个 LUN 作为八个/dev/sdX设备存在,由/dev/mpath中的两个设备表示。
我目前在/etc/modprobe.conf 中调整队列深度值,并通过查看/proc/scsi/sg/devices的第七列来检查结果(重新启动后)。
与此相关的两个问题:
有没有办法在不重新启动或卸载 qla2xxx 内核模块的情况下调整队列深度?例如,我可以将新的队列深度值回显到某个/proc或/sys类文件中以更新队列深度吗?
如果我将队列深度设置为 128,那是
- qla2xxx 模块处理的所有设备总共有 128 个?或
- 每个 HBA 128 个?(共 256 个),或
- 8 个 /dev/sdX 设备中的每一个(总共 1024 个)128 个?或者
- 两个 /dev/mpath/... 设备各有 128 个(总共 256 个)?
这对我来说很重要,这样我的服务器就不会淹没存储系统,影响连接到它的其他服务器。
在 rr 多路径配置中,通常队列深度是每个 LUN/路径。它非常依赖于多路径驱动程序的实现,您必须检查多路径驱动程序的文档,在您的情况下是设备映射器的多路径,AFAIR 使用与 ESX 相同的概念,其中所有路径的队列深度都是任何路径的最小队列深度请参见我在 ESX 中的示例:
ESX 的本机多路径将 rr 多路径配置中的队列深度配置为任何相关队列的最小公共深度。即,每个 LUN/路径的深度为 32,并且有 4 个路径,总队列深度仅为 32!这就是为什么一些供应商提供自己的驱动程序(如 EMC 的电源路径)的原因。从性能的角度来看,轮询负载分布 ESX 不会在每个 IO 的任何给定路径上循环,默认安排前 1000 个 IO 通过第一个路径,接下来的 1000 个 IO 在每个 VM 的基础上进行,这应该是平滑的作为单个 IO 路径切换的所有路径的总负载将导致每个 IO 的延迟损失。
我对此的理解来自 ESX 环境,其中路径队列深度Luns 为 1024。如果它与 CentOS 不同,我会感到非常惊讶。