增加的 I/O 请求滞后时间会降低虚拟机性能

如果 ESXi 主机对 LUN 生成的命令超过 LUN 队列深度所允许的数量 , 则超出的命令会在 VMkernel 中排队 。
这会增加滞后时间 , 或是完成 I/O 请求所需的时间 。
问题
主机完成 I/O 请求所需的时间更长 , 且虚拟机会显示性能不佳 。
原因
这个问题可能是由于 LUN 队列深度不够而引起的 。SCSI 设备驱动程序有一个名为 LUN 队列深度的可配置参数 , 可确定向给定 LUN 发出的命令中同时处于活动状态的数量 。如果主机对 LUN 生成过多的命令 , 则超出的命令会在 VMkernel 中排队 。
解决方案
1 如果所有虚拟机中活动命令的总和总是超出 LUN 深度 , 则会增加队列深度 。
用于增加队列深度的过程取决于主机使用的存储适配器类型 。
2 调整
Disk.SchedNumReqOutstanding 参数 , 使其与队列深度值匹配 。
调整 QLogic 和 Emulex HBA 的队列深度
如果您对主机的性能不满意 , 请更改 QLogic 或 Emulex HBA 的最大队列深度 。
要调整最大队列深度参数 , 请使用 vCLI 命令 。
在此过程中 , --server=server_name 指定目标服务器 。指定的目标服务器会提示您输入用户名和密码 。支持其他连接选项 , 如配置文件或会话文件 。有关连接选项的列表 , 请参见 vSphere 命令行界面入门.
前提条件
安装 vCLI 或部署 vSphere Management Assistant (vMA) 虚拟机 。请参见 vSphere 命令行界面入门 。要进行故障排除 , 请在 ESXi Shell 中运行 esxcli 命令 。
步骤
1 通过输入以下命令之一确认当前正在加载的 HBA 模块:
对于 QLogic:esxcli --server=server_name system module list |grep qla
对于 Emulex:esxcli --server=server_name system module list |grep lpfc
2 调整相应模块的队列深度 。
注意 这些示例显示了 QLogic qla2xxx 和 Emulex lpfc820 模块 。请使用与上一步骤的输出相对应的模块 。
对于 QLogic:
esxcli --server=server_name system module parameters set -m qla2xxx -p ql2xmaxqdepth=value
对于 Emulex:
esxcli --server=server_name system module parameters set -m lpfc820 -p
lpfc0_lun_queue_depth=value
3 重新引导主机 。
4 通过运行以下命令确认更改:
esxcli --server=server_name system module parameters list -m=module 。
module 为 QLogic 或 Emulex 模块 , 如 lpfc820 或 qla2xxx 。
调整软件 iSCSI 的最大队列深度
【增加的 I/O 请求滞后时间会降低虚拟机性能】如果发现软件 iSCSI LUN 的性能不佳 , 请通过运行 esxcli 命令来更改其最大队列深度 。
前提条件
安装 vCLI 或部署 vSphere Management Assistant (vMA) 虚拟机 。请参见 vSphere 命令行界面入门 。要进
行故障排除 , 可以在 ESXi Shell 中运行 esxcli 命令 。
在此过程中 , --server=server_name 连接选项指定目标服务器 。准备好在目标服务器提示您时输入用户名和密码 。有关其他可能的连接选项的列表 , 请参见 vSphere 命令行界面入门 。
步骤
1 运行下列命令:
esxcli --server=server_name system module parameters set -m iscsi_vmk -p
iscsivmk_LunQDepth=value
iscsivmk_LunQDepth 参数用于为通过软件 iSCSI 适配器访问的每个 LUN 设置最大未完成命令数或队列深
度 。默认值为 128 。
2 重新引导系统 。
3 通过运行 esxcli --server=server_name system module parameters list -m iscsi_vmk 命令来确认所做的更改 。
小心 将队列深度设置为高于默认值的值 , 可减少受支持 LUN 的总数 。
更改虚拟机未完成磁盘请求的最大数目
如果调整了 LUN 队列深度 , 请更改
Disk.SchedNumReqOutstanding 参数 , 以便其值与队列深度匹配 。该参数控制每个虚拟机可以向 LUN 发出的未完成请求的最大数目 。
仅当有多个虚拟机在 LUN 上处于活动状态时才更改此参数 。此参数不适用于 LUN 上只有一个虚拟机处于活动状态的情况 。在这种情况下 , 带宽由存储适配器的队列深度限制 。
步骤
1 在 vSphere Client 清单面板中选择主机 。
2 单击配置选项卡 , 然后单击“软件”下的高级设置 。
3 在左侧面板中单击磁盘 , 并向下滚动至
Disk.SchedNumReqOutstanding 。
4 将参数值更改为所选的数字并单击确定 。
此更改可对磁盘带宽调度产生影响 , 但是实验结果证明此更改对磁盘密集型工作负载有改善作用 。


推荐阅读