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"}
以下の点に注意してください。
-
dpdk-lcore-mask
は、TripleO Heat テンプレートのOvsDpdkCoreList
にマップされます。 -
dpdk-socket-mem
は、TripleO Heat テンプレートのOvsDpdkSocketMemory
にマップされます。 pmd-cpu-mask
は、TripleO Heat テンプレートのOvsPmdCoreList
にマップされます。これらの CPU マスクを、TripleO Heat テンプレートおよび実際のシステム値 に戻す 10 進数の値に変換するには、How to convert a hexadecimal CPU mask to a bit mask to a bit mask and identify the masked CPU mask? を参照してください。
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 割り当てを調べるための簡単な演習です。
コンピュートノード上のインスタンスの vhu ポートを調べます。
$ sudo virsh domiflist 1 Interface Type Source Model MAC ------------------------------------------------------- vhu24e6c032-db vhostuser - virtio fa:16:3e:e3:c4:c2
そのポートにサービスを提供している 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 %
インスタンスの物理的に固定された CPU を見つけます。たとえば、このインスタンスのポートにサービスを提供する PMD は CPU 2 にあり、インスタンスは CPU 34 および 6 によって提供されます。
$ sudo virsh dumpxml 1 | grep cpuset <vcpupin 1 vcpu='0' cpuset='34'/> <emulatorpin cpuset='6'/>
各 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 を参照してください。