vSphere的存储队列是什么,须要改变吗?前端
咱们都不得不在咱们的生活中等待一次或两次排队,排队等候只是一个生活的元素。在存储领域,这是真实的;存储I / O有大量的队列,他们必须等待。在这篇文章中,咱们分析了在虚拟化存储堆栈的不一样队列,讨论什么时候,如何,以及为何要修改它们。shell
队列是必要的,但主要它们被用来容许共享的资源,并容许并发流。经过使用队列,vSphere是可以让多个虚拟机共享一个单一的资源。队列还容许应用程序同时在一个LUN上有多个活动的I / O请求,它提供了并发性,并提升了性能。但这里有一个权衡,若是你容许太多的并发,底层的资源可能会饱和。为了防止一个虚拟机或一台主机出现底层资源的饱和,队列须要设置尺寸/限制来规定能够一次发送I / O请求的数量限制。并发
在一个虚拟化的环境中有多个队列。在堆栈的顶部,有guest OS内部使用的各类存储队列。这包括由应用程序自己和存储装置内部使用来宾OS驱动程序建立和使用的队列。在的vSphere软件堆栈内的虚拟化层,有三个主要的队列。一个世界队列(每一个虚拟机有一个队列),适配器队列(主机中的每个HBA有一个队列),以及设备/LUN队列(每一个LUN,每一个适配器有一个队列)。最后,在存储堆栈底部的有存储装置的队列,例如前端存储端口具备可用于全部传入在该端口上的I / O的一个队列。性能
在调查存储性能问题和瓶颈的时候,你应该调查从应用程序和客户操做系统到存储阵列的各个级别的存储堆栈的排队状况。在这篇文章中,我将只讨论在vSphere存储堆栈中的队列。测试
对于大多数用户,默认的三个主要队列的队列大小在vSphere是广泛合适的,不须要任何调整。可是,对于那些在他们的环境中具备一个高层次整合或很是密集的存储工做负载的客户,一些在vSphere中的队列可能须要进行调整,以得到最佳性能。下图显示了在vSphere的三个主要队列,其典型的默认队列大小。正如你能够看到,I / O请求流入每一个虚拟机队列中,而后流入每一个HBA队列,最后适配器队列中的I / O流入每一个LUN队列。从默认的尺寸,你能够看到每一个虚拟机可以发出32个并发I / O请求,而下方的适配器队列是至关大的,一般能够接受全部的I / O请求,但在它下面的LUN队列一般自己只有大小为32。这意味着,若是多个虚拟机共享一个LUN,LUN队列可能不够大,不足以支持全部的共享LUN的虚拟机所发送的并发I / O请求。spa
为何虚拟机队列和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在须要的时候减小它。 orm
为何要增长设备队列?增长了设备队列的缘由是存储阵列一般是更有效的,若是它能够一次看到多个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的队列,但它始终是最好的作法进行测试和评估他们在生产中实施先后的变化,避免过分或没必要要的修改,若是你没有注意到的队列队列满的瓶颈。