免责声明:本文为 ESX/ESXi hosts might experience read or write performance issues with certain storage arrays (1002598)的翻译版本。尽管我们会不断努力为本文提供最佳翻译版本,但本地化的内容可能会过时。有关最新内容,请参见英文版本。
不同阵列供应商提供的某些 iSCSI 存储阵列在网络拥塞时间段出现不恰当行为。此问题与这些阵列的 TCP/IP 实施有关,并可能严重影响通过 iSCSI 启动器连接到 ESXi/ESX 软件的存储的读取性能。此问题在涉及 Microsoft iSCSI 启动器的本地(非虚拟化)环境中已报告。
背景概念
要理解此问题,应熟悉几个 TCP 概念:- 延迟 ACK
- 慢启动
- 拥塞避免
延迟 ACK
TCP 网络协议的中心规则是接收器确认收到通过 TCP 发送的数据。根据 RFC 813,“非常简单,当数据到达接收器时,协议要求接收器返回此数据的确认。协议指定按顺序将数据字节编号,以便接收器通过为接收到的编号最高的数据字节命名来确认数据,同时也确认之前的字节。 承载确认的 TCP 数据包称为 ACK。
主机收到一串 TCP 数据段时,可以通过为收到的每条数据段发送一条以下 ACK 确认分段来提高网络和主机的效率。这称为延迟 ACK。常规做法是为每两个完整大小的数据分段发送一条 ACK,并且通过多个指定阈值确保不会延迟某个分段的 ACK。此阈值在 100 ms 到 500 ms 之间变化。与大多数其他服务器一样,ESXi/ESX 也使用延迟 ACK 的优势。
慢启动和拥塞避免
从源到目标的两个网络元素之间的数据处理能力不匹配时,可能会发生拥塞。拥塞表现为延迟、超时或数据包丢失。要避免拥塞以及从拥塞恢复,TCP 使用两种算法:拥塞避免算法和慢启动算法。尽管这两个算法的底层机制不同,其基本概念都是一样的:TCP 发送器在发生拥塞时必须降低其数据传输速率,然后在重新传输的数据段获得确认时提高速率。
发生拥塞时,使用延迟 ACK 和慢启动的 TCP/IP 网络的典型恢复顺序为:
- 发送器在重新传输超时时间段内未收到 ACK 确认时,会检测拥塞。
- 发送器在将剩余分段排序以便重新传输之前,会重新传输第一个数据分段并等待 ACK。
- 接收器收到重新传输的数据分段后,启动延迟 ACK 计时器。
- 延迟 ACK 计时器超时后,接收器会传输 ACK。在等待期间,发送器和接收器之间没有其他传输。
- 发送 ACK 后,发送器会连续重新传输接下来的两个数据段。
- 接收器收到第二个数据段后,立即传输 ACK。
- 发送器收到 ACK 后,将连续重新传输接下来的四个数据段。
- 拥塞时间段结束且网络恢复正常流量速率之前,此顺序将一直持续。
问题描述
问题中受影响的 iSCSI 阵列处理拥塞的方式稍有不同。与主机实施慢启动算法或拥塞避免算法或同时实施两者不同的是,阵列采用非常保守的方式每次只重新传输一个丢失的数据分段,并等待主机的 ACK 后再重新传输下一个数据分段。此过程将继续,直到所有丢失的数据段全部恢复。
这种方法与 ESXi/ESX 主机上已实施的延迟 ACK 结合使用,可减慢拥塞网络中的读取性能直至停止。因此,使用此类型阵列的主机的内核日志会报告频繁超时。最值得注意的是,由于 VMFS 使用较小的超时值,VMFS 检测信号将出现大量超时。此配置也会出现客户机报告过长的读取响应时间(大约几十秒)。读取块大小较大的数据时,此问题会更加严重。在这种情况下,高带宽分配会造成网络拥塞,且每个 I/O 由很多数据段组成,需要更长的恢复时间。
在 vmkernel.log
文件中,您可能会看到类似如下内容的条目:-09-17T15:07:19Z iscsid: discovery_sendtargets::Running discovery on IFACE iscsi_vmk@vmk2(iscsi_vmk) (drec.transport=iscsi_vmk)
-09-17T15:07:19Z iscsid: cannot make connection to 10.0.68.2:3260 (111)
-09-17T15:07:19Z iscsid: connection to discovery address 10.0.68.2 failed
-09-17T15:07:19Z iscsid: connection login retries (reopen_max) 5 exceeded
-09-17T15:07:19Z iscsid: Login Target Skipped: iqn.2003-10.com.lefthandnetworks:hvtiscsi:1808:vmwds01 if=iscsi_vmk@vmk1 addr=10.0.68.2:3260 (TPGT:1 ISID:0x2) (Already Running)
-09-17T15:07:19Z iscsid: Login Target Skipped: iqn.2003-10.com.lefthandnetworks:hvtiscsi:1808:vmwds01 if=iscsi_vmk@vmk2 addr=10.0.68.2:3260 (TPGT:1 ISID:0x3) (Already Running)
iSCSI 阵列供应商在终端解决此问题之前,请在设计 IP 存储网络时提供足够的容量,以便满足峰值使用量并降低拥塞风险。如果您遇到本文所描述的问题,且无法更改您的网络配置或确保无拥塞环境,则可以尝试以下解决办法。
此权宜措施包括通过配置选项在 ESX/ESXi 主机上禁用延迟 ACK。注意:请联系您的存储供应商,确认禁用延迟 ACK 是否是针对其存储阵列推荐的权宜措施。
ESX/ESXi 3.5 和 4.x/5.x/6.0 之间处理延迟 ACK 的差异
ESX/ESXi 3.5 和 4.x/5.x/6.0 之间禁用延迟 ACK 的方式略有差异。ESX/ESXi 3.5 和 4.x/5.x/6.0 之间的主要差异是延迟 ACK 设置的工作原理与其设置:- 在 ESX/ESXi 3.5 中,延迟 ACK 设置对于 ESX/ESXi 系统而言是全局的。
通过设置此选项,无论 TCP 是否尝试进行拥塞恢复并正常运行,您都可以完全禁用延迟 ACK。此选项会影响整个 TCP/IP 堆栈,因此,如果您实施此更改,所有 TCP/IP 应用程序都会受影响。因而,设置此选项可能降低 iSCSI 和其他应用程序的性能(例如 NFS 和 vMotion),同样会导致拥塞。尽管如此,此选项允许受影响的 iSCSI 阵列在其他事务期间,从拥塞中迅速恢复并保持合理的性能。
- 在 ESX/ESXi 4.x/5.x/6.0 中,配置延迟 ACK 设置的建议方法是在每个发现目标上配置。您也可以在每个单独目标上配置延迟 ACK 设置。此外,尽管不推荐,您仍然可以为所有 iSCSI 目标全局配置延迟 ACK 设置。
在 ESXi 中配置延迟 ACK。
要在 ESXi 中实施此权宜措施,请使用 vSphere Client 禁用延迟 ACK。
在 ESXi 6.5、ESXi 6.7 中禁用延迟 ACK。
- 登录到 Web Client,然后选择主机。
- 右键单击主机,然后单击“维护模式”。
- 等待进入维护模式任务完成。
- 导航到“配置”选项卡。
- 单击“存储适配器”。
- 单击要修改的 iSCSI vmhba。
- 要在发现地址上修改延迟 ACK 设置,请执行以下操作:
- 单击“适配器详细信息”的“目标”选项卡。
- 单击“动态发现”。
- 单击“高级设置”。
- 在延迟 ACK“高级参数”选项中,取消选中“从父项继承”和 DelayedACK。
- 单击“确定”
- 重新引导主机。
在 ESX/ESXi 4.x、ESXi 5.x 和 ESXi 6.0 中禁用延迟 ACK。
- 登录到 vSphere Client,然后选择主机。
- 右键单击主机,然后单击维护模式。
- 等待进入维护模式任务完成。
- 导航到配置选项卡。
- 单击存储适配器。
- 单击要修改的 iSCSI vmhba。
- 单击属性。
- 修改延迟 ACK 设置,使用最符合您站点要求的选项:
- 要在发现地址上修改延迟 ACK 设置,请执行以下操作(推荐):
- 在发现地址上,单击动态发现选项卡。
- 单击服务器地址选项卡。
- 单击设置 > 高级。
- 在延迟 ACK“高级参数”选项中,取消选中从父项继承和 DelayedACK。
- 单击确定。
- 在一组特定目标上修改延迟 ACK 设置:
- 在发现地址上,单击静态发现选项卡。
- 选择所使用阵列上的所有目标。
- 单击“移除”以删除所选条目。
- 单击动态发现选项卡。
- 移除所使用阵列上的所有目标。
- 输入发现地址,但是先不重新扫描适配器。
- 选择要修改的发现地址,然后单击设置 > 高级。
- 在延迟 ACK“高级参数”选项中,取消选中从父项继承和 DelayedACK。
- 单击确定。
- 为要修改的每个发现地址重复步骤 f-i。
- 要全局修改延迟 ACK 设置,请执行以下操作:
- 选择常规选项卡。
- 单击高级。
- 在延迟 ACK“高级参数”选项中,取消选中从父项继承和 DelayedACK。
- 单击确定。
- 要在发现地址上修改延迟 ACK 设置,请执行以下操作(推荐):
- 重新引导主机。
在 ESX/ESXi 4.x、ESXi 5.x 和 ESXi 6.0 中重新启用延迟 ACK
- 登录到 vSphere Client,然后选择主机。
- 导航到高级设置页面,如上述“在 ESX/ESXi 4.x、ESXi 5.x 和 ESXi 6.0 中禁用延迟 ACK”任务所述。
- 单击从父项继承 > DelayedAck。
- 重新引导主机。
在 ESX/ESXi 4.x、ESXi 5.x 和 ESXi 6.0 中查看延迟 ACK 的当前设置
- 登录到 vSphere Client,然后选择主机。
- 导航到高级设置页面,如上述“在 ESX/ESXi 4.x、ESXi 5.x 和 ESXi 6.0 中禁用延迟 ACK”任务所述。
- 查看 DelayedAck 设置。
如果已查看 DelayedAck 设置,将启用此选项。如果在更改延迟 ACK 设置后且在重新引导主机之前查看,结果将显示新设置而不是当前使用的设置。
注意:- 要禁用 delayed_ack,请从命令行运行以下命令:
vmkiscsi-tool -W -a delayed_ack=0 -j vmhbaXX
要启用 delayed_ack,请运行以下命令:vmkiscsi-tool -W -a delayed_ack=1
-j
vmhbaXX
- 要查看此参数,请运行以下命令:
vmkiscsi-tool -W vmhbaXX
- 要禁用 delayed_ack,请从命令行运行以下命令:
在 ESX/ESXi 3.5 中配置延迟 ACK
要在 ESX/ESXi 3.5 中实施此权宜措施,请使用 VI Client 更改 Net.TcpipDelayedAck
高级参数设置。默认情况下,此选项设置为 1,将启用延迟 ACK。要禁用延迟 ACK,请执行以下步骤。
在 ESX/ESXi 3.5 中禁用延迟 ACK
- 登录到 VI Client,然后选择主机。
- 单击配置选项卡,然后单击高级设置。
- 单击网络,然后在高级参数列表上滚动直到找到
Net.TcpipDelayedAck
参数。 - 将参数值设置为 0.
- 单击确定。
- 重新引导主机。
在 ESX/ESXi 3.5 上重新启用延迟 ACK
- 登录到 VI Client,然后选择主机。
- 单击配置选项卡,然后选择高级设置。
- 选择网络,然后在高级参数列表上滚动直到找到
Net.TcpipDelayedAck
参数。 - 将参数值设置为 1。
- 单击确定。
- 重新引导主机。
在 ESX/ESXi 3.5 中查看延迟 ACK 的当前设置
- 登录到 VI Client,然后选择主机。
- 单击配置选项卡,然后选择高级设置。
- 选择网络,然后在高级参数列表上滚动直到找到
Net.TcpipDelayedAck
参数。 - 查看设置。设置为 1 表示已启用延迟 ACK,设置为 0 表示已禁用。
- 单击确定。
注意:重新引导后,延迟 ACK 更改才会生效。如果在执行更改后未重新引导主机,则查看结果将显示新的设置而不是当前使用的设置。