Optimize NetScaler VPX performance on VMware ESX, Linux KVM, and Citrix Hypervisors
NetScaler VPX 的性能因管理程序、分配的系统资源和主机配置而异。为了达到所需的性能,请首先遵循 VPX 数据表中的建议,然后使用本文档中提供的最佳实践进一步优化。
运行于 VMware ESX 虚拟机监控程序平台上的 NetScaler VPX 实例对象
本节包含可配置选项和设置的详细信息,以及其他有助于您在 VMware ESX 管理程序上实现 NetScaler VPX 实例最佳性能的建议。
- ESX 主机上的推荐配置
- 配备有 E1000 型号网络接口的 NetScaler VPX 虚拟实例
- 配备有 VMXNET3 型号网络接口的 NetScaler VPX 虚拟实例
- NetScaler VPX with SR-IOV and PCI passthrough network interfaces
ESX 主机上的推荐配置
为了使使用 E1000、VMXNET3、SR-IOV 和 PCI 直通网络接口的 VPX 达到高性能,请遵循以下建议:
- ESX 主机上配置的虚拟 CPU (vCPU) 总数必须小于或等于 ESX 主机上的物理 CPU (pCPU) 总数。
-
必须为 ESX 主机设置非统一内存访问 (NUMA) 亲和性和 CPU 亲和性才能获得良好结果。
– 要查找 Vmnic 的 NUMA 亲和性,请在本地或远程登录到主机,然后键入:
#vsish -e get /net/pNics/vmnic7/properties | grep NUMA Device NUMA Node: 0 <!--NeedCopy-->- 要为 VM 设置 NUMA 和 vCPU 亲和性,请参阅 VMware 文档。
NetScaler VPX with E1000 network interfaces
在 VMware ESX 主机上执行以下设置:
- 在 VMware ESX 主机上,从一个 pNIC vSwitch 创建两个 vNIC。多个 vNIC 会在 ESX 主机中创建多个 Rx 线程。这会增加 pNIC 接口的 Rx 吞吐量。
- 为您创建的每个 vNIC 在 vSwitch 端口组级别启用 VLAN。
- 为了提高 vNIC 传输 (Tx) 吞吐量,请在 ESX 主机中为每个 vNIC 使用单独的 Tx 线程。使用以下 ESX 命令:
-
对于 ESX 5.5 版本:
esxcli system settings advanced set –o /Net/NetTxWorldlet –i <!--NeedCopy--> -
对于 ESX 6.0 及更高版本:
esxcli system settings advanced set -o /Net/NetVMTxType –i 1 <!--NeedCopy-->
-
-
为了进一步提高 vNIC Tx 吞吐量,请为每个设备 (NIC) 队列使用单独的 Tx 完成线程和 Rx 线程。使用以下 ESX 命令:
esxcli system settings advanced set -o /Net/NetNetqRxQueueFeatPairEnable -i 0 <!--NeedCopy-->
注意:
请务必重新启动 VMware ESX 主机以应用更新的设置。
每个 pNIC 部署两个 vNIC
以下是每个 pNIC 两个 vNIC 部署模型的示例拓扑和配置命令,该模型可提供更好的网络性能。

