2.5. 単純なコンピュートノードの CPU パーティショニングとメモリーチェック

前提条件

デプロイされたコンピュートノードでこのコマンドを実行し、CPU マスクが TripleO Heat Template 値にどのようにマップされるかに注意する。

$ sudo ovs-vsctl get Open_vSwitch . other_config

{dpdk-init="true", dpdk-lcore-mask="300003", dpdk-socket-mem="3072,1024", pmd-cpu-mask="c0000c"}

以下の点に注意してください。

2.5.1. CPU の検出

pid 1 の CPU を検出するには、次のコマンドを使用します。これらのコアでは、PMD または Nova vCPU を実行しないでください。

$ taskset -c -p 1

pid 1's current affinity list: 0,1,20,21

2.5.2. PMD スレッドの検出

PMD スレッドを表示するには、次のコマンドを使用します。出力には、Tripleo パラメーター OvsPmdCoreList の値が反映されている必要があります。Tripleo パラメーター OvsDpdkCoreList または HostIsolatedCoreslist の値と重複してはなりません。

$ ps -T -o spid,comm -p $(pidof ovs-vswitchd) |grep '\<pmd' |while read spid name; do echo $name $(taskset -p -c $spid); done

pmd44 pid 679318's current affinity list: 3
pmd45 pid 679319's current affinity list: 23
pmd46 pid 679320's current affinity list: 22
pmd47 pid 679321's current affinity list: 2

2.5.3. NUMA ノードの検出

最適なパフォーマンスを得るには、物理ネットワークアダプター、PMD スレッド、およびインスタンスの固定 CPU がすべて同じ NUMA ノード上にあることを確認してください。詳細は、CPU および NUMA ノード を参照してください。

以下は、NUMA 割り当てを調べるための簡単な演習です。

  1. コンピュートノード上のインスタンスの vhu ポートを調べます。

    $ sudo virsh domiflist 1
    
    Interface  Type       Source     Model       MAC
    -------------------------------------------------------
    vhu24e6c032-db vhostuser  -          virtio      fa:16:3e:e3:c4:c2
  2. そのポートにサービスを提供している PMD スレッドを調べて、NUMA ノードに注意してください。

    $ sudo ovs-appctl dpif-netdev/pmd-rxq-show
    
    pmd thread numa_id 0 core_id 2:
        isolated : false
        port: vhu24e6c032-db      queue-id:  0    pmd usage:  0 %
        port: vhu94ccc316-ea      queue-id:  0    pmd usage:  0 %
  3. インスタンスの物理的に固定された CPU を見つけます。たとえば、このインスタンスのポートにサービスを提供する PMD は CPU 2 にあり、インスタンスは CPU 34 および 6 によって提供されます。

    $ sudo virsh dumpxml 1 | grep cpuset
    
        <vcpupin 1 vcpu='0' cpuset='34'/>
        <emulatorpin cpuset='6'/>
  4. 各 NUMA ノードのコアを調べます。インスタンス (34,6) を提供する CPU は同じ NUMA ノード (0) 上にあることに注意してください。

    $ lscpu | grep ^NUMA
    
    NUMA node(s):          2
    NUMA node0 CPU(s):     0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38
    NUMA node1 CPU(s):     1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39

さらに、OVS DPDK によって管理されていないネットワークアダプターには、それらが属する NUMA ノードを示すエントリーがここにあります。

$ sudo cat /sys/class/net/<device name>/device/numa_node

または、OVS DPDK によって管理されている場合でも、PCI アドレスを照会することで、ネットワークアダプターの NUMA ノードを確認できます。

$ sudo lspci -v -s 05:00.1 | grep -i numa

Flags: bus master, fast devsel, latency 0, IRQ 203, NUMA node 0

これらの演習は、PMD、インスタンス、およびネットワークアダプターがすべて NUMA 0 上にあり、パフォーマンスに最適であることを示しています。openvswitch ログ (/var/log/openvswitch にあります) からのクロス NUMA ポーリングの兆候については、次のようなログエントリーを探してください。

dpif_netdev|WARN|There's no available (non-isolated) pmd thread on numa node 0. Queue 0 on port 'dpdk0' will be assigned to the pmd on core 7 (numa node 1). Expect reduced performance.

2.5.4. 分離された CPU の検出

次のコマンドを使用して、分離された CPU を表示します。出力は、TripleO パラメーター IsolCpusList の値と同じである必要があります。

$ cat /etc/tuned/cpu-partitioning-variables.conf | grep -v ^#

isolated_cores=2-19,22-39

2.5.5. Nova インスタンス専用の CPU の検出

次のコマンドを使用して、Nova インスタンス専用の CPU を表示します。この出力は、ポーリングモードドライバー (PMD) CPU を使用しないパラメーター isolcpus の値と同じである必要があります。

$ grep ^vcpu_pin_set /var/lib/config-data/puppet-generated/nova_libvirt/etc/nova/nova.conf

vcpu_pin_set=4-19,24-39

2.5.6. Huge Page 設定の確認

コンピュートノードで Huge Page の設定を確認してください。

[root@compute-0 ~]# cat /sys/devices/system/node/node*/meminfo  | grep -i huge
Node 0 AnonHugePages:      4096 kB
Node 0 HugePages_Total:    16
Node 0 HugePages_Free:     11
Node 0 HugePages_Surp:      0
Node 1 AnonHugePages:      8192 kB
Node 1 HugePages_Total:    16
Node 1 HugePages_Free:     15
Node 1 HugePages_Surp:      0

Huge Page が設定されていないか、使い果たされている場合は、KernelArgs を参照してください。