Citrix ADC

VMware ESX、Linux KVM、およびCitrix HypervisorでのCitrix ADC VPXのパフォーマンスを最適化

Citrix ADC VPXのパフォーマンスは、ハイパーバイザー、割り当てられたシステムリソース、およびホスト構成によって大きく異なります。望ましいパフォーマンスを達成するには、まずVPXデータシートの推奨事項に従ってから、このドキュメントに記載されているベストプラクティスを使用してさらに最適化します。

VMware ESXハイパーバイザー上のCitrix ADC VPXインスタンス

このセクションでは、構成可能なオプションと設定、およびVMware ESXハイパーバイザー上のCitrix ADC VPXインスタンスの最適なパフォーマンスを実現するのに役立つその他の推奨事項について説明します。

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-->
    

E1000ネットワークインターフェイスを備えたCitrix ADC VPX

VMware ESX ホストで次の設定を実行します。

  • VMware ESX ホストで、1 つの物理 vSwitch から 2 つの vNIC を作成します。複数の vNIC により、ESX ホストに複数の Rx スレッドが作成されます。これにより、物理 NIC インターフェイスの Rx スループットが向上します。
  • 作成した各 vNIC の 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)キューごとの Rx スレッドを使用します。次の ESX コマンドを使用します。

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

注:

VMware ESX ホストを再起動して、更新された設定を適用してください。

物理 NIC 展開ごとに 2 つの vNIC

次に、より優れたネットワークパフォーマンスを提供する展開の PNIC ごとに 2 つの vNIC モデルのトポロジおよび設定コマンドの例を示します。

物理 NIC 展開ごとに 2 つの vNIC

Citrix ADC VPX構成例:

前のサンプルトポロジに示した展開を実現するには、Citrix ADC 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-->
    

注:

ルートテーブルに次の 2 つのエントリが含まれていることを確認します。

  • 1.1.1.0/24 SNIP 1.1.1.2 を指すゲートウェイを持つサブネット
  • 2.2.2.0/24 SNIP 2.2.2.2 を指すゲートウェイを持つサブネット

VMXNET3ネットワークインターフェイスを備えたCitrix ADC VPX

VMXNET3 ネットワークインターフェイスを使用した VPX で高いパフォーマンスを実現するには、VMware ESX ホストで次の設定を行います。

  • 1 つの物理 vSwitch から 2 つの vNIC を作成します。複数の vNIC により、ESX ホストに複数の Rx スレッドが作成されます。これにより、物理 NIC インターフェイスの Rx スループットが向上します。
  • 作成した各 vNIC の 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 ホストで、1 つの物理 vSwitch から 2 つの vNIC を作成します。複数の vNIC により、ESX ホストに複数の Tx スレッドと Rx スレッドが作成されます。これにより、物理 NIC インターフェイスの Tx スループットと Rx スループットが向上します。
  • 作成した各 vNIC の vSwitch ポートグループレベルで VLAN を有効にします。
  • vNIC の Tx スループットを向上させるには、デバイス(NIC)キューごとの Tx 完了スレッドと受信スレッドを別々に使用します。次のコマンドを使用します:

     esxcli system settings advanced set -o /Net/NetNetqRxQueueFeatPairEnable -i 0
     <!--NeedCopy-->
    
  • 仮想マシンの構成に次の設定を追加して、vNIC ごとに 1 つの送信スレッドを使用するように仮想マシンを設定します。

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

詳細については、 vSphere の Telco および NFV ワークロードのパフォーマンスチューニングのベストプラクティスを参照してください

注:

VMware ESX ホストを再起動して、更新された設定を適用してください。

VMXNET3 は、物理 NIC 展開ごとに 2 つの vNIC として設定できます。詳細については、「物理 NIC 展開ごとに 2 つの vNIC」を参照してください。

SR-IOVおよびPCIパススルーネットワークインターフェイスを備えたCitrix ADC VPX

SR-IOVおよびPCIパススルーネットワークインターフェイスを備えたVPXで高いパフォーマンスを実現するには、「 ESXホストでの推奨構成」を参照してください。

Linux-KVMプラットフォーム上のCitrix ADC VPXインスタンス

このセクションでは、構成可能なオプションと設定、およびLinux-KVMプラットフォーム上のCitrix ADC VPXインスタンスの最適なパフォーマンスを達成するのに役立つその他の推奨事項について説明します。

KVM のパフォーマンス設定

KVM ホストで次の設定を行います。

lstopoコマンドを使用して、NIC の NUMA ドメインを検索します。