网思乐 VPX 示例配置:
为了实现前面示例拓扑中所示的部署,请在 NetScaler VPX 实例上执行以下配置:
-
在客户端,将 SNIP (1.1.1.2) 绑定到网络接口 1/1 并启用 VLAN 标记模式。
bind vlan 2 -ifnum 1/1 –tagged bind vlan 2 -IPAddress 1.1.1.2 255.255.255.0 <!--NeedCopy--> -
在服务器端,将 SNIP (2.2.2.2) 绑定到网络接口 1/1 并启用 VLAN 标记模式。
bind vlan 3 -ifnum 1/2 –tagged bind vlan 3 -IPAddress 2.2.2.2 255.255.255.0 <!--NeedCopy--> -
添加一个 HTTP 虚拟服务器 (1.1.1.100) 并将其绑定到服务 (2.2.2.100)。
add lb vserver v1 HTTP 1.1.1.100 80 -persistenceType NONE -Listenpolicy None -cltTimeout 180 add service s1 2.2.2.100 HTTP 80 -gslb NONE -maxClient 0 -maxReq 0 -cip DISABLED -usip NO -useproxyport YES -sp ON -cltTimeout 180 -svrTimeout 360 -CKA NO -TCPB NO -CMP NO bind lb vserver v1 s1 <!--NeedCopy-->
注意:
务必确保在路由表中包含以下两个条目:
- 1.1.1.0/24 子网,网关指向 SNIP 1.1.1.2
- 2.2.2.0/24 子网,网关指向 SNIP 2.2.2.2
配备 VMXNET3 网络接口的网思乐 VPX
为了使带有 VMXNET3 网络接口的 VPX 获得高性能,请在 VMware ESX 主机上执行以下设置:
- 从一个 pNIC vSwitch 创建两个 vNIC。多个 vNIC 会在 ESX 主机中创建多个 Rx 线程。这会增加 pNIC 接口的 Rx 吞吐量。
- 为您创建的每个 vNIC 在 vSwitch 端口组级别启用 VLAN。
- 为了提高 vNIC 传输 (Tx) 吞吐量,请在 ESX 主机中为每个 vNIC 使用单独的 Tx 线程。使用以下 ESX 命令:
- 对于 ESX 5.5 版本:
esxcli system settings advanced set –o /Net/NetTxWorldlet –i <!--NeedCopy-->- 对于 ESX 6.0 及更高版本:
esxcli system settings advanced set -o /Net/NetVMTxType –i 1 <!--NeedCopy-->
在 VMware ESX 主机上,执行以下配置:
- 在 VMware ESX 主机上,从 1 个 pNIC vSwitch 创建两个 vNIC。多个 vNIC 会在 ESX 主机中创建多个 Tx 和 Rx 线程。这会增加 pNIC 接口的 Tx 和 Rx 吞吐量。
- 在您创建的每个 vNIC 的 vSwitch 端口组级别启用 VLAN。
-
为了提高 vNIC 的 Tx 吞吐量,请为每个设备 (NIC) 队列使用单独的 Tx 完成线程和 Rx 线程。使用以下命令:
esxcli system settings advanced set -o /Net/NetNetqRxQueueFeatPairEnable -i 0 <!--NeedCopy--> -
通过将以下设置添加到 VM 的配置中,将 VM 配置为每个 vNIC 使用一个传输线程:
ethernetX.ctxPerDev = "1" <!--NeedCopy--> -
通过将以下设置添加到 VM 的配置中,将 VM 配置为每个 vNIC 最多使用 8 个传输线程:
ethernetX.ctxPerDev = "3" <!--NeedCopy-->注意:
增加每个 vNIC 的传输线程需要 ESX 主机上更多的 CPU 资源(最多 8 个)。在进行上述设置之前,请确保有足够的 CPU 资源可用。
注意:
请确保重新启动 VMware ESX 主机以应用更新的设置。
您可以将 VMXNET3 配置为每个 pNIC 两个 vNIC部署。有关更多信息,请参阅每个 pNIC 两个 vNIC 部署。
在 VMware ESX 上为 VMXNET3 设备配置多队列和 RSS 支持
默认情况下,VMXNET3 设备仅支持 8 个 Rx 和 Tx 队列。当 VPX 上的 vCPU 数量超过 8 时,为 VMXNET3 接口配置的 Rx 和 Tx 队列数量默认切换为 1。您可以通过更改 ESX 上的某些配置,为 VMXNET3 设备配置最多 19 个 Rx 和 Tx 队列。此选项可提高性能并使数据包在 VPX 实例的 vCPU 之间均匀分布。
注意:
从 NetScaler 13.1 版本构建 48.x 开始,NetScaler VPX 在 ESX 上针对 VMXNET3 设备最多支持 19 个接收和发送队列。
先决条件:
要在 ESX 上为 VMXNET3 设备配置最多 19 个 Rx 和 Tx 队列,请确保满足以下先决条件:
- NetScaler VPX 版本为 13.1 构建 48.X 及更高版本。
- NetScaler VPX 配置为硬件版本 17 及更高版本的虚拟机,该虚拟机受 VMware ESX 7.0 及更高版本支持。
配置 VMXNET3 接口以支持超过 8 个 Rx 和 Tx 队列:
- 打开虚拟机配置文件 (.vmx) 文件。
-
通过配置
ethernetX.maxTxQueues和ethernetX.maxRxQueues值来指定 Rx 和 TX 队列的数量(其中 X 是要配置的虚拟网卡的数量)。配置的最大队列数不得大于虚拟机中的 vCPU 数量。注意:
增加队列数量也会增加 ESX 主机上的处理器开销。因此,在增加队列之前,请确保 ESX 主机中有足够的 CPU 资源。在队列数量被确定为性能瓶颈的情况下,您可以增加支持的最大队列数量。在这种情况下,我们建议逐渐增加队列数量。例如,从 8 增加到 12,然后到 16,然后到 20,依此类推。在每个设置下评估性能,而不是直接增加到最大限制。
NetScaler VPX,支持单根 I/O 虚拟化和 PCI 直通网络接口
要实现具有 SR-IOV 和 PCI 直通网络接口的 VPX 的高性能,请参阅 ESX 主机上的推荐配置。
NetScaler VPX instance on Linux-KVM platform
本节包含可配置选项和设置的详细信息,以及其他有助于您在 Linux-KVM 平台上实现 NetScaler VPX 实例最佳性能的建议。
KVM 的性能设置
在 KVM 主机上执行以下设置:
使用 lstopo 命令查找网卡的 NUMA 域:
确保 VPX 和 CPU 的内存固定在同一位置。 在以下输出中,10G 网卡“ens2”绑定到 NUMA 域 #1。

