ADC

在 VMware ESX、Linux KVM 和 Citrix Hypervisor 上优化 NetScaler VPX 性能

NetScaler VPX 的性能因虚拟机管理程序、分配的系统资源和主机配置而异。要获得所需的性能,请首先遵循 VPX 数据手册中的建议,然后使用本文档中提供的最佳实践进一步优化它。

VMware ESX 虚拟机管理程序上的 NetScaler VPX 实例

本部分包含可配置选项和设置的详细信息,以及其他有助于您在 VMware ESX 虚拟机管理程序上实现 NetScaler VPX 实例的最佳性能的建议。

ESX 主机上的推荐配置

要使用 E1000、VMXNET3、SR-IOV 和 PCI 直通网络接口实现 VPX 的高性能,请遵循以下建议:

  • ESX 主机上预配的虚拟 CPU (vCPU) 总数必须小于或等于 ESX 主机上的物理 CPU (PCU) 总数。
  • 必须为 ESX 主机设置非统一内存访问 (NUMA) 关联性和 CPU 关联性才能获得良好结果。

    — 要查找 Vmnic 的 NUMA 关联性,请在本地或远程登录到主机,然后键入:

     #vsish -e get /net/pNics/vmnic7/properties | grep NUMA
     Device NUMA Node: 0
     <!--NeedCopy-->
    
    • 要为虚拟机设置 NUMA 和 vCPU 关联性,请参阅 VMware 文档

带有 E1000 网络接口的 NetScaler VPX

在 VMware ESX 主机上执行以下设置:

  • 在 VMware ESX 主机上,从一台 pNIC 虚拟交换机创建两个虚拟网卡。多个 vNIC 在 ESX 主机中创建多个接收 (Rx) 线程。这会增加 pNIC 接口的 Rx 吞吐量。
  • 在 vSwitch 端口组级别为已创建的每个虚拟网卡启用 VLAN。
  • 要提高 vNIC 传输 (Tx) 吞吐量,请在每个 vNIC 的 ESX 主机中使用单独的 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 吞吐量,请使用单独的 Tx 完成线程和每个设备的接收线程 (NIC) 队列。使用以下 ESX 命令:

     esxcli system settings advanced set -o /Net/NetNetqRxQueueFeatPairEnable -i 0
     <!--NeedCopy-->
    

注意:

确保重新启动 VMware ESX 主机以应用更新后的设置。

每个 pNIC 部署两个 vNIC

以下是 每个 pNIC 部署两个 vNIC 模型的示例拓扑和配置命令,可提供更好的网络性能。

每个 pNIC 部署两个 vNIC

NetScaler 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 网络接口的 NetScaler VPX

要使用 VMXNET3 网络接口实现 VPX 的高性能,请在 VMware ESX 主机上执行以下设置:

  • 从一台 pNIC vSwitch 创建两个虚拟网卡。多个虚拟网卡在 ESX 主机中创建多个 Rx 线程。这会增加 pNIC 接口的 Rx 吞吐量。
  • 在 vSwitch 端口组级别为已创建的每个虚拟网卡启用 VLAN。
  • 要提高 vNIC 传输 (Tx) 吞吐量,请在每个 vNIC 的 ESX 主机中使用单独的 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 主机上,从一台 pNIC 虚拟交换机创建两个虚拟网卡。多个虚拟网卡在 ESX 主机中创建多个 Tx 和 Rx 线程。这会增加 pNIC 接口的 Tx 和 Rx 吞吐量。
  • 在 vSwitch 端口组级别为已创建的每个虚拟网卡启用 VLAN。
  • 要增加 vNIC 的 Tx 吞吐量,请使用单独的 Tx 完成线程和每个设备的接收线程 (NIC) 队列。使用以下命令:

     esxcli system settings advanced set -o /Net/NetNetqRxQueueFeatPairEnable -i 0
     <!--NeedCopy-->
    
  • 通过将以下设置添加到虚拟机的配置中,将虚拟机配置为每个 vNIC 使用一个传输线程:

     ethernetX.ctxPerDev = "1"
     <!--NeedCopy-->
    
  • 通过在虚拟机的配置中添加以下设置,将虚拟机配置为每个 vNIC 最多使用 8 个传输线程:

     ethernetX.ctxPerDev = "3"
     <!--NeedCopy-->
    

    注意:

    增加每个 vNIC 的传输线程需要在 ESX 主机上使用更多 CPU 资源(最多 8 个)。在进行上述设置之前,请确保有足够的 CPU 资源可用。

