解决vSphere的存储性能问题之存储队列

vSphere的存储队列是什么,需要改变吗?

我们都不得不在我们的生活中等待一次或两次排队,排队等候只是一个生活的元素。在存储领域,这是真实的;存储I/O有大量的队列,他们必须等待。在这篇文章中,我们分析了在虚拟化存储堆栈的不同队列,讨论何时、如何、以及为什么要修改它们。

队列是必要的,但它们主要被用来允许资源的共享,并允许并发流。通过使用队列,vSphere是能够让多个虚拟机共享一个单一的资源。队列还允许应用程序同时在一个LUN上有多个活动的I/O请求,它提供了并发性,并提高了性能。但这里有一个权衡,如果你允许太多的并发,底层的资源可能会饱和。为了防止一个虚拟机或一台主机出现底层资源的饱和,队列需要设置尺寸/限制来规定可以一次发送I/O请求的数量限制。

在一个虚拟化的环境中有多个队列。在堆栈的顶部,有guest OS内部使用的各种存储队列。这包括由应用程序本身和存储装置内部使用来宾OS驱动程序创建和使用的队列。在的vSphere软件堆栈内的虚拟化层,有三个主要的队列。一个World队列(每个虚拟机有一个队列),适配器队列(主机中的每一个HBA有一个队列),以及设备/LUN队列(每个LUN,每个适配器有一个队列)。最后,在存储堆栈底部的有存储装置的队列,例如前端存储端口具有可用于所有传入在该端口上的I/O的一个队列。

在调查存储性能问题和瓶颈的时候,你应该调查从应用程序和客户操作系统到存储阵列的各个级别的存储堆栈的排队情况。在这篇文章中,我将只讨论在vSphere存储堆栈中的队列。

对于大多数用户,默认的三个主要队列的队列大小在vSphere是普遍合适的,不需要任何调整。但是,对于那些在他们的环境中具有一个高层次整合或非常密集的存储工作负载的客户,一些在vSphere中的队列可能需要进行调整,以获得最佳性能。下图显示了在vSphere的三个主要队列,其典型的默认队列大小。正如你可以看到,I/O请求流入每个虚拟机队列中,然后流入每个HBA队列,最后适配器队列中的I/O流入每个LUN队列。从默认的尺寸,你可以看到每个虚拟机能够发出32个并发I/O请求,而下方的适配器队列是相当大的,通常可以接受所有的I/O请求,但在它下面的LU??N队列通常本身只有大小为32。这意味着,如果多个虚拟机共享一个LUN,LUN队列可能不够大,不足以支持所有的共享LUN的虚拟机所发送的并发I/O请求。

为什么虚拟机队列和LUN队列的设置只有32?设置限制的原因是为了防止一个虚拟机或vSphere主机,窃取所有的存储性能,用它自己的 I/O请求占据了存储,所谓的“吵闹的邻居”问题。例如,一个存储阵列LUN可以由多个vSphere主机共享,通过限制每个vSphere主机在这个 LUN上只有32个并发I/O,一个vSphere主机会饱和整个LUN而其他主机却挨饿的风险大大减少了。

然而,任意设置硬盘的限制是上世纪的处事方式。今天使用的功能,如存储I/O控制(SIOC),vSphere通过??一个更优雅的和公平的机制也可以减轻虚拟机和vSphere主机遇到吵闹的邻居的风险。因此,今天,如果你都注意到,您的设备队列,不断提高他们的最高限额,我们建议增加设备/ LUN的深度和使用SIOC,以帮助减轻任何潜在的吵闹的邻居问题。一个快速的小纸条,SIOC通过修改设备/ LUN队列的深度来控制存储工作负载,但SIOC不可以增加设备队列的深度以超出设定了的最大值。所以,在工作负荷需要更大的队列的时候,你需要自己调节队列的最大值,然后让SIOC在需要的时候减少它。

为什么要增加设备队列?增加了设备队列的原因是存储阵列通常是更有效的,如果它可以一次看到多个I/O请求。存储阵列知道越多的I/O,它更有效维护它们。这是因为存储阵列可以重新排列所要求的I/O块和利用I/O块的接近。例如,如果虚拟机要求在存储主轴上彼此非常接近的2块,存储阵列可获得第一个块,然后迅速收集第二个块,当主轴上的存储头正好“在附近” 。如果队列深度设置为1和存储阵列只能看到一个I/O请求,当磁盘头是“在附近”时,它不能有效地收集其他的I/O块,因为存储阵列不知道下一个你会想要什么块。

您可以监视,并检查当前的各种队列的队列深度,以及他们如何积极被使用。

要确定存储适配器的队列深度:

1. 在ESX主机或ESXi shell(技术支持模式)中的服务控制台运行esxtop命令。

2. 按D。

3. 按F,然后选择队列统计F.

4. AQLEN列的值是存储适配器的队列深度。这是适配器驱动程序配置为支持的ESX VMkernel活动命令的最大数量。

要确定存储设备队列深度:

1.在ESX主机或ESXi shell(技术支持模式)中的服务控制台运行esxtop命令。

2.按U。

3.按F,然后选择队列统计F.

4. DQLEN列的值是存储设备的队列深度。这是适配器驱动程序配置为支持的ESX VMkernel活动命令的最大数量。

如果你不断地发现,您的设备/LUN队列报告100%“主动/满”的,则它可能是一个指示,你的设备上的队列,或底层的存储有瓶颈。

另一个有趣的内容是在VMware ESX / ESXi中控制LUN队列深度的限制。

你在每个设备设置QFullSampleSize和QFullThreshold。

运行以下ESXCLI命令。

esxcli storage core device set –device device_name –queue-full-threshold Q –queue-full-sample-size S

在重新启动后设置是持久性的。

您可以通过使用相应的列表命令检索设备的值。

esxcli storage core device list

该命令支持可选的 – 设备参数。

esxcli storage core device list –device device

在早期版本中的推荐值是相同的。

QFullSampleSize:

• 对于3PAR,NetApp和IBM XIV存储阵列,QFullSampleSize值设置为32。

• 对于其他存储阵列,请联系您的存储供应商。

QFullThreshold:

• 对于3PAR存储阵列中,设置QFullThreshold值4。

• 对于NetApp和IBM XIV存储阵列,设置QFullThreshold值设置为8。

• 对于其他存储阵列,请联系您的存储供应商。

vSphere的一个功能,从存储阵列和设备/ LUN队列中来检测队列满的警告,这样vSphere发出的I/O请求的数量减少了。此功能默认情况下是关闭的,但根据您的存储供应商的最佳实践,应该启用。

总之,有很多虚拟化存储堆栈和队列,这些队列有各种不同的默认大小。对于大多数环境中,你并不需要调整队列。然而,对于I/O密集??型工作负载,产生了大量的并发I/O请求或高度整合的环境中,它可能是有益的调整,使存储阵列可以更有效地处理传入的I/O请求。使用SIOC和其他队列调节功能,可以减轻一些潜在的风险增加了vSphere的队列,但它始终是最好的做法进行测试和评估他们在生产中实施前后的变化,避免过度或不必要的修改,如果你没有注意到的队列队列满的瓶颈。