从 NUMA 域分配 VPX 内存。
numactl 命令指示分配内存的 NUMA 域。在以下输出中,大约 10 GB RAM 从 NUMA 节点 #0 分配。

要更改 NUMA 节点映射,请按照以下步骤操作。
-
编辑主机上 VPX 的 .xml 文件。
/etc/libvirt/qemu/<VPX_name>.xml <!--NeedCopy--> -
添加以下标签:
<numatune> <memory mode="strict" nodeset="1"/> This is the NUMA domain name </numatune> <!--NeedCopy--> -
关闭 VPX。
-
运行以下命令:
virsh define /etc/libvirt/qemu/<VPX_name>.xml <!--NeedCopy-->此命令使用 NUMA 节点映射更新 VM 的配置信息。
-
启动 VPX。然后检查主机上的
numactl –hardware命令输出,查看 VPX 的更新内存分配。
将 VPX 的 vCPU 绑定到物理核心。
-
要查看 VPX 的 vCPU 到 pCPU 映射,请键入以下命令
virsh vcpupin <VPX name> <!--NeedCopy-->
vCPU 0–4 映射到物理核心 8–11。
-
要查看当前的 pCPU 使用情况,请键入以下命令:
mpstat -P ALL 5 <!--NeedCopy-->
在此输出中,8 是管理 CPU,9–11 是数据包引擎。
-
要更改 vCPU 到 pCPU 的绑定,有两种选择。
-
在 VPX 启动后,使用以下命令在运行时更改它:
virsh vcpupin <VPX name> <vCPU id> <pCPU number> virsh vcpupin NetScaler-VPX-XML 0 8 virsh vcpupin NetScaler-VPX-XML 1 9 virsh vcpupin NetScaler-VPX-XML 2 10 virsh vcpupin NetScaler-VPX-XML 3 11 <!--NeedCopy--> -
要对 VPX 进行静态更改,请像以前一样编辑
.xml文件,并添加以下标签:-
编辑主机上 VPX 的 .xml 文件
/etc/libvirt/qemu/<VPX_name>.xml <!--NeedCopy--> -
添加以下标签:
<vcpu placement='static' cpuset='8-11'>4</vcpu> <cputune> <vcpupin vcpu='0' cpuset='8'/> <vcpupin vcpu='1' cpuset='9'/> <vcpupin vcpu='2' cpuset='10'/> <vcpupin vcpu='3' cpuset='11'/> </cputune> <!--NeedCopy--> -
关闭 VPX。
-
使用以下命令更新 VM 的配置信息以及 NUMA 节点映射:
virsh define /etc/libvirt/qemu/ <VPX_name>.xml <!--NeedCopy--> -
启动 VPX。然后检查主机上的
virsh vcpupin <VPX name>命令输出,查看更新后的 CPU 绑定。
-
-
消除主机中断开销。
-
使用
kvm_stat命令检测 VM_EXITS。在虚拟机管理程序级别,主机中断映射到 VPX 的 vCPU 所绑定的同一 pCPU。这可能导致 VPX 上的 vCPU 定期被踢出。
要查找在主机上运行的虚拟机执行的 VM 退出,请使用
kvm_stat命令。[root@localhost ~]# kvm_stat -1 | grep EXTERNAL kvm_exit(EXTERNAL_INTERRUPT) 1728349 27738 [root@localhost ~]# <!--NeedCopy-->1+M 数量级的较高值表示存在问题。
如果存在单个虚拟机,预期值为 30–100 K。任何超出此范围的值都可能表明有一个或多个主机中断向量映射到同一 pCPU。
-
检测主机中断并迁移主机中断。
当您对“/proc/interrupts”文件运行
concatenate命令时,它会显示所有主机中断映射。如果一个或多个活动 IRQ 映射到同一 pCPU,其对应的计数器会递增。将与 NetScaler VPX 的 pCPU 重叠的任何中断移动到未使用的 pCPU:
echo 0000000f > /proc/irq/55/smp_affinity 0000000f - - > it is a bitmap, LSBs indicates that IRQ 55 can only be scheduled on pCPUs 0 – 3 <!--NeedCopy--> -
禁用 IRQ 平衡。
禁用 IRQ 平衡守护程序,以便不会即时发生重新调度。
service irqbalance stop service irqbalance show - To check the status service irqbalance start - Enable if needed <!--NeedCopy-->确保运行
kvm_stat命令以确保计数器不多。
NetScaler VPX 在使用 PV 网络接口时的配置
您可以将半虚拟化 (PV)、SR-IOV 和 PCIe 直通网络接口配置为每个 pNIC 两个 vNIC 部署。有关详细信息,请参阅 每个 pNIC 两个 vNIC 部署。
为获得 PV (virtio) 接口的最佳性能,请执行以下步骤:
- 识别 PCIe 插槽/网卡所属的 NUMA 域。
- VPX 的内存和 vCPU 必须固定到同一个 NUMA 域。
- Vhost 线程必须绑定到同一 NUMA 域中的 CPU。
将虚拟主机线程绑定到相应的 CPU:
-
流量启动后,在主机上运行
top命令。
- 识别虚拟主机进程(命名为
vhost-<pid-of-qemu>)的亲和性。 -
使用以下命令将 vHost 进程绑定到之前识别的 NUMA 域中的物理核心:
taskset –pc <core-id> <process-id> <!--NeedCopy-->示例:
taskset –pc 12 29838 <!--NeedCopy--> -
可以使用以下命令识别与 NUMA 域对应的处理器核心:
[root@localhost ~]# virsh capabilities | grep cpu <cpu> </cpu> <cpus num='8'> <cpu id='0' socket_id='0' core_id='0' siblings='0'/> <cpu id='1' socket_id='0' core_id='1' siblings='1'/> <cpu id='2' socket_id='0' core_id='2' siblings='2'/> <cpu id='3' socket_id='0' core_id='3' siblings='3'/> <cpu id='4' socket_id='0' core_id='4' siblings='4'/> <cpu id='5' socket_id='0' core_id='5' siblings='5'/> <cpu id='6' socket_id='0' core_id='6' siblings='6'/> <cpu id='7' socket_id='0' core_id='7' siblings='7'/> </cpus> <cpus num='8'> <cpu id='8' socket_id='1' core_id='0' siblings='8'/> <cpu id='9' socket_id='1' core_id='1' siblings='9'/> <cpu id='10' socket_id='1' core_id='2' siblings='10'/> <cpu id='11' socket_id='1' core_id='3' siblings='11'/> <cpu id='12' socket_id='1' core_id='4' siblings='12'/> <cpu id='13' socket_id='1' core_id='5' siblings='13'/> <cpu id='14' socket_id='1' core_id='6' siblings='14'/> <cpu id='15' socket_id='1' core_id='7' siblings='15'/> </cpus> <cpuselection/> <cpuselection/> <!--NeedCopy-->
将 QEMU 进程绑定到相应的物理核心:
- 识别 QEMU 进程正在运行的物理核心。有关更多信息,请参阅前面的输出。
-
使用以下命令将 QEMU 进程绑定到与 vCPU 绑定的相同物理核心:
taskset –pc 8-11 29824 <!--NeedCopy-->
NetScaler VPX with SR-IOV and Fortville PCIe passthrough network interfaces
为了获得 SR-IOV 和 Fortville PCIe 直通网络接口的最佳性能,请遵循以下步骤:
- 识别 PCIe 插槽/网卡所绑定的 NUMA 域。
- VPX 的内存和 vCPU 必须绑定到同一个 NUMA 域。
适用于 Linux KVM 的 vCPU 和内存绑定 VPX XML 示例文件:
<domain type='kvm'>
<name>NetScaler-VPX</name>
<uuid>138f7782-1cd3-484b-8b6d-7604f35b14f4</uuid>
<memory unit='KiB'>8097152</memory>
<currentMemory unit='KiB'>8097152</currentMemory>
<vcpu placement='static'>4</vcpu>
<cputune>
<vcpupin vcpu='0' cpuset='8'/>
<vcpupin vcpu='1' cpuset='9'/>
<vcpupin vcpu='2' cpuset='10'/>
<vcpupin vcpu='3' cpuset='11'/>
</cputune>
<numatune>
<memory mode='strict' nodeset='1'/>
</numatune>
</domain>
<!--NeedCopy-->
思杰虚拟机监控程序上的 NetScaler VPX 实例
本节包含有关可配置选项和设置以及其他建议的详细信息,可帮助您实现 Citrix Hypervisor 上 NetScaler VPX 实例的最佳性能。
适用于思杰 Hypervisor 的性能设置
使用“xl”命令查找网卡的 NUMA 域:
xl info -n
<!--NeedCopy-->
将 VPX 的 vCPU 绑定到物理核心。
xl vcpu-pin <Netsclaer VM Name> <vCPU id> <physical CPU id>
<!--NeedCopy-->
检查 vCPU 的绑定。
xl vcpu-list
<!--NeedCopy-->
为 NetScaler 虚拟机分配超过 8 个虚拟 CPU。
要配置超过 8 个 vCPU,请从 Citrix Hypervisor™ 控制台运行以下命令:
xe vm-param-set uuid=your_vms_uuid VCPUs-max=16
xe vm-param-set uuid=your_vms_uuid VCPUs-at-startup=16
<!--NeedCopy-->
带 单根 I/O 虚拟化 网络接口的 NetScaler VPX
为了获得 SR-IOV 网络接口的最佳性能,请执行以下步骤:
- 确定 PCIe 插槽或 NIC 所属的 NUMA 域。
- 将 VPX 的内存和 vCPU 绑定到相同的 NUMA 域。
- 将 Domain-0 vCPU 绑定到剩余的中央处理器。
带有半虚拟化接口的 NetScaler VPX
为了获得最佳性能,建议采用每个 pNIC 两个 vNIC 和每个 pNIC 一个 vNIC 的配置,这与其他 PV 环境相同。
为了实现半虚拟化 (netfront) 接口的最佳性能,请执行以下步骤:
- 确定 PCIe 插槽或 NIC 所属的 NUMA 域。
- 将 VPX 的内存和 vCPU 绑定到相同的 NUMA 域。
- 将 Domain-0 虚拟 CPU 绑定到同一 NUMA 域的剩余 CPU。
- 将虚拟网卡的主机 Rx/Tx 线程固定到 Domain-0 虚拟 CPU。
将主机线程绑定到 Domain-0 vCPU:
- 通过在 Citrix Hypervisor 主机命令行界面上使用
xl list命令查找 VPX 的 Xen-ID。 -
通过使用以下命令识别主机线程:
ps -ax | grep vif <Xen-ID> <!--NeedCopy-->在以下示例中,这些值表示:
- vif5.0 - 分配给 XenCenter 中 VPX 的第一个接口的线程(管理接口)。
- vif5.1 - 分配给 VPX 的第二个接口的线程,依此类推。
xl list 命令的输出(/zh-cn/vpx/media/xl-list-command.png)
-
使用以下命令将线程固定到 Domain-0 vCPU:
taskset –pc <core-id> <process-id> <!--NeedCopy-->示例:
taskset -pc 1 29189 <!--NeedCopy-->