有关更多信息,请参阅 vSphere 中 Telco 和 NFV 工作负载性能调整的最佳做法

注意:

确保重新启动 VMware ESX 主机以应用更新后的设置。

您可以将 VMXNET3 配置为 每个 pNIC 部署两个虚拟 网卡。有关详细信息,请参阅 每个 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 build 48.x 开始,NetScaler VPX 在 ESX 上支持多达 19 个 VMXNET3 设备的 Rx 和 Tx 队列。

必备条件:

要在 ESX 上为 VMXNET3 设备配置多达 19 个 Rx 和 Tx 队列,请确保满足以下先决条件:

  • NetScaler VPX 版本是 13.1 版本 48.X 及更高版本。
  • NetScaler VPX 配置了硬件版本 17 及更高版本的虚拟机,VMware ESX 7.0 及更高版本支持该虚拟机。

将 VMXNET3 接口配置为支持 8 个以上的 Rx 和 Tx 队列:

  1. 打开虚拟机配置文件 (.vmx) 文件。
  2. 通过配置和 ethernetX.maxRxQueues 值来指定 Rx 和 TX 队列的 ethernetX.maxTxQueues 数量(其中 X 是要配置的虚拟 NIC 的数量)。配置的最大队列数不得大于虚拟机中的 vCPU 数量。

    注意:

    增加队列数量还会增加 ESX 主机的处理器开销。因此,在增加队列之前,请确保 ESX 主机中有足够的 CPU 资源可用。在队列数量被确定为性能瓶颈的情况下,您可以增加支持的最大队列数。在这些情况下,我们建议逐渐增加队列数量。例如,从 8 到 12,然后是 16,然后是 20,依此类推。评估每种设置下的性能,而不是直接提高到最大限制。

具有 SR-IOV 和 PCI 直通网络接口的 NetScaler VPX

要通过 SR-IOV 和 PCI 直通网络接口实现 VPX 的高性能,请参阅 ESX 主机上的推荐配置

Linux-KVM 平台上的 NetScaler VPX 实例

本部分包含可配置选项和设置的详细信息,以及其他有助于您在 Linux-KVM 平台上实现 NetScaler VPX 实例的最佳性能的建议。

KVM 的性能设置

在 KVM 主机上执行以下设置:

使用以下 lstopo 命令查找网卡的 NUMA 域:

确保 VPX 和 CPU 的内存固定在同一位置。 在以下输出中,10G 网卡“ens2”与 NUMA 域 #1 关联。

NUMA 域名 #1

从 NUMA 域分配 VPX 内存。

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

NUMA 节点 #0

要更改 NUMA 节点映射,请执行以下步骤。

  1. 在主机上编辑 VPX 的 .xml。

    /etc/libvirt/qemu/<VPX_name>.xml
    <!--NeedCopy-->
    
  2. 添加以下标签:

    <numatune>
    <memory mode="strict" nodeset="1"/>    This is the NUMA domain name
    </numatune>
    <!--NeedCopy-->
    
  3. 关闭 VPX。

  4. 运行以下命令:

    virsh define /etc/libvirt/qemu/<VPX_name>.xml
    <!--NeedCopy-->
    

    此命令使用 NUMA 节点映射更新 VM 的配置信息。

  5. 打开 VPX 的电源。然后检查主机上的 numactl –hardware 命令输出以查看 VPX 的更新内存分配。

    numactl 硬件命令的输出

将 VPX 的 vCPU 固定到物理内核。

  • 要查看 VPX 的 vCPU 到 pCPU 的映射,请键入以下命令

     virsh vcpupin <VPX name>
     <!--NeedCopy-->
    

    virsh-vcpupin 命令的输出

    vCPU 0—4 映射到物理内核 8—11。

  • 要查看当前的 pCPU 使用情况,请键入以下命令:

     mpstat -P ALL 5
     <!--NeedCopy-->
    

    mpstat 命令的输出

    在此输出中,8 是管理 CPU,9—11 是数据包引擎。

  • 要将 vCPU 更改为 PCU 固定,有两个选项。

    • 使用以下命令在 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 文件:

      1. 在主机上编辑 VPX 的 .xml 文件

        /etc/libvirt/qemu/<VPX_name>.xml
        <!--NeedCopy-->
        
      2. 添加以下标签:

        <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-->
        
      3. 关闭 VPX。

      4. 使用以下命令使用 NUMA 节点映射更新 VM 的配置信息:

        virsh define /etc/libvirt/qemu/ <VPX_name>.xml
        <!--NeedCopy-->
        
      5. 打开 VPX 的电源。然后检查主机上的 virsh vcpupin <VPX name> 命令输出以查看更新的 CPU 固定。

