NetScaler VPX

VMware ESX、Linux KVM、およびシトリックス ハイパーバイザー上でのネットスケーラー VPX パフォーマンスの最適化

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

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

このセクションには、VMware ESXハイパーバイザー上のNetScaler VPXインスタンスの最適なパフォーマンスを達成するのに役立つ、設定可能なオプションと設定、およびその他の提案の詳細が含まれています。

ESXホスト上の推奨構成

E1000、VMXNET3、SR-IOV、およびPCIパススルーネットワークインターフェイスを使用したVPXで高いパフォーマンスを達成するには、以下の推奨事項に従ってください。

  • ESXホストにプロビジョニングされる仮想CPU (vCPU) の合計数は、ESXホスト上の物理CPU (pCPU) の合計数以下でなければなりません。
  • 良好な結果を達成するには、ESXホストにNon-uniform Memory Access (NUMA) アフィニティとCPUアフィニティを設定する必要があります。

    – VmnicのNUMAアフィニティを見つけるには、ホストにローカルまたはリモートでログインし、次のように入力します。

     #vsish -e get /net/pNics/vmnic7/properties | grep NUMA
     Device NUMA Node: 0
     <!--NeedCopy-->
    
    • VMのNUMAおよびvCPUアフィニティを設定するには、VMware documentationを参照してください。

E1000ネットワークインターフェイスを使用したNetScaler VPX

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

  • VMware ESXホスト上で、1つのpNIC vSwitchから2つのvNICを作成します。複数のvNICを作成すると、ESXホスト内に複数のRxスレッドが作成されます。これにより、pNICインターフェイスの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スループットをさらに向上させるには、デバイス(NIC)キューごとに個別のTx完了スレッドとRxスレッドを使用します。以下のESXコマンドを使用します。

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

注:

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

pNICあたり2つのvNIC展開

以下は、より優れたネットワークパフォーマンスを提供するpNICあたり2つのvNIC展開モデルのサンプル構成と設定コマンドです。

pNICあたり2つのvNIC展開(/ja-jp/vpx/media/two-vnics-per-pnic-deployment.png)

ネットスケーラー 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-->
    

注:

ルートテーブルに次の2つのエントリを含めるようにしてください。

  • 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 ホストで次の設定を行います。

  • 1つの pNIC vSwitch から2つの vNIC を作成します。複数の vNIC は ESX ホストで複数の Rx スレッドを作成します。これにより、pNIC インターフェースの 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つの pNIC vSwitch から2つの 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ごとに1つの送信スレッドを使用するように構成します。

     ethernetX.ctxPerDev = "1"
     <!--NeedCopy-->
    
  • VMの構成に次の設定を追加して、VMがvNICごとに最大8つの送信スレッドを使用するように構成します。

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

    注:

    vNICあたりの送信スレッド数を増やすと、ESXホストでより多くのCPUリソース(最大8つ)が必要になります。上記の設定を行う前に、十分なCPUリソースが利用可能であることを確認してください。

注:

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

VMXNET3をTwo vNICs per pNICデプロイメントとして構成できます。詳細については、「Two vNICs per pNIC deployment」を参照してください。

VMXNET3デバイスのVMware ESXでマルチキューおよび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はVMXNET3デバイスのESXで最大19のRxおよびTxキューをサポートします。

前提条件:

VMXNET3デバイスのESXで最大19のRxおよびTxキューを構成するには、次の前提条件が満たされていることを確認してください。

  • NetScaler VPX のバージョンは 13.1 ビルド 48.X 以降です。
  • NetScaler VPX は、VMware ESX 7.0 以降でサポートされているハードウェアバージョン 17 以降の仮想マシンで構成されています。

8 を超える Rx および Tx キューをサポートするように VMXNET3 インターフェイスを構成する:

  1. 仮想マシン構成ファイル (.vmx) を開きます。
  2. ethernetX.maxTxQueues および ethernetX.maxRxQueues の値を構成して、Rx および TX キューの数を指定します (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 コマンドを使用して NIC の NUMA ドメインを見つけます。

VPX のメモリと CPU が同じ場所にピン留めされていることを確認してください。 以下の出力では、10G NIC「ens2」が NUMA ドメイン #1 に関連付けられています。

NUMA ドメイン #1

NUMA ドメインから VPX メモリを割り当てます。

numactl コマンドは、メモリが割り当てられている NUMA ドメインを示します。以下の出力では、約 10 GB の RAM が NUMA ノード #0 から割り当てられています。

ニューマ ノード 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 hardware コマンドによって表示された出力

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のvCPUがピン留めされているのと同じpCPUにマッピングされます。これにより、VPX上のvCPUが定期的に強制終了される可能性があります。

    ホストを実行しているVMによって行われた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です。それ以上の場合、1つ以上のホスト割り込みベクトルが同じpCPUにマッピングされていることを示している可能性があります。

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

    “/proc/interrupts” ファイルに対して concatenate コマンドを実行すると、すべてのホスト割り込みマッピングが表示されます。1つ以上のアクティブな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 コマンドを実行してください。

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

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

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

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

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

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

    topコマンドを実行します(/ja-jp/vpx/media/run-top-command.png)

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

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

SR-IOVおよびFortville PCIeパススルーネットワークインターフェイスを備えたNetScaler 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 ハイパーバイザー上でのNetScaler VPXインスタンス

このセクションには、Citrix Hypervisor上でのNetScaler VPXインスタンスの最適なパフォーマンスを達成するのに役立つ、設定可能なオプションと設定、およびその他の提案の詳細が含まれています。

シトリックス ハイパーバイザーのパフォーマンス設定

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

NetScaler VMに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スロットまたはNICが関連付けられているNUMAドメインを特定します。
  • VPXのメモリとvCPUを同じNUMAドメインに固定します。
  • Domain-0 vCPUを残りのCPUにバインドします。

パラ仮想化インターフェースを備えたNetScaler VPX

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

パラ仮想化(netfront)インターフェースの最適なパフォーマンスを達成するには、次の手順に従ってください。

  • PCIeスロットまたはNICが関連付けられているNUMAドメインを特定します。
  • VPXのメモリとvCPUを同じNUMAドメインに固定します。
  • Domain-0 vCPUを同じNUMAドメインの残りのCPUにバインドします。
  • vNICのホストRx/TxスレッドをDomain-0 vCPUに固定します。

ホストスレッドをDomain-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 コマンドの出力(/ja-jp/vpx/media/xl-list-command.png)

  3. 以下のコマンドを使用して、スレッドをDomain-0 vCPUにピン留めします。

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

    例:

    taskset -pc 1 29189
    <!--NeedCopy-->
    
VMware ESX、Linux KVM、およびシトリックス ハイパーバイザー上でのネットスケーラー VPX パフォーマンスの最適化