VPX と CPU のメモリが同じ場所に固定されていることを確認します。 次の出力では、10G NIC「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 を pCPU 固定に変更するには、2 つのオプションがあります。

    • 次のコマンドを使用して、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 の仮想 CPU が固定されているのと同じ pCPU にマッピングされます。これにより、VPX 上の vCPU が定期的に追い出される可能性があります。

    ホストを実行している仮想マシンによって実行された VM の終了を確認するには、kvm_statコマンドを使用します。

     [root@localhost ~]# kvm_stat -1  | grep EXTERNAL
     kvm_exit(EXTERNAL_INTERRUPT)  1728349 27738
     [root@localhost ~]#
     <!--NeedCopy-->
    

    1+M の順の値が大きいほど、問題があることを示します。

    単一の VM が存在する場合、期待値は 30 ~ 100 K です。これ以上の値は、同じ pCPU にマッピングされた 1 つ以上のホスト割り込みベクトルがあることを示している可能性があります。

  • ホスト割り込みを検出し、ホスト割り込みを移行します。

    「/proc/interrupts」 ファイルのconcatenateコマンドを実行すると、すべてのホスト割り込みマッピングが表示されます。1 つ以上のアクティブな IRQ が同じ pCPU にマップされている場合、対応するカウンタが増分します。

    Citrix ADC 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コマンドを実行して、カウンタの数が多くないことを確認します。

PVネットワークインターフェイスを備えたCitrix ADC VPX

準仮想化(PV)、SR-IOV、および PCIe パススルーネットワークインターフェイスは、物理 NIC ごとに 2 つの vNIC 展開として設定できます。詳細については、「物理 NIC 展開ごとに 2 つの vNIC」を参照してください。

PV (virtio) インターフェイスの最適なパフォーマンスを得るには、次の手順に従います。

  • PCIe スロット/NIC が関連付けられている NUMA ドメインを識別します。
  • VPX のメモリと vCPU は、同じ NUMA ドメインに固定する必要があります。
  • 仮想ホストスレッドは、同じ NUMA ドメイン内の CPU にバインドする必要があります。

仮想ホストスレッドを対応する CPU にバインドします。

  1. トラフィックが開始されたら、ホストでtopコマンドを実行します。

    top コマンドを実行する

  2. 仮想ホストプロセス (vhost-<pid-of-qemu>という名前 ) アフィニティを識別します。
  3. 次のコマンドを使用して、前に特定した NUMA ドメインの物理コアに vHost プロセスをバインドします。

    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. 次のコマンドを使用して、vCPU をバインドするのと同じ物理コアに QEMU プロセスをバインドします。

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

SR-IOVおよびフォートビルのPCIeパススルーネットワークインターフェイスを備えたCitrix ADC VPX

SR-IOV および Fortville PCIe パススルーネットワークインターフェイスのパフォーマンスを最適化するには、次の手順を実行します。

  • PCIe スロット/NIC が関連付けられている 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-->

Citrix Hypervisor上のCitrix ADC VPXインスタンス

このセクションでは、構成可能なオプションと設定、およびCitrix Hypervisors上のCitrix ADC VPXインスタンスの最適なパフォーマンスを達成するのに役立つその他の推奨事項について説明します。

Citrix Hypervisorのパフォーマンス設定

「xl」コマンドを使用して NIC の NUMA ドメインを見つけます。

xl info -n
<!--NeedCopy-->

VPX の vCPU を物理コアにピン留めします。

xl vcpu-pin <Netsclaer VM Name>  <vCPU id>  <physical CPU id>
<!--NeedCopy-->

vCPU のバインドをチェックします。

xl vcpu-list
<!--NeedCopy-->

8個を超える仮想CPUをCitrix ADC仮想マシンに割り当てます。

8個を超える仮想CPUを構成するには、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ネットワークインターフェイスを備えたCitrix ADC VPX

SR-IOV ネットワークインターフェイスの最適なパフォーマンスを得るには、次の手順を実行します。

  • PCIe スロットまたは NIC が接続されている NUMA ドメインを特定します。
  • VPX のメモリと vCPU を同じ NUMA ドメインに固定します。
  • ドメイン 0 vCPU を残りの CPU にバインドします。

準仮想化インターフェイスを備えたCitrix ADC VPX

最適なパフォーマンスを得るには、他の PV 環境と同様に、pNIC ごとに 2 つの vNIC、および pNIC 構成ごとに 1 つの vNIC を推奨します。

準仮想化 (netfront) インターフェイスの最適なパフォーマンスを実現するには、次の手順を実行します。

  • PCIe スロットまたは NIC が接続されている NUMA ドメインを特定します。
  • VPX のメモリと vCPU を同じ NUMA ドメインに固定します。
  • ドメイン 0 vCPU を同じ NUMA ドメインの残りの CPU にバインドします。
  • 仮想 NIC のホスト Rx/Tx スレッドをドメイン 0 vCPU に固定します。

ホストスレッドをドメイン 0 vCPU にピン留めします。

  1. Citrix Hypervisorホストシェルでxl listコマンドを使用して、VPXのXen-IDを検索します。
  2. 次のコマンドを使用して、ホストスレッドを識別します。

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

    次の例では、これらの値は次のことを示しています。

    • vif5.0 -XenCenter(管理インターフェイス)でVPXに割り当てられた最初のインターフェイスのスレッド。
    • vif5.1 -VPXなどに割り当てられた2番目のインターフェイスのスレッド。

    xl list コマンドの出力

  3. 次のコマンドを使用して、スレッドをドメイン 0 vCPU に固定します。

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

    例:

    taskset -pc 1 29189
    <!--NeedCopy-->
    
VMware ESX、Linux KVM、およびCitrix HypervisorでのCitrix ADC VPXのパフォーマンスを最適化