消除主机中断开销。

  • 使用 kvm_stat 命令检测 VM_EXITS。

    在虚拟机管理程序级别,主机中断映射到固定 VPX vCPU 的相同 PCU。这可能会导致 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 映射到同一个 PCU,则其对应的计数器会增加。

    将与 NetScaler VPX 的 PCU 重叠的所有中断移动到未使用的 PCU 中:

     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)、SR-IOV 和 PCIe 直通网络接口配置为 每个 PNIC 部署两个 vNIC 。有关详细信息,请参阅 每个 pNIC 部署两个 vNIC

要获得 PV (virtio) 接口的最佳性能,请执行以下步骤:

  • 确定 PCIe 插槽/网卡所属的 NUMA 域。
  • VPX 的内存和 vCPU 必须固定到相同的 NUMA 域。
  • 虚拟主机线程必须绑定到同一 NUMA 域中的 CPU。

将虚拟主机线程绑定到相应的 CPU:

  1. 流量启动后,在主机上运行 top 命令。

    运行 top 命令

  2. 确定虚拟主机进程(命名为 vhost-<pid-of-qemu>)关联性。
  3. 使用以下命令将 vHost 进程绑定到之前确定的 NUMA 域中的物理核心:

    taskset –pc <core-id> <process-id>
    <!--NeedCopy-->
    

    示例:

    taskset –pc 12 29838
    <!--NeedCopy-->
    
  4. 可以使用以下命令识别与 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 进程绑定到相应的物理核心:

  1. 确定运行 QEMU 进程的物理核心。有关更多信息,请参阅前面的输出。
  2. 使用以下命令将 QEMU 进程绑定到与 vCPU 绑定到的相同物理核心:

    taskset –pc 8-11 29824
    <!--NeedCopy-->
    

配备 SR-IOV 和福特维尔 PCIe 直通网络接口的 NetScaler VPX

为了使 SR-IOV 和 Fortville PCIe 直通网络接口达到最佳性能,请执行以下步骤:

  • 确定 PCIe 插槽/网卡所属的 NUMA 域。
  • VPX 的内存和 vCPU 必须固定到同一个 NUMA 域。

适用于 vCPU 和 Linux KVM 的内存固定的示例 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-->

Citrix Hypervisor 上的 NetScaler VPX 实例

本部分包含可配置选项和设置的详细信息,以及可帮助您在 Citrix Hypervisor 上实现 NetScaler VPX 实例的最佳性能的其他建议。

Citrix 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 个以上的 vCPU。

要配置 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-->

具有 SR-IOV 网络接口的 NetScaler VPX

为了使 SR-IOV 网络接口获得最佳性能,请执行以下步骤:

  • 确定 PCIe 插槽或网卡所绑定的 NUMA 域。
  • 将 VPX 的内存和 vCPU 固定到同一个 NUMA 域。
  • 将域 0 vCPU 绑定到剩余的 CPU。

具有半虚拟化接口的 NetScaler VPX

为获得最佳性能,建议与其他半虚拟环境一样,每个 pNIC 配置两个 vNIC 和每个 pNIC 配置一个 vNIC。

要实现半虚拟化(netfront)接口的最佳性能,请执行以下步骤:

  • 确定 PCIe 插槽或 NIC 所属的 NUMA 域。
  • 将 VPX 的内存和 vCPU 固定到同一个 NUMA 域。
  • 将域 0 vCPU 绑定到同一 NUMA 域的剩余 CPU。
  • 将 vNIC 的主机 Rx/Tx 线程固定到域 0 vCPU。

将主机线程固定到 Domain-0 vCPU:

  1. 使用 Citrix Hypervisor 主机 shell 上的 xl list 命令查找 VPX 的 Xen-ID。
  2. 使用以下命令识别主机线程:

    ps -ax | grep vif <Xen-ID>
    <!--NeedCopy-->
    

    在以下示例中,这些值表示:

    • vif5.0 -在 XenCenter 中分配给 VPX 的第一个接口的线程(管理接口)。
    • vif5.1 -分配给 VPX 的第二个接口的线程等等。

    xl list 命令的输出

  3. 使用以下命令将线程固定到 Domain-0 vCPU:

    taskset –pc <core-id> <process-id>
    <!--NeedCopy-->
    

    示例:

    taskset -pc 1 29189
    <!--NeedCopy-->
    
在 VMware ESX、Linux KVM 和 Citrix Hypervisor 上优化 NetScaler VPX 性能