OVS-DPDK エンドツーエンドトラブルシューティングガイド
トラブルシューティング手順を OVS-DPDK エンドに含むガイド
概要
前書き リンクのコピーリンクがクリップボードにコピーされました!
本書では、Red Hat OpenStack Platform 10 のパケットロスに関連する典型的な問題を特定および解決するための OVS-DPDK システム管理者向けの手順を説明します。このガイドに記載されている手順は、以前に公開されたナレッジベースの記事に優先します。
第1章 事前確認 リンクのコピーリンクがクリップボードにコピーされました!
このガイドは、次のドキュメントの計画とデプロイメントの手順に精通していることを前提としています。
第2章 OVS-DPDK デプロイメントの検証 リンクのコピーリンクがクリップボードにコピーされました!
この章では、デプロイメント後に実行する検証手順について説明します。
2.1. OpenStack の確認 リンクのコピーリンクがクリップボードにコピーされました!
次のコマンドを使用して、OpenStack および OVS-DPDK の設定を確認します。
2.1.1. ネットワークエージェントの表示 リンクのコピーリンクがクリップボードにコピーされました!
各エージェントの Alive の値が True で、State が UP であることを確認します。問題がある場合には、/var/log/neutron および /var/log/openvswitch/ovs-vswitchd.log のログを表示して、問題を確認します。
2.1.2. Compute Service でホストを表示する リンクのコピーリンクがクリップボードにコピーされました!
各ホストの Status の値が enabled になっていて、State が up になっていることを確認します。問題がある場合には、/var/log/nova のログを確認して問題を確認してください。
2.2. コンピュートノード OVS 設定の確認 リンクのコピーリンクがクリップボードにコピーされました!
ネットワークアダプターおよび OpenvSwitch の設定およびヘルスを確認するには、以下の手順を実施します。
コンピュートノード上で DPDK ネットワークデバイスを確認するには、dpdk ツールをインストールします。以下のコマンドを実行します。この rpm はリポジトリーにあります:
rhel-7-server-extras-rpms。yum install dpdk-tools
$ yum install dpdk-toolsCopy to Clipboard Copied! Toggle word wrap Toggle overflow DPDK によって管理されているネットワークデバイスとネットワークに使用されているデバイスを表示します。
dpdk-devbind --status
$ dpdk-devbind --statusCopy to Clipboard Copied! Toggle word wrap Toggle overflow DPDK ドライバーを使用するデバイスは、Tripleo コンピュートロールテンプレートのタイプ
ovs_dpdk_bondまたはovs_dpdk_portです。Copy to Clipboard Copied! Toggle word wrap Toggle overflow DPDK が有効であることを確認するには、以下のコマンドを実行します。
sudo ovs-vsctl get Open_vSwitch . iface_types
$ sudo ovs-vsctl get Open_vSwitch . iface_types [dpdk, dpdkr, dpdkvhostuser, dpdkvhostuserclient, geneve, gre, internal, lisp, patch, stt, system, tap, vxlan]Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを実行します。結果は、DPDK 互換ドライバーの PCI デバイス (たとえば、
0000:04:00.1および:05:00.0) をtype: dpdkとしてエラーなしで示しています。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次の出力はエラーを示しています。
Port "dpdkbond0" Interface "dpdk1" type: dpdk options: {dpdk-devargs="0000:04:00.1", n_rxq="2"} error: "Error attaching device '0000:04:00.1' to DPDK"Port "dpdkbond0" Interface "dpdk1" type: dpdk options: {dpdk-devargs="0000:04:00.1", n_rxq="2"} error: "Error attaching device '0000:04:00.1' to DPDK"Copy to Clipboard Copied! Toggle word wrap Toggle overflow インターフェイスの詳細を表示するには、次のコマンドを実行します。
sudo ovs-vsctl list interface dpdk1 | egrep "name|mtu|options|status"
$ sudo ovs-vsctl list interface dpdk1 | egrep "name|mtu|options|status"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを実行します。lacp が有効になっていないことに注意してください。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow コンピュートノードの ovs ブリッジがすべて、高速データパス(ユーザー空間)ネットワーク用に
netdevであることを確認します。注記システム (カーネル) と netdev (ユーザースペース) のデータパスタイプの混合はサポートされていません。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、永続的な Open vSwitch エラーを確認します。
grep ERROR /var/log/openvswitch/ovs-vswitchd.log
$ grep ERROR /var/log/openvswitch/ovs-vswitchd.logCopy to Clipboard Copied! Toggle word wrap Toggle overflow
2.3. インスタンス設定の OVS の確認 リンクのコピーリンクがクリップボードにコピーされました!
vhostuser DMA が確実に機能するようにするには、OVS-DPDK ポートを使用してインスタンスを設定し、フレーバーを使用して専用の CPU と Huge Page を有効にします。詳しくは、『オーバークラウド の高度なカスタマイズ』の「ステップ 3」および「OVS-DPDK 用インスタンスのデプロイ 」を参照してください。
インスタンス設定を確認するには、次の手順を実行します。
インスタンスが CPU を固定していることを確認します。専用の CPU は、virsh を使用して特定できます。
sudo virsh vcpupin 2
$ sudo virsh vcpupin 2Copy to Clipboard Copied! Toggle word wrap Toggle overflow インスタンスに使用されているエミュレータースレッドが、そのインスタンスに割り当てられている同じ vCPU で実行されていないことを確認します。
sudo virsh emulatorpin 2
$ sudo virsh emulatorpin 2Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記Red Hat OpenStack Platform 12 以降、フレーバーでエミュレーターピンを設定することができます。Configuring emulator threads policy with Red Hat OpenStack Platform 12 を参照してください。
以前のバージョンでは、インスタンスの電源をオンにする際に、エミュレータースレッドピニングを手動で行う必要があります。About the impact of using virsh emulatorpin in virtual environments with NFV, with and without isolcpus, and about optimal emulator thread pinning を参照してください。
インスタンスが Huge Page を使用していることを確認します。これは、最適なパフォーマンスに必要です。
sudo virsh numatune 1
$ sudo virsh numatune 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow インスタンスの受信キューがポーリングモードドライバー (PMD) によって処理されていることを確認します。
ポートとキューは、PMD 間で均等にバランスを取る必要があります。最適なのは、ネットワークアダプターと同じ NUMA ノードにある CPU がポートをサービスすることです。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow PMD の統計を表示します。これは、受信キューが PMD 間でどの程度バランスが取れているかを判断するのに役立ちます。詳細については、Open vSwitch のドキュメントの PMD Threads を参照してください。
注記pmd-rxq-rebalanceオプションが OVS 2.9.0 で追加されました。このコマンドは、最新の rxq 処理サイクル情報に基づいて PMD 間で均等にバランスを取るために、新しい PMD キュー割り当てを実行します。pmd-stats-showコマンドは、PMD が実行されてから、または統計が最後にクリアされてからの完全な履歴を表示します。クリアされていない場合は、ポートが設定されてデータが流れる前に統計に組み込まれます。データパス (通常はそうです) の負荷を確認するために使用されている場合は、役に立ちません。システムを定常状態にし、統計をクリアし、数秒待ってから統計を表示するのが最善です。これにより、データパスの正確なイメージが提供されます。
次のコマンドを使用して、PMD の統計を表示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow PMD 統計をリセットします。
pmd-stats-showコマンドは、最後のpmd-stats-clearコマンド以降の PMD 統計を表示します。以前に発行されたpmd-stats-clearがなかった場合は、PMD の実行が開始されてからのデータが含まれています。負荷がかかっているシステムを調べている場合は、PMD 統計をクリアしてから、それらを表示すると便利です。そうでない場合には、(トラフィックの流れる前)システムがロードしていないとき、統計には以前の時間からのデータが含まれる可能性があります。
次のコマンドを使用して、PMD 統計をリセットします。
sudo ovs-appctl dpif-netdev/pmd-stats-clear
$ sudo ovs-appctl dpif-netdev/pmd-stats-clearCopy to Clipboard Copied! Toggle word wrap Toggle overflow
2.4. その他の役立つコマンド リンクのコピーリンクがクリップボードにコピーされました!
これらのコマンドを使用して、追加の検証チェックを実行します。
os-net-config によって設定された OVS-DPDK ポートと物理 NIC マッピングを検索します
cat /var/lib/os-net-config/dpdk_mapping.yaml
cat /var/lib/os-net-config/dpdk_mapping.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Nova インスタンス $ID を持つインスタンスの DPDK ポートを検索します
sudo ovs-vsctl find interface external_ids:vm-uuid="$ID" | grep ^name
sudo ovs-vsctl find interface external_ids:vm-uuid="$ID" | grep ^nameCopy to Clipboard Copied! Toggle word wrap Toggle overflow DPDK ポートを使用してインスタンスの Nova ID を検索します
sudo ovs-vsctl get interface vhu24e6c032-db external_ids:vm-uuid
sudo ovs-vsctl get interface vhu24e6c032-db external_ids:vm-uuidCopy to Clipboard Copied! Toggle word wrap Toggle overflow dpdk ポートで tcpdump を実行します
sudo ovs-tcpdump -i vhu94ccc316-ea
sudo ovs-tcpdump -i vhu94ccc316-eaCopy to Clipboard Copied! Toggle word wrap Toggle overflow
ovs-tcpdump は、rhel-7-server-openstack-10-devtools-rpms リポジトリーにある openvswitch- test RPM からのものです。
パフォーマンス上の懸念から、実稼働環境では ovs-tcpdump は推奨されません。詳細は、「 How to use ovs-tcpdump on vhost-user interfaces in Red Hat OpenStack Platform? 」を参照してください。
2.5. 単純なコンピュートノードの CPU パーティショニングとメモリーチェック リンクのコピーリンクがクリップボードにコピーされました!
前提条件
デプロイされたコンピュートノードでこのコマンドを実行し、CPU マスクが TripleO Heat Template 値にどのようにマップされるかに注意する。
sudo ovs-vsctl get Open_vSwitch . other_config
$ 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 テンプレートのHostCpusListにマッピングします。 -
DPDK-socket-memは、TripleO Heat テンプレートのNeutronDpdkSocketMemoryにマッピングします。 PMD-cpu-maskは、TripleO Heat テンプレートのNeutronDpdkCoreListにマッピングされます。これらの CPU マスクを 10 進数の値 に変換して、TripleO Heat テンプレートと実際のシステム値に戻すには、「16 進数の CPU マスクをビットマスクに変換し、マスクされた CPU を特定する方法」を参照してください。
2.5.1. CPU の検出 リンクのコピーリンクがクリップボードにコピーされました!
pid 1 の CPU を検出するには、次のコマンドを使用します。これらのコアでは、PMD または Nova vCPU を実行しないでください。
taskset -c -p 1
$ taskset -c -p 1
pid 1's current affinity list: 0,1,20,21
2.5.2. PMD スレッドの検出 リンクのコピーリンクがクリップボードにコピーされました!
PMD スレッドを表示するには、次のコマンドを使用します。出力には、Tripleo パラメーター NeutronDpdkCoreList の値が反映されているはずです。Tripleo パラメーター HostCpusList または HostIsolatedCoreslist の値は重複しないようにする必要があります。
2.5.3. NUMA ノードの検出 リンクのコピーリンクがクリップボードにコピーされました!
最適なパフォーマンスを得るには、物理ネットワークアダプター、PMD スレッド、およびインスタンスの固定 CPU がすべて同じ NUMA ノード上にあることを確認してください。詳しくは、「 CPUs and NUMA nodes 」を参照してください。
以下は、NUMA 割り当てを調べるための簡単な演習です。
コンピュートノード上のインスタンスの vhu ポートを調べます。
sudo virsh domiflist 1
$ sudo virsh domiflist 1 Interface Type Source Model MAC ------------------------------------------------------- vhu24e6c032-db vhostuser - virtio fa:16:3e:e3:c4:c2Copy to Clipboard Copied! Toggle word wrap Toggle overflow そのポートにサービスを提供している PMD スレッドを調べて、NUMA ノードに注意してください。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow インスタンスの物理的に固定された CPU を見つけます。たとえば、このインスタンスのポートにサービスを提供する PMD は CPU 2 にあり、インスタンスは CPU 34 および 6 によって提供されます。
sudo virsh dumpxml 1 | grep cpuset
$ sudo virsh dumpxml 1 | grep cpuset <vcpupin 1 vcpu='0' cpuset='34'/> <emulatorpin cpuset='6'/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 各 NUMA ノードのコアを調べます。インスタンス (34,6) を提供する CPU は同じ NUMA ノード (0) 上にあることに注意してください。
lscpu | grep ^NUMA
$ 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,39Copy to Clipboard Copied! Toggle word wrap Toggle overflow
さらに、OVS DPDK によって管理されていないネットワークアダプターには、それらが属する NUMA ノードを示すエントリーがここにあります。
sudo cat /sys/class/net/<device name>/device/numa_node
$ sudo cat /sys/class/net/<device name>/device/numa_node
または、OVS DPDK によって管理されている場合でも、PCI アドレスを照会することで、ネットワークアダプターの NUMA ノードを確認できます。
sudo lspci -v -s 05:00.1 | grep -i 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.
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 パラメーター HostIsolatedCoreList の値と同じである必要があります。
cat /etc/tuned/cpu-partitioning-variables.conf | grep -v ^# isolated_cores=2-19,22-39
$ 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 /etc/nova/nova.conf
$ grep ^vcpu_pin_set /etc/nova/nova.conf
vcpu_pin_set=4-19,24-39
2.5.6. Huge Page 設定の確認 リンクのコピーリンクがクリップボードにコピーされました!
コンピュートノードで Huge Page の設定を確認してください。
hugepages が設定されていないか、または使い切られる場合は、「 ComputeKernelArgs 」を参照してください。
2.6. パケットドロップの原因 リンクのコピーリンクがクリップボードにコピーされました!
キューがいっぱいになると、通常はキューが十分に速く排出されないときに、パケットがドロップされます。ボトルネックは、キューが十分に速く排出されていないときにキューを排出することになっているエンティティーです。ほとんどの場合、ドロップカウンターは、ドロップされたパケットを追跡するために使用されます。ハードウェアまたはソフトウェアの設計にバグがあると、パケットがドロップカウンターをスキップすることがあります。
データプラン開発キット (DPDK) には、パケットを転送するための testpmd アプリケーションが含まれています。本章のシナリオでは、testpmd が仮想マシンにインストールされ、論理コア(lcore)を持つポートをポーリングして、あるポートから別のポートにパケットを転送します。testpmd は、テストするトラフィックジェネレーターと使用します。この場合は、物理仮想物理(PVP)パス間のスループットをテストします。
2.6.1. OVS-DPDK が遅すぎて物理 NIC をドレインできない リンクのコピーリンクがクリップボードにコピーされました!
この例は、PMD スレッドが物理ネットワークアダプター (dpdk0) の受信 (RX) キューのポーリングを担当していることを示しています。PMD スレッドがパケット量に追いつかない場合、または中断された場合、パケットがドロップされる可能性があります。
図2.1 物理アダプター RX キューのポーリング
次のコマンドは、dpdk0 インターフェイスからの統計を表示します。ovs-dpdk が物理アダプターを十分な速度で排出していないためにパケットがドロップされている場合は、rx_dropped の値が急速に増加していることがわかります。
PMD の NUMA ノードごとに物理 CPU コアは 1 つだけにする必要があります。
2.6.2. VM が遅すぎて vhost-user をドレインできない リンクのコピーリンクがクリップボードにコピーされました!
この例は、図 2.1 の例と似ており、インスタンス受信 (RX) キューに送信されたパケットボリュームによって lcore スレッドが圧倒されると、パケット損失が発生する可能性があります。
詳細については、次の記事を参照してください。
図2.2 仮想アダプター RX キューのポーリング
ホストの tx_dropped 値が VM の rx_dropped 値に対応するかどうかを確認するには、次のコマンドを実行します。
ovs-vsctl --column statistics list interface vhud8ada965-ce
statistics : {"rx_1024_to_1522_packets"=0, "rx_128_to_255_packets"=0, "rx_1523_to_max_packets"=0,
"rx_1_to_64_packets"=0, "rx_256_to_511_packets"=0, "rx_512_to_1023_packets"=0, "rx_65_to_127_packets"=0, rx_bytes=0,
rx_dropped=0, rx_errors=0, rx_packets=0, tx_bytes=0, tx_dropped=0, tx_packets=0}
ovs-vsctl --column statistics list interface vhud8ada965-ce
statistics : {"rx_1024_to_1522_packets"=0, "rx_128_to_255_packets"=0, "rx_1523_to_max_packets"=0,
"rx_1_to_64_packets"=0, "rx_256_to_511_packets"=0, "rx_512_to_1023_packets"=0, "rx_65_to_127_packets"=0, rx_bytes=0,
rx_dropped=0, rx_errors=0, rx_packets=0, tx_bytes=0, tx_dropped=0, tx_packets=0}
2.6.3. OVS-DPDK が遅すぎて vhost-user をドレインできない リンクのコピーリンクがクリップボードにコピーされました!
この例では、PMD スレッドは、ホストの観点から受信キューである virtio TX をポーリングします。PMD スレッドがパケット量に圧倒されたり、中断されたりすると、パケットがドロップする可能性があります。
図2.3 仮想アダプターの TX キューのポーリング
VM からのパケットのリターンパスをトレースし、ホスト (tx_dropped) 側と VM(rx_dropped) 側の両方のドロップカウンターからの値を提供し、次のコマンドを実行します。
ovs-vsctl --column statistics list interface vhue5146cdf-aa
statistics : {"rx_1024_to_1522_packets"=0, "rx_128_to_255_packets"=0, "rx_1523_to_max_packets"=0,
"rx_1_to_64_packets"=0, "rx_256_to_511_packets"=0, "rx_512_to_1023_packets"=0, "rx_65_to_127_packets"=0,
rx_bytes=0, rx_dropped=0, rx_errors=0, rx_packets=0, tx_bytes=0, tx_dropped=0, tx_packets=0}
ovs-vsctl --column statistics list interface vhue5146cdf-aa
statistics : {"rx_1024_to_1522_packets"=0, "rx_128_to_255_packets"=0, "rx_1523_to_max_packets"=0,
"rx_1_to_64_packets"=0, "rx_256_to_511_packets"=0, "rx_512_to_1023_packets"=0, "rx_65_to_127_packets"=0,
rx_bytes=0, rx_dropped=0, rx_errors=0, rx_packets=0, tx_bytes=0, tx_dropped=0, tx_packets=0}
2.6.4. 出力物理インターフェイスでのパケット損失 リンクのコピーリンクがクリップボードにコピーされました!
PCIe と RAM の間の転送速度が遅いと、物理アダプターが TX キューからパケットをドロップする可能性があります。これはまれですが、この問題を特定して解決する方法を知ることが重要です。
図2.4 物理アダプター TX キューのポーリング
次のコマンドは、dpdk1 インターフェイスからの統計を表示します。tx_dropped がゼロより大きく、急速に増加している場合は、Red Hat でサポートケースを開きます。
これらのタイプのパケット損失が発生した場合は、メモリーチャネルの再設定を検討してください。
- メモリーチャネルを計算するには、『 Network Functions Virtualization Planning and Conifguration Guide 』の「 Memory parameters 」を参照してください。
- メモリーチャネルの数を確認するには、「 How to determine the memory channel for NeutronDpdkMemoryChannels or OvsDpdkMemoryChannels in Red Hat OpenStack Platform 」を参照してください。
第3章 NFV コマンドのチートシート リンクのコピーリンクがクリップボードにコピーされました!
本章では、Red Hat OpenStack Platform 10 のシステム可観測性で最も一般的に使用されるコマンドの多くについて説明します。
以下のコマンドの一部は、デフォルトでは使用できない場合があります。特定のノードに必要なツールをインストールするには、次のコマンドを実行します。
sudo yum install tuna qemu-kvm-tools perf kernel-tools dmidecode
3.1. UNIX ソケット リンクのコピーリンクがクリップボードにコピーされました!
これらのコマンドを使用して、プロセスポートと UNIX ソケットドメインを表示します。
| アクション | コマンド |
|---|---|
| ホスト名ルックアップなしで、すべての状態 (LISTEN、ESTABLISHED、CLOSE_WAIT など) のすべての TCP および UDP SOCKETS を表示します | # lsof -ni |
| ホスト名ルックアップなしで、すべての状態 (LISTEN、ESTABLISHED、CLOSE_WAIT など) のすべての TCP ソケットを表示します | # lsof -nit |
| ホスト名ルックアップなしで、すべての状態 (LISTEN、ESTABLISHED、CLOSE_WAIT など) のすべての UDP SOCKETS を表示します | # lsof -niu |
| IPv4 のホスト名ルックアップなしで、すべての状態 (LISTEN、ESTABLISHED、CLOSE_WAIT など) のすべての TCP および UDP SOCKETS を表示します | # lsof -ni4 |
| IPv6 のホスト名ルックアップなしで、すべての状態 (LISTEN、ESTABLISHED、CLOSE_WAIT など) のすべての TCP および UDP SOCKETS を表示します | # lsof -ni6 |
| 特定のポートのホスト名ルックアップなしで、関連するすべてのソケット (LISTEN、ESTABLISHED、CLOSE_WAIT など) を表示します | # lsof -ni :4789 |
| ホスト名ルックアップなしで LISTEN 状態のすべての SOCKETS を表示します | # ss -ln |
| IPv4 のホスト名ルックアップなしで LISTEN 状態のすべてのソケットを表示します | # ss -ln4 |
| IPv6 のホスト名ルックアップなしで LISTEN 状態のすべての SOCKETS を表示する | # ss -ln6 |
3.2. IP リンクのコピーリンクがクリップボードにコピーされました!
これらのコマンドを使用して、IP L2 および L3 設定、ドライバー、PCI バス、およびネットワーク統計を表示します。
| アクション | コマンド |
|---|---|
| すべての L2 (物理および仮想の両方) インターフェイスとその統計を表示します | # ip -s link show |
| すべての L3 インターフェイスとその統計を表示します | # ip -s addr show |
| デフォルト (メイン) の IP ルーティングテーブルを表示します | # ip route show |
| 特定のルーティングテーブルのルーティングルールを表示します | # ip route show table external |
| すべてのルーティングテーブルを表示します | # ip rule show |
| 特定の宛先のルーティングルールを表示します | # ip route get 1.1.1.1 |
| すべての Linux 名前空間を表示します | # ip netns show |
| Linux namespace にログインします | # ip netns exec ns0 bash |
| 特定のインターフェイスの詳細なネットワークインターフェイスカウンターを表示します | # tail /sys/class/net/ens6/statistics/* |
| 特定の結合デバイスの詳細な結合情報を表示します | # cat /proc/net/bonding/bond1 |
| グローバルネットワークインターフェイスのカウンタービューを表示します | # cat /proc/net/dev |
| 特定のネットワークインターフェイスでサポートおよび接続されている物理接続タイプ (TP、FIBER など)、リンク速度モードを表示します | # ethtool ens6 |
| 特定のネットワークインターフェイスの Linux ドライバー、ドライバーバージョン、ファームウェア、および PCIe BUS ID を表示します | # ethtool -i ens6 |
| 特定のネットワークインターフェイスのデフォルト、有効、および無効のハードウェアオフロードを表示します | # ethtool -k ens6 |
| 特定のネットワークインターフェイスの MQ (マルチキュー) 設定を表示します | # ethtool -l ens6 |
| 特定のネットワークインターフェイスの RX と TX の両方の MQ セットアップを変更します | # ethtool -L ens6 combined 8 |
| 特定のネットワークインターフェイスの TX に対してのみ MQ 設定を変更します | # ethtool -L ens6 tx 8 |
| 特定のネットワークインターフェイスのキューサイズを表示します | # ethtool -g ens6 |
| 特定のネットワークインターフェイスの RX キューサイズを変更します | # ethtool -G ens6 rx 4096 |
| 拡張ネットワーク統計を表示します | # cat /proc/net/softnet_stat |
| 重要なネットワークデバイス情報 (インターフェイス名、MAC、NUMA、PCIe スロット、ファームウェア、カーネルドライバー) をすばやく表示します | # biosdevname -d |
| カーネルの内部ドロップカウンターを表示します。詳細は、「 ネットワークデータ処理の監視 」を参照してください。 | # cat /proc/net/softnet_stat |
3.3. OVS リンクのコピーリンクがクリップボードにコピーされました!
これらのコマンドを使用して、Open vSwitch 関連の情報を表示します。
| アクション | コマンド |
|---|---|
| OVS DPDK の人間が読める形式の統計 | Open vSwitch DPDK 統計 を参照してください。 |
| OVS の基本情報を表示します (バージョン、dpdk 有効化、PMD コア、lcore、ODL ブリッジマッピング、バランシング、自動バランシングなど) | # ovs-vsctl list Open_vSwitch |
| OVS グローバルスイッチングビューを表示します | # ovs-vsctl show |
| OVS にすべての詳細なインターフェイスを表示します | # ovs-vsctl list interface |
| 1 つのインターフェイスの OVS 詳細 (リンク速度、MAC、ステータス、統計など) を表示します | # ovs-vsctl list interface dpdk0 |
| 特定のインターフェイスの OVS カウンターを表示します | # ovs-vsctl get interface dpdk0 statistics |
| OVS にすべての詳細なポートを表示します | # ovs-vsctl list port |
| 1 つのポートの OVS の詳細を表示します (リンク速度、MAC、ステータス、統計など) | # ovs-vsctl list port vhu3gf0442-00 |
| 1 つのブリッジの OVS 詳細を表示します (データパスタイプ、マルチキャストスヌーピング、stp ステータスなど) | # ovs-vsctl list bridge br-int |
| OVS ログステータスを表示します | # ovs-appctl vlog/list |
| すべての OVS ログをデバッグに変更します | # ovs-appctl vlog/set dbg |
| 1 つの特定の OVS サブシステムを、ファイルログ出力のデバッグモードに変更します | # ovs-appctl vlog/set file:backtrace:dbg |
| すべての OVS ログを無効にします | # ovs-appctl vlog/set off |
| すべての OVS サブシステムを、ファイルログ出力のみをデバッグするように変更します | # ovs-appctl vlog/set file:dbg |
| すべての OVS 拡張コマンドを表示します | # ovs-appctl list-commands |
| すべての OVS ボンディングを表示します | # ovs-appctl bond/list |
| 特定の OVS ボンディングに関する詳細を表示します (ステータス、ボンディングモード、転送モード、LACP ステータス、ボンディングメンバー、ボンディングメンバーステータス、リンクステータス) | # ovs-appctl bond/show bond1 |
| メンバー、ボンディング、パートナースイッチの高度な LACP 情報を表示します | # ovs-appctl lacp/show |
| OVS インターフェイスカウンターを表示します | # ovs-appctl dpctl/show -s |
| 反復間の違いを強調する OVS インターフェイスカウンターを表示します | # watch -d -n1 "ovs-appctl dpctl/show -s|grep -A4 -E '(dpdk|dpdkvhostuser)'|grep -v '\-\-'" |
| 特定のポートの OVSmempool 情報を表示します | # ovs-appctl netdev-dpdk/get-mempool-info dpdk0 |
| PMD パフォーマンス統計を表示します | # ovs-appctl dpif-netdev/pmd-stats-show |
| 一貫した方法で PMD パフォーマンス統計を表示します | # ovs-appctl dpif-netdev/pmd-stats-clear && sleep 60s && ovs-appctl dpif-netdev/pmd-stats-show |
| 人間が読める形式の DPDK インターフェイス統計を表示します | # ovs-vsctl get interface dpdk0 statistics|sed -e "s/,/\n/g" -e "s/[\",\{,\}, ]//g" -e "s/=/ =⇒ /g" |
| ポート/キューと PMD スレッド間の OVS マッピングを表示します | # ovs-appctl dpif-netdev/pmd-rxq-show |
| OVS PMD リバランスをトリガーします (PMD サイクルの使用率に基づく) | # ovs-appctl dpif-netdev/pmd-rxq-rebalance |
| OVS ポートと特定の PMD の間にアフィニティーを作成します (PMD をバランシングから無効にします) | # ovs-vsctl set interface dpdk other_config:pmd-rxq-affinity="0:2,1:4" |
| (OVS 2.11+ および FDP18.09) サイクルに基づいて PMD バランシングを設定します | # ovs-vsctl set Open_vSwitch . other_config:pmd-rxq-assign=cycles |
| (OVS 2.11+ および FDP18.09) ラウンドロビンで PMD バランシングを設定します | # ovs-vsctl set Open_vSwitch . other_config:pmd-rxq-assign=roundrobin |
| OVS-DPDK 物理ポートキューの数を設定します | # ovs-vsctl set interface dpdk options:n_rxq=2 |
| OVS-DPDK 物理ポートのキューサイズの数を設定します | # ovs-vsctl set Interface dpdk0 options:n_rxq_desc=4096 # ovs-vsctl set Interface dpdk0 options:n_txq_desc=4096 |
| OVS MAC アドレステーブルを表示します (action=normal に使用) | # ovs-appctl fdb/show br-provider |
| OVS vSwitch MAC アドレステーブルのエージングタイムを設定します (デフォルトは 300 秒) | # ovs-vsctl set bridge br-provider other_config:mac-aging-time=900 |
| OVS vSwitch MAC アドレステーブルサイズの設定します (デフォルトは 2048 秒) | # ovs-vsctl set bridge br-provider other_config:mac-table-size=204800 |
| OVS データパスフロー (カーネルスペース) を表示します | # ovs-dpctl dump-flows -m |
| OVS データパスフローを表示します (dpdk) | # ovs-appctl dpif/dump-flows -m br-provider |
| データパスフローのポート番号とポート名の間のマッピングを表示します | # ovs-dpctl show |
| 特定のブリッジで OVSOpenFlow ルールを表示します | # ovs-ofctl dump-flows br-provider |
| OpenFlow フローのポート番号とポート名の間のマッピングを表示します | # ovs-ofctl show br-provider |
| (OVS 2.11+) - 自動リバランスを有効にします | # ovs-vsctl set Open_vSwitch . other_config:pmd-auto-lb="true" |
| (OVS 2.11+) - 自動リバランス間隔を別の値に変更します (デフォルトは 1 分) | # ovs-vsctl set Open_vSwitch . other_config:pmd-auto-lb-rebalance-intvl="5" |
| 詳細な OVS 内部設定 | # man ovs-vswitchd.conf.db |
| OVStcpdump をダウンロードするには | # curl -O -L ovs-tcpdump.in |
| DPDK インターフェイスからパケットキャプチャを実行するには | # ovs-tcpdump.py --db-sock unix:/var/run/openvswitch/db.sock -i <bond/vhu> <tcpdump standard arguments such as -v -nn -e -w <path/to/file>> |
| (OVS 2.10+) 詳細な PMD パフォーマンス統計 | # ovs-appctl dpif-netdev/pmd-perf-show |
3.4. IRQ リンクのコピーリンクがクリップボードにコピーされました!
これらのコマンドを使用して、割り込み要求ライン (IRQ) ソフトウェアおよびハードウェア割り込みを表示します。
| アクション | コマンド |
|---|---|
| ksoftirqd ワーカーによって実行された CPU ごとの SoftIRQ バランシングを表示します | # cat /proc/softirqs | less -S |
| ksoftirqd ワーカーによって毎秒実行される CPU ごとの SoftIRQ バランシングを表示します | # watch -n1 -d -t "cat /proc/softirqs" |
| CPU ごとのハードウェアおよびソフトウェア割り込み (NMI、LOC、TLB、RSE、PIN、NPI、PIW) のバランシングを表示します | # cat /proc/interrupts | less -S |
| 1 秒ごとに CPU ごとにバランスをとるハードウェアおよびソフトウェア割り込み (NMI、LOC、TLB、RSE、PIN、NPI、PIW) を表示します | # watch -n1 -d -t "cat /proc/interrupts" |
| タイマー割り込みを表示します | # cat /proc/interrupts | grep -E "LOC|CPU" | less -S |
| タイマー割り込みを毎秒表示します | # watch -n1 -d -t "cat /proc/interrupts | grep -E 'LOC|CPU'" |
| デフォルトの IRQ CPU アフィニティーを表示します | # cat /proc/irq/default_smp_affinity |
| 特定の IRQ に対する IRQ アフィニティーを表示します (CPUMask) | # cat /proc/irq/89/smp_affinity |
| 特定の IRQ (DEC) に対する IRQ アフィニティーを表示します | # cat /proc/irq/89/smp_affinity_list |
| 特定の IRQ の IRQ アフィニティーを設定します (CPUMask) | # echo -n 1000 > /proc/irq/89/smp_affinity |
| 特定の IRQ(DEC) の IRQ アフィニティーを設定します | # echo -n 12 > /proc/irq/89/smp_affinity_list |
| ハードウェア割り込みの CPU アフィニティーを表示します | # tuna --show_irqs |
| 特定の IRQ の IRQ アフィニティーを設定します (DEC のサポート範囲たとえば 0-4 は 0 から 4 を意味します) | # tuna --irqs=<IRQ> --cpus=<CPU> --move |
| IRQ CPU 使用率分布を表示します | # mpstat -I CPU | less -S |
| 特定の CPU の IRQ CPU 使用率分布を表示します | # mpstat -I CPU -P 4 | less -S |
| SoftIRQCPU 使用率分布を表示します | # mpstat -I SCPU | less -S |
| 特定の CPU の SoftIRQ CPU 使用率分布を表示します | # mpstat -I SCPU -P 4 | less -S |
3.5. プロセス リンクのコピーリンクがクリップボードにコピーされました!
これらのコマンドを使用して、Linux、プロセススケジューラー、および CPU アフィニティーのプロセスとスレッドを表示します。
| アクション | コマンド |
|---|---|
| 特定のプロセス名の分布について、すべてのプロセススレッドを含む CPU 使用率と CPU アフィニティーを表示します | # pidstat -p $(pidof qemu-kvm) -t |
| 特定のプロセス名の分布について、すべてのプロセススレッドを含む CPU 使用率と CPU アフィニティーを、30 回の反復で 10 秒ごとに表示します | # pidstat -p $(pidof qemu-kvm) -t 10 30 |
| 特定のプロセス名のページフォールトと、すべてのプロセススレッドを含むメモリー使用率を表示します | # pidstat -p $(pidof qemu-kvm) -t -r |
| すべてのプロセススレッドを含む、特定のプロセス名の I/O 統計を表示します | # pidstat -p $(pidof qemu-kvm) -t -d |
| 特定のプロセス名について、その PID、プロセス名を含むすべての子 PID、および CPU 時間を表示します | # ps -T -C qemu-kvm |
| 特定のプロセスとすべての子 PID のリアルタイムパフォーマンス統計を表示します | # top -H -p $(pidof qemu-kvm) |
| プロセススケジューラーのタイプ、優先度、コマンド、CPU アフィニティー、およびコンテキストスイッチング情報を含むすべてのシステムスレッドを表示します | # tuna --show_threads |
| 優先度が最も高い特定の PID Real Time (FIFO) スケジューリングに設定します | # tuna --threads=<PID> --priority=FIFO:99 |
| PMD および CPU スレッドの再スケジュールアクティビティーを表示します | # watch -n1 -d "grep -E 'pmd|CPU' /proc/sched_debug" |
| ブラウザースケジューラーの内部動作統計 | # less /proc/sched_debug |
| 包括的なプロセス統計とアフィニティービューを表示します
| # top |
| すべてのシステムプロセスとそれらの CPU アフィニティーを表示します | # ps -eF |
| すべてのシステムプロセスを表示し、スリープおよび実行中のプロセスと、スリープの場合、どの機能で実行されているかを表示します | # ps -elfL |
| 特定の PID の CPU アフィニティーを表示します | # taskset --pid $(pidof qemu-kvm) |
| 特定の PID の CPU アフィニティーを設定します | # taskset --pid --cpu-list 0-9,20-29 $(pidof <Process>) |
3.6. KVM リンクのコピーリンクがクリップボードにコピーされました!
これらのコマンドを使用して、カーネルベースの仮想マシン (KVM) 関連のドメイン統計を表示します。
| アクション | コマンド |
|---|---|
| リアルタイムの KVM ハイパーバイザー統計を表示します (VMExit、VMEntry、vCPU ウェイクアップ、コンテキストスイッチング、タイマー、停止プール、vIRQ) | # kvm_stat |
| 深い KVM ハイパーバイザー統計を表示します | # kvm_stat --once |
| 特定のゲストのリアルタイム KVM ハイパーバイザー統計を表示します (VMExit、VMEntry、vCPU ウェイクアップ、コンテキストスイッチング、タイマー、停止プール、vIRQ) | # kvm_stat --guest=<VM name> |
| 特定のゲストの詳細な KVM ハイパーバイザー統計を表示します | # kvm_stat --once --guest=<VM name> |
| KVM プロファイリングトラップ統計を表示します | # perf kvm stat live |
| KVM プロファイリング統計を表示します | # perf kvm top |
| 特定の VM の vCPU ピンを表示します | # virsh vcpupin <Domain name/ID> |
| 特定の VM の QEMU エミュレータースレッドを表示します | # virsh emulatorpin <Domain name/ID> |
| 特定の VM の NUMA ピンを表示します | # virsh numatune <Domain name/ID> |
| 特定の VM のメモリー統計を表示します | # virsh dommemstat <Domain name/ID> |
| 特定の VM の vCPU 統計を表示します | # virsh nodecpustats <Domain name/ID> |
| 特定の VM のすべての vNIC を表示します | # virsh domiflist <Domain name/ID> |
| 特定の VM の vNIC 統計を表示します (DPDK VHU では機能しません) | # virsh domifstat <Domain name/ID> <vNIC> |
| 特定の VM のすべての vDisk を表示します | # virsh domblklist <Domain name/ID> |
| 特定の VM の vDisk 統計を表示します | # virsh domblkstat <Domain name/ID> <vDisk> |
| 特定の VM のすべての統計を表示します | # virsh domstats <Domain name/ID> |
3.7. CPU リンクのコピーリンクがクリップボードにコピーされました!
これらのコマンドを使用して、CPU 使用率、プロセス CPU 分散、頻度、および SMI を表示します。
| アクション | コマンド |
|---|---|
| 特定のプロセス名の分布について、すべてのプロセススレッドを含む CPU 使用率と CPU アフィニティーを表示します | # pidstat -p $(pidof qemu-kvm) -t |
| 仮想メモリー、I/O、および CPU の統計を表示します | # vmstat 1 |
| 集計された詳細な CPU 使用率を表示します | # mpstat |
| 詳細な CPU 使用率の分布を表示します | # mpstat -P ALL |
| 特定の CPU の詳細な CPU 使用率分布を表示します (範囲をサポートしていません) | # mpstat -P 2,3,4,5 |
| 30 回の反復で 10 秒ごとに特定の CPU の詳細な CPU 使用率分布を表示します | # mpstat -P 2,3,4,5 10 30 |
| 特定の CPU 周波数のハードウェア制限と周波数ポリシーを表示します | # cpupower -c 24 frequency-info |
| 現在の CPU 周波数情報を表示します | # cpupower -c all frequency-info|grep -E "current CPU frequency|analyzing CPU" |
| すべての CPU の頻度と CPU % C-States 統計を表示します | # cpupower monitor |
| すべての CPU のリアルタイムの頻度と CPU % C-States 統計を表示し、変動を強調表示します | # watch -n1 -d "cpupower monitor" |
| SMI を含むすべての CPU のより詳細な頻度と CPU % C-States 統計を表示します (RT に役立ちます) | # turbostat --interval 1 |
| SMI を含む特定の CPU のより詳細な頻度と CPU % C-States 統計を表示します (RT に役立ちます) | # turbostat --interval 1 --cpu 4 |
| CPU の詳細とサポートされている ISA を表示する | # lscpu |
| Intel CPU に固有: CPU 使用率、CPU IPC、CPU 実行率 (%)、L3 および L2 キャッシュヒット、ミス、命令あたりのミス、温度、メモリーチャネル使用率、および QPI/UPI 使用率に関する非常に低レベルの詳細を表示します。 | git clone Processor Counter Monitor make ./pcm.x" |
3.8. NUMA リンクのコピーリンクがクリップボードにコピーされました!
これらのコマンドを使用して、Non-Uniform Memory Access (NUMA) 統計とプロセス分散を表示します。
| アクション | コマンド |
|---|---|
| ハードウェア NUMA トポロジーを表示します | # numactl -H |
| NUMA 統計を表示します | # numastat -n |
| システム全体のメモリー使用量のように meminfo を表示します | # numastat -m |
| 特定のプロセス名の NUMA メモリーの詳細とバランシングを表示します | # numastat qemu-kvm |
| 特定の NUMA ノード固有の統計を表示します | # /sys/devices/system/node/node<NUMA node number>/numastat |
| NUMA ノードと PCI デバイスを使用した NUMA トポロジーの理由を非常に明確に示します | # lstopo --physical |
| 関連するデバイスを使用して、物理 NUMA トポロジーのグラフ (svg 形式) を生成します | # lstopo --physical --output-format svg > topology.svg |
3.9. メモリー リンクのコピーリンクがクリップボードにコピーされました!
これらのコマンドを使用して、メモリー統計、Huge Page、DPC、物理 DIMM、および頻度を表示します。
| アクション | コマンド |
|---|---|
| システム全体のメモリー使用量のように meminfo を表示します | # numastat -m |
| 仮想メモリー、I/O、および CPU の統計を表示します | # vmstat 1 |
| グローバルメモリー情報を表示します | # cat /proc/meminfo |
| 特定の NUMA ノードの 2MB の Huge Page の総数を表示します | # /sys/devices/system/node/node<NUMA node number>/hugepages/hugepages-2048kB/nr_hugepages |
| 特定の NUMA ノードの 1GB の Huge Page の総数を表示します | # /sys/devices/system/node/node<NUMA node number>/hugepages/hugepages-1048576kB/nr_hugepages |
| 特定の NUMA ノードの 2MB の空いている Huge Page の合計を表示します | # /sys/devices/system/node/node<NUMA node number>/hugepages/hugepages-2048kB/free_hugepages |
| 特定の NUMA ノードの 1GB の空いている Huge Page の合計を表示します | # /sys/devices/system/node/node<NUMA node number>/hugepages/hugepages-1048576kB/free_hugepages |
| 100x 2MB の Huge Page をリアルタイムで NUMA0 に割り当てます (NUMA ノードは変更できます) | # echo 100 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages |
| 100x 1GB の Huge Page をリアルタイムで NUMA0 に割り当てます (NUMA ノードは変更できます) | # echo 100 > /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages |
| リアルタイムの SLAB 情報を表示します | # slabtop |
| 詳細な SLAB 情報を表示します | # cat /proc/slabinfo |
| インストールされているメモリー DIMM の合計を表示します | # dmidecode -t memory | grep Locator |
| インストールされているメモリー DIMM の速度を表示します | # dmidecode -t memory | grep Speed |
3.10. PCI リンクのコピーリンクがクリップボードにコピーされました!
これらのコマンドを使用して、PCI 統計、PCI 詳細、および PCI ドライバーオーバーライドを表示します。
| アクション | コマンド |
|---|---|
| システムに詳細な PCI デバイス情報を表示します | # lspci -vvvnn |
| PCI ツリービューを表示します | # lspci -vnnt |
| PCI デバイスの NUMA 情報を表示します | # lspci -vmm |
| 特定のデバイスの PCIe 最大リンク速度を表示します | # lspci -s 81:00.0 -vv | grep LnkCap |
| 特定のデバイスの PCIe リンク速度ステータスを表示します | # lspci -s 81:00.0 -vv | grep LnkSta |
| PCI デバイスとカーネルドライバーを表示します | # driverctl list-devices |
| PCI デバイスドライバーのオーバーライドを表示します (DPDK および SR-IOV インターフェイスで一般的) | # driverctl list-overrides |
| PCI デバイスに別のカーネルドライバーを設定します (永続的に再起動します) | # driverctl set-override 0000:81:00.0 vfio-pci |
| PCI デバイスのオーバーライドされたカーネルドライバーの設定を解除します (デバイスが使用中の場合、コマンドはハングします) | # driverctl unset-override 0000:81:00.0 |
3.11. Tuned リンクのコピーリンクがクリップボードにコピーされました!
これらのコマンドを使用して、調整されたプロファイル、検証、およびログを表示します。
| アクション | コマンド |
|---|---|
| 調整された現在有効なプロファイルと説明を表示します | # tuned-adm profile_info |
| 調整された利用可能なプロファイルと現在有効なプロファイルを表示します | # tuned-adm list |
| 特定の調整されたプロファイルを有効にしました | # tuned-adm profile realtime-virtual-host |
| 現在有効なプロファイルを確認します | # tuned-adm verify |
| 調整されたログ | # less /var/log/tuned/tuned.log |
3.12. プロファイリングプロセス リンクのコピーリンクがクリップボードにコピーされました!
これらのコマンドを使用して、CPU プロファイリング、プロセスプロファイリング、および KVM プロファイリングを表示します。
| セクション | アクション | コマンド |
|---|---|---|
| Process | 特定の PID のプロファイリング | # perf record -F 99 -p PID |
| Process | 30 秒間の特定の PID のプロファイリング | # perf record -F 99 -p PID sleep 30 |
| Process | 特定の PID でのリアルタイムのプロファイリング | # perf top -F 99 -p PID |
| CPU | 特定の CPU コアリストでのイベントの 30 秒間のプロファイリング | # perf record -F 99 -g -C <CPU Core(s)> — sleep 30s |
| CPU | イベントの特定の CPU コアリストでのリアルタイムのプロファイリング | # perf top -F 99 -g -C <CPU Core(s)> |
| コンテキストスイッチング | 特定の CPU コアリストを 30 秒間プロファイリングし、コンテキストスイッチングのみを検索します | # perf record -F 99 -g -e sched:sched_switch -C <CPU Core(s)> — sleep 30 |
| KVM | 特定の時間の KVM ゲストのプロファイリング | # perf kvm stat record sleep 30s |
| Cache | キャッシュ効率を探すための 5 秒間の特定の CPU コアリストのプロファイリング | # perf stat -C <CPU Core(s)> -B -e cache-references,cache-misses,cycles,instructions,branches,faults,migrations sleep 5 |
| レポート | パフォーマンスプロファイリングの分析 | # perf report |
| レポート | stdout でのパフォーマンスプロファイリングの報告 | # perf report --stdio |
| レポート | stdout での KVM プロファイリングの報告 | # perf kvm stat report |
3.13. ブロック I/O リンクのコピーリンクがクリップボードにコピーされました!
これらのコマンドを使用して、ストレージ I/O 分散と I/O プロファイリングを表示します。
| アクション | コマンド |
|---|---|
| すべてのシステムデバイスの I/O の詳細を表示します | # iostat |
| すべてのシステムデバイスの高度な I/O の詳細を表示します | # iostat -x |
| 30 回の反復で 10 秒ごとにすべてのシステムデバイスの高度な I/O の詳細を表示します | # iostat -x 10 30 |
| 特定のブロックデバイスの高度な I/O プロファイリングを生成します | # blktrace -d /dev/sda -w 10 && blkparse -i sda.* -d sda.bin |
| blktrace プロファイリングを報告します | # btt -i sda.bin |
3.14. リアルタイム リンクのコピーリンクがクリップボードにコピーされました!
これらのコマンドを使用して、関連するリアルタイムテスト、SMI、および遅延を表示します。
| アクション | コマンド |
|---|---|
| 定義されたしきい値を実行している通常の RT カーネル実行をブロックしている SMI があるかどうかを識別します。 | # hwlatdetect --duration=3600 --threshold=25 |
| いくつかの追加オプションを使用して、特定の時間の最大スケジューリング待ち時間を確認します。
| # cyclictest --duration=3600 \ --mlockall \ --priority=99 \ --nanosleep \ --interval=200 \ --histogram=5000 \ --histfile=./output \ --threads \ --numa \ --notrace |
3.15. セキュリティー リンクのコピーリンクがクリップボードにコピーされました!
これらのコマンドを使用して、投機的な実行と GRUB ブートパラメーターを確認します。
| アクション | コマンド |
|---|---|
| 現在の投機的実行のセキュリティーステータスをすべて確認します | Linux および BSD の場合は、Spectre & Meltdown vulnerability/mitigation checker を参照してください。 |
| すべての投機的実行の修復を無効にする GRUB パラメーター | spectre_v2=off spec_store_bypass_disable=off pti=off l1tf=off kvm-intel.vmentry_l1d_flush=never |
| CVE-2017-5753(Spectre バリアント 1) のステータスを確認します | # cat /sys/devices/system/cpu/vulnerabilities/spectre_v1 |
| IBPB と Retpoline (CVE-2017-5715 Spectre variant 2) のステータスを確認します | # cat /sys/devices/system/cpu/vulnerabilities/spectre_v2 |
| KPTI (CVE-2017-5754 Meltdown) ステータスを確認します | # cat /sys/devices/system/cpu/vulnerabilities/meltdown |
| Spectre-NG (CVE-2018-3639 Spectre Variant 4) ステータスを確認します | # cat /sys/devices/system/cpu/vulnerabilities/spec_store_bypass |
| Foreshadow (CVE-2018-3615 Spectre Varian 5、L1TF とも呼ばれます) のステータスを確認します | # cat /sys/devices/system/cpu/vulnerabilities/l1tf |
| Foreshadow VMEntry L1 キャッシュ効果を確認します | # cat /sys/module/kvm_intel/parameters/vmentry_l1d_flush |
| SMT ステータスを確認します | # cat /sys/devices/system/cpu/smt/control |
3.16. Juniper Contrail vRouter リンクのコピーリンクがクリップボードにコピーされました!
これらのコマンドを使用して、vRouter VIF、MPLS、Nexthost、VRF、VRF のルート、フロー、およびダンプ情報を表示します。
| アクション | コマンド |
|---|---|
| vRouter カーネルスペースの人間が読める形式の統計 | |
| vRouter DPDK の人間が読める形式の統計 | |
| DPDK インターフェイスからパケットキャプチャを実行するには (vifdump の後に grep を使用しないでください) | # vifdump vif0/234 <tcpdump standard arguments such as -v -nn -e -w <path/to/file>> |
| すべての vRouter インターフェイスとサブインターフェイスの統計と詳細を表示します | # vif --list |
| 特定のインターフェイスの vRouter 統計と詳細を表示します | # vif --list --get 234 |
| すべてのインターフェイスとサブインターフェイスの vRouter パッカーレートを表示します | # vif --list --rate |
| 特定のインターフェイスの vRouter パッカーレートを表示します | # vif --list --rate --get 234 |
| 特定のインターフェイスの vRouter パケットドロップ統計を表示します | # vif --list --get 234 --get-drop-stats |
| vRouter フローを表示します | # flow -l |
| リアルタイムの vRouter フローアクションを表示する | # flow -r |
| 特定の VRF の vRouter パケット統計を表示します (vif --list から VRF 番号を見つけることができます) | # vrfstats --get 0 |
| すべての VRF の vRouter パケット統計を表示します | # vrfstats --dump |
| 特定の VRF の vRouter ルーティングテーブルを表示します (VRF 番号は vif -- list から確認できます) | # rt --dump 0 |
| 特定の VRF の vRouterIPv4 ルーティングテーブルを表示します (VRF 番号は vif -- list から確認できます) | # rt --dump 0 --family inet |
| 特定の VRF の vRouterIPv6 ルーティングテーブルを表示します (VRF 番号は vif -- list から確認できます) | # rt --dump 0 --family inet6 |
| 特定の VRF の vRouter 転送テーブルを表示します (VRF 番号は vif -- list から確認できます) | # rt --dump 0 --family bridge |
| 特定のアドレスの特定の VRF で vRouter ルートターゲットを表示します | # rt --get 0.0.0.0/0 --vrf 0 --family inet |
| vRouter ドロップ統計を表示します | # dropstats |
| 特定の DPDK コアの vRouter ドロップ統計を表示します | # dropstats --core 11 |
| vRouter MPLS ラベルを表示します | # mpls --dump |
| 特定の vRouter ネクストホップを表示します (mpls --dump output から見つけることができます) | # nh --get 21 |
| すべての vRouter ネクストホップを表示します | # nh --list |
| すべての vRouter VXLAN VNID を表示します | # vxlan --dump |
| vRouter エージェント (スーパーバイザー、xmmp 接続、vrouter エージェントなど) のステータスを表示します | # contrail-status |
| vRouter (およびすべての Contrail ローカルコンピュートノードコンポーネント) を再起動します | # systemctl restart supervisor-vrouter |
3.17. OpenStack リンクのコピーリンクがクリップボードにコピーされました!
これらの OpenStack コマンドを使用して、VM コンピュートノードを表示します。
| アクション | コマンド |
|---|---|
| コンピュートノードでソートされたコンピュートノード上のすべての VM のリストを表示します | $ nova list --fields name,OS-EXT-SRV-ATTR:host --sort host |
| コンピュートノード上のすべての VM のリストを VM 名で並べ替えて表示します | $ nova list --fields name,OS-EXT-SRV-ATTR:host |
第4章 インスタンスの Tap インターフェイスの TX キューでの高いパケット損失 リンクのコピーリンクがクリップボードにコピーされました!
本セクションでは、TX キューでパケットロスのトラブルシューティングを行います。
4.1. 現象 リンクのコピーリンクがクリップボードにコピーされました!
ホストオンリーネットワークを使用した仮想ネットワーク機能 (VNF) のテスト中に、インスタンスのタップインターフェイスの TX キューで高いパケット損失が見られる場合があります。テストセットアップは、ノード上の 1 つの VM から同じノード上の別の VM にパケットを送信します。パケット損失はバーストで表示されます。
次の例は、タップの TX キューにドロップされたパケットの数が多いことを示しています。
4.2. 診断 リンクのコピーリンクがクリップボードにコピーされました!
このセクションでは、タップ (カーネルパス) インターフェイスでのパケットドロップについて説明します。ユーザーデータパスの vhost ユーザーインターフェイスでのパケットドロップについては、https://access.redhat.com/solutions/3381011 を参照してください。
TX ドロップは、インスタンスの vCPU とハイパーバイザー上の他のプロセス間の干渉が原因で発生します。タップインターフェイスの TX キューは、インスタンスがパケットを取得できない場合に備えて、パケットを短時間保存できるバッファーです。これは、インスタンスの CPU が十分な時間実行されない (またはフリーズする) 場合に発生します。
TUN/TAP デバイスは、一方の端がカーネルネットワークインターフェイスで、もう一方の端がユーザー空間ファイル記述子である仮想デバイスです。
TUN/TAP インターフェイスは、次の 2 つのモードのいずれかで実行できます。
- Tap mode は、L2 ヘッダー付きの L2 イーサネットフレームをデバイスにフィードし、ユーザー空間から同じものを受信することを期待します。このモードは VM に使用されます。
- Tun mode は、L3 ヘッダー付きの L3 IP パケットをデバイスにフィードし、ユーザー空間から同じものを受信することを期待します。このモードは主に VPN クライアントに使用されます。
KVM ネットワーキングでは、ユーザー空間ファイル記述子は qemu-kvm プロセスによって所有されます。タップに送信されたフレーム (ハイパーバイザーの観点からは TX) は、最終的に qemu-kvm 内の L2 フレームになり、仮想ネットワークインターフェイスに受信されたネットワークパケットとして VM 内の仮想ネットワークデバイスにそれらのフレームをフィードできます (RX VM の観点)。
TUN/TAP の重要な概念は、ハイパーバイザーからの送信方向が仮想マシンの受信方向であるということです。これは反対方向にも当てはまります。ハイパーバイザーの受信は、仮想マシンからの送信と同じです。
virtio-net デバイスにはパケットのリングバッファーはありません。これは、VM が (十分に高速で、またはまったく) 受信していないために TUN/TAP デバイスの TX キューがいっぱいになった場合、新しいパケットを送信する場所がなく、ハイパーバイザーが tap で TX 損失を確認することを意味します。
TUN/TAP で TX 損失に気付いた場合は、それを回避するために tap txqueuelen を増やします。これは、物理 NIC での受信損失を停止するために RX リングバッファーを増やすのと同様です。
ただし、これは、VM が受信時に低速でバーストしていることを前提としています。VM が常に十分な速度で実行されていない場合、またはまったく受信していない場合は、TX キューの長さを調整しても効果がありません。VM が実行または受信されていない理由を確認する必要があります。
仮想マシンのパケット処理のパフォーマンスを向上させる必要がある場合は、以下の手順を実行します。
-
ハイパーバイザーで
virtio-net マルチキューを有効にします。 - 複数の仮想デバイス割り込みを、仮想マシン内の差異コアに分散します。
これは、KVM の libvirt ドメイン仕様に記載されています。RHEL KVM ハイパーバイザーで virsh edit を使用して実行できます。
Red Hat OpenStack Platform で virtio-net のマルチ キューを設定することができない場合は、仮想マシン内で RPS を設定して、複数の CPU コア間で受信の負荷とソフトウェアのバランスを取ることを検討してください。詳細は、kernel-doc パッケージの scaling.txt か、RHEL 製品ドキュメントの RPS セクションを参照してください。
4.2.1. 回避策 リンクのコピーリンクがクリップボードにコピーされました!
レイテンシーの増加やその他の欠点を犠牲にして小さなフリーズを軽減するには、TX キューを増やします。
txqueuelen を一時的に増やすには、次のコマンドを使用します。
/sbin/ip link set tap<uuid> txqueuelen <new queue length>
/sbin/ip link set tap<uuid> txqueuelen <new queue length>
txqueulen を永続的に増やすには、udev ルールを作成します。
cat <<'EOF'>/etc/udev/rules.d/71-net-txqueuelen.rules
SUBSYSTEM=="net", ACTION=="add", KERNEL=="tap*", ATTR{tx_queue_len}="10000"
EOF
cat <<'EOF'>/etc/udev/rules.d/71-net-txqueuelen.rules
SUBSYSTEM=="net", ACTION=="add", KERNEL=="tap*", ATTR{tx_queue_len}="10000"
EOF
udev を再読み込みするか、システムを再起動すると、新しい tap インターフェースはキューの長さ 10000 とともに起動します。以下に例を示します。
ip link ls | grep tap
[root@overcloud-compute-0 ~]# ip link ls | grep tap
29: tap122be807-cd: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 5505
qdisc pfifo_fast master qbr122be807-cd state UNKNOWN mode DEFAULT
group default qlen 10000
4.2.2. 診断手順 リンクのコピーリンクがクリップボードにコピーされました!
次のスクリプトを使用して、ハイパーバイザーから奪われた CPU 時間の影響を確認します。
インスタンスにログインし、dd if=/dev/zero of=/dev/null を開始して、唯一の vCPU に追加の負荷をかけます。これはデモンストレーション用であることに注意してください。VM 内からのロードの有無にかかわらず、同じテストを繰り返すことができます。TX ドロップは、ハイパーバイザー上の別のプロセスがインスタンスの vCPU から時間を奪っている場合にのみ発生します。
次の例は、テスト前のインスタンスを示しています。
次のスクリプトを実行し、TX キューにドロップされたパッケージを確認します。これらは、dd プロセスがインスタンスの CPU から大量の処理時間を消費する場合にのみ発生します。
次の例は、テスト中のハイパーバイザーに対する dd の影響を示しています。st ラベルは、ハイパーバイザーから奪われた時間の割合を示します。
インスタンスでのテストの後半では、テストの実行時間が長すぎる場合にタイムアウトになる可能性を含め、ssh が遅くなる可能性があることに注意してください。
4.3. 解決策 リンクのコピーリンクがクリップボードにコピーされました!
TX キューを増やすと、これらの小さなフリーズを軽減できますが、カーネルパラメーターで CPU 固定と isolcpus を使用して完全に分離することが最善の解決策です。詳細は、Configure CPU pinning with NUMA in OpenStack を参照してください。
第5章 OpenvSwitchDPDK を使用したインスタンス Open vSwitch インターフェイスでの TX ドロップ リンクのコピーリンクがクリップボードにコピーされました!
この手順を使用して、インスタンス vhost-user (VHU) インターフェイスでの送信ドロップのトラブルシューティングを行います。
5.1. 現象 リンクのコピーリンクがクリップボードにコピーされました!
パケットは、カーネルまたは qemu プロセスを通過せずに、virtio トランスポートを使用して vswitch からゲストに送信されます。これは、VHU インターフェイスとパケットを交換することによって行われます。
VHU は、ほとんどの場合、パケットのバッチを送受信する機能も提供する DPDK librte_vhost によって実装されます。VHU のバックエンドは、仮想マシンとパケットを交換するために qemu によって提供される virtio リングです。virtio リングには、記述子とバッファーで設定される特別な形式があります。
TX/RX (送信/受信) 統計は OpenvSwitch (OVS) 用です。これは、送信統計が VM の受信統計に直接関連していることを意味します。
VM がパケットを十分に高速に処理しない場合、OVS TX キューはオーバーフローし、パケットをドロップします。
5.1.1. パケットドロップの説明 リンクのコピーリンクがクリップボードにコピーされました!
飽和した virtio リングにより、vhost-user デバイスで TX ドロップが発生します。virtio リングはゲストのメモリーにあり、vhost-user がパケットをプッシュして VM がパケットを消費するキューのように機能します。VM がパケットを消費するのに十分な速度でない場合、virtio リングはバッファーを使い果たし、vhost-user はパケットをドロップします。
Perf および Ftrace ツールを使用して、パケットドロップのトラブルシューティングを行います。
- Perf を使用して、スケジューラースイッチの数をカウントします。これにより、qemu スレッドがプリエンプトされたかどうかを確認できます。
- Ftrace を使用して、プリエンプションの理由と所要時間を表示します。
プリエンプションの理由は次のとおりです。
時間割り込み (カーネルティック):
これらは、少なくとも 2 つのコンテキストスイッチのコストを追加します。タイマー割り込みは、予測できない時間がかかる可能性のあるリードコピー更新 (RCU) コールバックを実行することもできます。
- CPU パワー管理とハイパースレッディング
これらのツールは、次のパッケージに含まれています。
-
PERF:
perf rpm in rhel-7-server-rpms/7Server/x86_64.詳細は、About Perf を参照してください。 -
FTRACE:
trace-cmd info rhel-7-server-rpms/7Server/x86_64.詳細は、About Ftrace を参照してください。
5.1.2. 他のドロップの説明 リンクのコピーリンクがクリップボードにコピーされました!
OVS 2.9 より前は、vHost ユーザーポートは dpdkvhostuser モードで作成されていました。このモードでは、OVS が vhost サーバーとして機能し、QEMU がクライアントとして機能します。インスタンスがダウンまたは再起動すると、OVS ブリッジの vhost ユーザーポートはアクティブなままで、VM 宛てのパケットをドロップします。これにより、tx_drop_counter が増加します。
次の例では、VM は nova stop <UUID> で停止されました。
ovs-vsctl list interface vhubd172106-73 | grep _state
[root@overcloud-compute-0 network-scripts]# ovs-vsctl list interface vhubd172106-73 | grep _state
admin_state : up
link_state : down
これは、ip link set dev <br internal port name> がダウンした状態でカーネルポートがシャットダウンされ、フレームがユーザースペースにドロップされた場合に発生することと似ています。
VM が起動すると、同じ vhu ソケットに接続し、virtio リングバッファーを空にし始めます。TX が中断されることはなくなり、通常のネットワークトラフィックが再開されます。
5.1.3. DPDK の TX および RX キューの長さを増やす リンクのコピーリンクがクリップボードにコピーされました!
以下の OpenStackDirector テンプレートの変更により、DPDK の TX および RX キューの長さを変更できます。
NovaComputeExtraConfig:
nova::compute::libvirt::rx_queue_size: '"1024"'
nova::compute::libvirt::tx_queue_size: '"1024"'
NovaComputeExtraConfig:
nova::compute::libvirt::rx_queue_size: '"1024"'
nova::compute::libvirt::tx_queue_size: '"1024"'
次の例は、検証チェックを示しています。
カーネルの制限により、キューサイズを 1024 を超えて増やすことはできません。
DPDK を介した neutron ネットワークで PXE ブートを使用できるようにする場合は、PXE バージョンが 1024 バイトをサポートしていることを確認する必要があります。
5.2. 診断 リンクのコピーリンクがクリップボードにコピーされました!
ゲストがパケットを受信できない場合、TX が vhost ユーザーポートに向かって低下することがわかります。TCP は、通常のネットワーク状態で発生するパケット損失から回復するように設計されています。NFVi には厳格な要件があり、パケットドロップに対する許容度は低くなっています。
カーネルデータパスは NFVi には遅すぎるため、DPDK で高速化された OVS を使用します。さらに、ホストのパケット処理速度に一致する DPDK 対応のゲストをデプロイすることが重要です。
5.3. 解決策 リンクのコピーリンクがクリップボードにコピーされました!
VM に割り当てられた vCPU がゲストのタスクのみを処理していることを確認します。
クラスターが次のテンプレートパラメーターを使用してデプロイされたことを確認します。
-
IsolCpusList: CPUをスケジューリングから削除する -
NovaVcpuPinSet: ピニング用の CPU の割り当て -
NovaComputeCpuSharedSet: エミュレータースレッドピニング用の CPU の割り当て
-
例:
- 固定された CPU とエミュレータープールセットを利用するフレーバーで VM がデプロイされていることを確認します。
例:
openstack flavor create --ram <size_mb> --disk <size_gb> -\ -vcpus <vcpus> --property dpdk=true \ --property hw:mem_page_size=1G \ --property hw:cpu_policy=dedicated \ --property hw:emulator_threads_policy=share <flavor>
openstack flavor create --ram <size_mb> --disk <size_gb> -\
-vcpus <vcpus> --property dpdk=true \
--property hw:mem_page_size=1G \
--property hw:cpu_policy=dedicated \
--property hw:emulator_threads_policy=share <flavor>
- これらの設定が意図したとおりに動作していることを確認してください。詳細は、Simple Compute Node CPU Partitioning and Memory Checks を参照してください。
完全に専用の CPU リソースをインスタンスに割り当てても、ネットワークパケット損失が発生する場合は、インスタンスが適切に調整され、DPDK が有効になっていることを確認してください。
第6章 DPDK を使用した Open vSwitch での pmd-stats-show コマンドの出力の解釈 リンクのコピーリンクがクリップボードにコピーされました!
このセクションを使用して、DPDK を使用した Open vSwitch (OVS) での pmd-stats-show コマンド (ovs-appctl dpif-netdev/pmd-stats-show) の出力を解釈します。
6.1. 現象 リンクのコピーリンクがクリップボードにコピーされました!
ovs-appctl dpif-netdev/pmd-stats-show コマンドは、不正確な測定値を提供します。これは、PMD が開始されてからグラフ化され、収集された統計によるものです。
6.2. 診断 リンクのコピーリンクがクリップボードにコピーされました!
有用な出力を取得するには、システムを定常状態にして、測定する統計をリセットします。
put system into steady state wait <x> seconds
# put system into steady state
ovs-appctl dpif-netdev/pmd-stats-clear
# wait <x> seconds
sleep <x>
ovs-appctl dpif-netdev/pmd-stats-show
出力の例を次に示します。
core_id 2 は主にビジーであり、処理時間の 70% とポーリング時間の 30% を費やしていることに注意してください。
polling cycles:5460724802 (29.10%) processing cycles:13305794333 (70.90%)
polling cycles:5460724802 (29.10%)
processing cycles:13305794333 (70.90%)
この例では、miss は、DPDK データパス (emc または dp 分類子) で分類されなかったパケットを示します。通常の状況では、それらは ofproto レイヤーに送信されます。まれに、フローの再検証ロックが原因で、または ofproto レイヤーがエラーを返した場合、パケットはドロップされます。この場合、lost の値も増分されて損失を示します。
emc hits:14874381 megaflow hits:0 avg. subtable lookups per hit:0.00 miss:0 lost:0
emc hits:14874381
megaflow hits:0
avg. subtable lookups per hit:0.00
miss:0
lost:0
詳細については、OVS-DPDK Datapath Classifier を参照してください。
6.3. 解決策 リンクのコピーリンクがクリップボードにコピーされました!
このセクションでは、ovs-appctl コマンドを使用してトラフィックフローを表示する手順を示します。
6.3.1. アイドル PMD リンクのコピーリンクがクリップボードにコピーされました!
次の例は、core_ids が dpdk0 に固定されている PMD にサービスを提供し、管理トラフィックのみが dpdk0 を流れるシステムを示しています。
6.3.2. パケットドロップを伴う負荷テスト中の PMD リンクのコピーリンクがクリップボードにコピーされました!
次の例は、core_ids が dpdk0 に固定されている PMD にサービスを提供し、負荷テストが dpdk0 を通過して、多数の RX ドロップを引き起こすシステムを示しています。
パケットドロップが発生する場合、処理サイクルとポーリングサイクルの比率が高いことがわかります (90% 以上の処理サイクル)。
polling cycles:1497174615 (6.85%) processing cycles:20354613261 (93.15%)
polling cycles:1497174615 (6.85%)
processing cycles:20354613261 (93.15%)
パケットあたりの平均サイクル (CPP) とパケットあたりの平均処理サイクル (PCPP) を確認します。アイドルサイクルはカウントされないため、完全にロードされた PMD の PCPP/CPP 比は 1 と予想できます。
avg cycles per packet: 723.96 (21851787876/30183584) avg processing cycles per packet: 674.36 (20354613261/30183584)
avg cycles per packet: 723.96 (21851787876/30183584)
avg processing cycles per packet: 674.36 (20354613261/30183584)
6.3.3. mpps 容量の 50% で負荷テスト中の PMD リンクのコピーリンクがクリップボードにコピーされました!
次の例は、core_ids が dpdk0 に固定された PMD にサービスを提供し、負荷テストが dpdk0 を通過して、この dpdk0 インターフェイス (約 12.85 Mpps) の 6.4 Mpps (最大容量の約 50%) を送信するシステムを示しています。
pps がインターフェイスの最大値の約半分である場合、処理サイクルとポーリングサイクルの比率が低くなります (約 70% の処理サイクル)。
polling cycles:5460724802 (29.10%) processing cycles:13305794333 (70.90%)
polling cycles:5460724802 (29.10%)
processing cycles:13305794333 (70.90%)
6.3.4. ヒット vs ミス vs ロスト リンクのコピーリンクがクリップボードにコピーされました!
次の例は、対象に関する man ページを示しています。
一部のドキュメントはカーネルデータパスを参照しているため、user space processing とは、パケットがカーネル sw キャッシュ (emc および dpcls と同等) に分類されず、ユーザースペースの ofproto レイヤーに送信されないことを意味します。
第7章 nova での SR-IOV ポートの接続と取り外し リンクのコピーリンクがクリップボードにコピーされました!
次のセクションを使用して、SR-IOV ポートを接続および切断します。
7.1. 現象 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat OpenStack Platform 10 以降の nova で SR-IOV ポートを接続または切断することはできません。Nova ログは、No conversion for VIF type hw_veb yet を報告します。
7.2. 診断 リンクのコピーリンクがクリップボードにコピーされました!
すでに作成されているインスタンスに SR-IOV ポートをアタッチまたはデタッチすることはできません。SR-IOV ポートは、インスタンスの作成時に接続する必要があります。
7.3. 解決策 リンクのコピーリンクがクリップボードにコピーされました!
次の例は、インスタンスの起動後にインターフェイスを接続する試みを示しています。
これは次のエラーで失敗します。
ERROR (ClientException): Unexpected API Error. Please report this at http://bugs.launchpad.net/nova/ and attach the Nova API log if possible. <type 'exceptions.KeyError'> (HTTP 500) (Request-ID: req-36b544f4-91a6-442e-a30d-6148220d1449)
ERROR (ClientException): Unexpected API Error. Please report this at http://bugs.launchpad.net/nova/ and attach the Nova API log if possible.
<type 'exceptions.KeyError'> (HTTP 500) (Request-ID: req-36b544f4-91a6-442e-a30d-6148220d1449)
正しい方法は、SR-IOV ポートを使用してインスタンスを直接生成することです。
第8章 Open vSwitch を使用した LACP ボンディングの設定とテスト リンクのコピーリンクがクリップボードにコピーされました!
使用している Red Hat OpenStack Platform (RHOSP) のバージョンによっては、LACP との OVS 結合がサポートされない場合があります。製品ドキュメントをチェックして、LACP との OVS 結合がサポートされていることを確認します。
Open vSwitch DPDK を使用して LACP ボンディングを設定およびテストするには、次のタスクを実行します。
- LACP のスイッチポートを設定します。
- LACP の Linux カーネルボンディングをベースラインとして設定します。
- LACP の OVS DPDK ボンディングを設定します。
このトピックでは、Dell S4048-ON スイッチを使用したスイッチ設定について説明します。RHEL と OVS の設定は同じままですが、異なるスイッチベンダーのオペレーティングシステムは、異なる構文を使用して LACP を設定します。
8.1. LACP のスイッチポートの設定 リンクのコピーリンクがクリップボードにコピーされました!
スイッチインターフェイスをデフォルト設定にリセットします。
S4048-ON-sw#config t S4048-ON-sw(conf)#default int te1/2 S4048-ON-sw(conf)#default int te1/7
S4048-ON-sw#config t S4048-ON-sw(conf)#default int te1/2 S4048-ON-sw(conf)#default int te1/7Copy to Clipboard Copied! Toggle word wrap Toggle overflow ポートチャネルおよびその他のポート設定を設定します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow VLAN を設定します。
S4048-ON-sw#config t S4048-ON-sw(conf)#int range vlan901-909 S4048-ON-sw(conf-if-range-vl-901-909)#tagged Port-channel 1 S4048-ON-sw(conf-if-range-vl-901-909)#end S4048-ON-sw#
S4048-ON-sw#config t S4048-ON-sw(conf)#int range vlan901-909 S4048-ON-sw(conf-if-range-vl-901-909)#tagged Port-channel 1 S4048-ON-sw(conf-if-range-vl-901-909)#end S4048-ON-sw#Copy to Clipboard Copied! Toggle word wrap Toggle overflow VLAN タギングを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow LACP 設定を確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
8.2. LACP の Linux カーネルボンディングをベースラインとして設定する リンクのコピーリンクがクリップボードにコピーされました!
Linux カーネルボンディングをベースラインとして設定し、ホストがスイッチと LACP ボンディングを形成できることを確認します。
すべてのインターフェイスをカーネルスペースに移動し、カーネルスペースボンディングでテストします。この例では、p1p1 はバスアドレス
0000:04:00.0にマップされ、p1p2 はバスアドレス0000:04:00.1にマップされます。driverctl unset-override 0000:04:00.0 driverctl unset-override 0000:04:00.1
[root@baremetal ~]# driverctl unset-override 0000:04:00.0 [root@baremetal ~]# driverctl unset-override 0000:04:00.1Copy to Clipboard Copied! Toggle word wrap Toggle overflow ボンディングドライバーをロードし、ボンディングインターフェイス (
bond10) を設定し、インターフェイスp1p1とp1p2をスレーブ化します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow RHEL から LACP を確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow スイッチから LACP を確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ボンディング設定を削除します。
ip link del dev bond10
[root@baremetal ~]# ip link del dev bond10 [root@baremetal ~]#Copy to Clipboard Copied! Toggle word wrap Toggle overflow
ボンディングモードの変更に関する情報は、「 How to change the bonding mode without reboot the system?」を参照してください。
8.3. LACP 用の OVS DPDK ボンディングの設定 リンクのコピーリンクがクリップボードにコピーされました!
次の目的は、OVS DPDK 内で LACP ボンディングを設定することです。
8.3.1. Open vSwitch を準備する リンクのコピーリンクがクリップボードにコピーされました!
Huge Page やその他の値が RHEL で設定されていることを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow DPDK 用に OVS を設定します。
ovs-vsctl list Open_vSwitch | grep other ovs-vsctl --no-wait set Open_vSwitch . other_config:pmd-cpu-mask=0x17c0017c ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-lcore-mask=0x00000001 ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init="true"
[root@baremetal bonding]# ovs-vsctl list Open_vSwitch | grep other other_config : {} [root@baremetal bonding]# ovs-vsctl --no-wait set Open_vSwitch . other_config:pmd-cpu-mask=0x17c0017c [root@baremetal bonding]# ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-lcore-mask=0x00000001 [root@baremetal bonding]# ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init="true"Copy to Clipboard Copied! Toggle word wrap Toggle overflow インターフェイスをユーザースペースに切り替えます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Open vSwitch、
journalctl -u ovs-vswitchd -f &を再起動し、バックグラウンドで実行します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
8.3.2. LACP ボンディングを設定する リンクのコピーリンクがクリップボードにコピーされました!
ボンディングを追加します。
ovs-vsctl add-br ovsbr0 -- set bridge ovsbr0 datapath_type=netdev ovs-vsctl add-bond ovsbr0 dpdkbond dpdk0 dpdk1 bond_mode=balance-tcp lacp=active -- set
[root@baremetal bonding]# ovs-vsctl add-br ovsbr0 -- set bridge ovsbr0 datapath_type=netdev [root@baremetal bonding]# ovs-vsctl add-bond ovsbr0 dpdkbond dpdk0 dpdk1 bond_mode=balance-tcp lacp=active -- set interface dpdk0 type=dpdk -- set Interface dpdk1 type=dpdkCopy to Clipboard Copied! Toggle word wrap Toggle overflow Open vSwitch から確認します:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow スイッチから確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
8.3.3. OVS からのポートの有効化/無効化 リンクのコピーリンクがクリップボードにコピーされました!
ovs-ofctl mod-port <bridge> <port> [up|down] を使用して、ポートを有効または無効にできます。
ポートをシャットダウンします。
ovs-ofctl mod-port ovsbr0 dpdk1 down
[root@baremetal bonding]# ovs-ofctl mod-port ovsbr0 dpdk1 downCopy to Clipboard Copied! Toggle word wrap Toggle overflow シャットダウンを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow スイッチで確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ポートを再度有効にします。
ovs-ofctl mod-port ovsbr0 dpdk1 up
[root@baremetal bonding]# ovs-ofctl mod-port ovsbr0 dpdk1 upCopy to Clipboard Copied! Toggle word wrap Toggle overflow RHEL から確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow スイッチから確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第9章 OVS DPDK を使用したさまざまなボンディングモードのデプロイ リンクのコピーリンクがクリップボードにコピーされました!
この手順を使用して、Red Hat OpenStack Platform で OVS-DPDK を使用してさまざまなボンディングモードをデプロイします。
9.1. 解決策 リンクのコピーリンクがクリップボードにコピーされました!
compute.yaml 環境ファイルに次の変更を加えます。この例では、MTU 値も 2000 に設定されていることに注意してください。
上記で行ったテンプレートの変更を使用して、オーバークラウドをデプロイまたは再デプロイします。完了したら、オーバークラウドノードで次の手順を実行します。
os-net-config 設定を確認します。
ボンディングを確認します。
第10章 Could not open network device dpdk0 (No such device) in ovs-vsctl show メッセージを受け取ります。 リンクのコピーリンクがクリップボードにコピーされました!
10.1. 現象 リンクのコピーリンクがクリップボードにコピーされました!
Could not open network device dpdk0 (No such device) in ovs-vsctl show メッセージを受け取ります。
10.2. 診断 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat は、DPDK でサポートされているハードウェア にリストされているポーリングモードドライバー (PMD) のサブセットをサポートしています。Red Hat は、2017 年 8 月にサポートされていない PMD を無効にしました。
アップストリーム PMD には、セキュリティーまたはパフォーマンスの問題がある可能性があります。したがって、PMD は、Red Hat の認定テストに合格するために、重要なテストを通過する必要があります。
有効になっているすべての PMD のリストは、/usr/share/doc/openvswitch-<version>/README.DPDK-PMDS にあります。このリストには、Red Hat でサポートされていない PMD が含まれている可能性があります。README.DPDK-PMDS にリストされていないポーリングモードドライバーはサポートされていません。
10.3. 解決策 リンクのコピーリンクがクリップボードにコピーされました!
次の例は、openvswitch-2.6.1 でサポートされている PMD を示しています。
この例は、openvswitch-2.9.0 でサポートされている PMD を示しています。
第11章 Open vSwitch でゲスト RAM を割り当てるために使用できる空きホストメモリーページが不十分です リンクのコピーリンクがクリップボードにコピーされました!
11.1. 現象 リンクのコピーリンクがクリップボードにコピーされました!
インスタンスをデプロイして、インスタンスに十分な物理 CPU が搭載されているコンピュートノードにスケジューリングする場合、nova はインスタンスメモリー用に十分な空きヒュージページを持っている場合、nova は以下を返します。
また、コンピュートノード上の /var/log/nova/nova-compute.log で以下の ERROR メッセージが表示されます。
2017-11-23 19:53:21.021 153615 ERROR nova.compute.manager [instance: 1b72e7a1-c298-4c92-8d2c-0a9fe886e9bc] 2017-11-23T19:53:20.477183Z qemu-kvm: -object memory-backend-file,id=ram-node0,prealloc=yes,mem-path=/dev/hugepages/libvirt /qemu/7-instance-00000006,share=yes,size=536870912,host-nodes=0,policy=bind: os_mem_prealloc: Insufficient free host memory pages available to allocate guest RAM
2017-11-23 19:53:21.021 153615 ERROR nova.compute.manager [instance: 1b72e7a1-c298-4c92-8d2c-0a9fe886e9bc]
2017-11-23T19:53:20.477183Z qemu-kvm: -object memory-backend-file,id=ram-node0,prealloc=yes,mem-path=/dev/hugepages/libvirt
/qemu/7-instance-00000006,share=yes,size=536870912,host-nodes=0,policy=bind: os_mem_prealloc: Insufficient free host memory
pages available to allocate guest RAM
さらに、libvirt は次のログファイルを作成します。
11.2. 診断 リンクのコピーリンクがクリップボードにコピーされました!
追加の設定がないと、nova は特定の量の Huge Page メモリーが他のプロセスによって使用されていることを認識しません。デフォルトでは、nova はすべての Huge Page メモリーがインスタンスで使用可能であると想定しています。Nova は、この NUMA ノードにまだ空き pCPU と空き hugepage メモリーがあると判断した場合、最初に NUMA ノード 0 をいっぱいにします。この問題は、次の原因で発生する可能性があります。
- 要求された pCPU はまだ NUMA0 に適合します
- 既存のすべてのインスタンスの結合されたメモリーと、生成されるインスタンスのメモリーは、NUMA ノード 0 に引き続き適合します。
- OVS などの別のプロセスは、NUMA ノード 0 に一定量の hugepage メモリーを保持します
11.2.1. 診断手順 リンクのコピーリンクがクリップボードにコピーされました!
meminfoを確認してください。以下は、NUMA ノードごとに 2MB の hugepages と 512 の空き hugepages を持つハイパーバイザーを示しています。Copy to Clipboard Copied! Toggle word wrap Toggle overflow NUMA アーキテクチャーを確認します。
lscpu | grep -i NUMA
[root@overcloud-compute-1 nova]# lscpu | grep -i NUMA NUMA node(s): 2 NUMA node0 CPU(s): 0-3 NUMA node1 CPU(s): 4-7Copy to Clipboard Copied! Toggle word wrap Toggle overflow OVS によって予約されている Huge Page を確認してください。次の出力では、OVS は NUMA ノードごとに 512MB の Huge Page を予約しています。
ovs-vsctl list Open_vSwitch | grep mem
[root@overcloud-compute-1 virt]# ovs-vsctl list Open_vSwitch | grep mem other_config : {dpdk-init="true", dpdk-lcore-mask="3", dpdk-socket-mem="512,512", pmd-cpu-mask="1e"}Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のフレーバー (1 つの vCPU と 512 MB またはメモリー) でインスタンスをデプロイします。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 新しいインスタンスが起動し、NUMA 1 のメモリーを使用します。
nova list | grep d98772d1-119e-48fa-b1d9-8a68411cba0b
[stack@undercloud-4 ~]$ nova list | grep d98772d1-119e-48fa-b1d9-8a68411cba0b | d98772d1-119e-48fa-b1d9-8a68411cba0b | cirros-test0 | ACTIVE | - | Running | provider1=2000:10::f816:3eff:fe8d:a6ef, 10.0.0.102 |Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copy to Clipboard Copied! Toggle word wrap Toggle overflow nova boot --nic net-id=$NETID --image cirros --flavor m1.tiny --key-name id_rsa cirros-test0
nova boot --nic net-id=$NETID --image cirros --flavor m1.tiny --key-name id_rsa cirros-test0Copy to Clipboard Copied! Toggle word wrap Toggle overflow このインスタンスは起動に失敗します:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow コンピュートノードから、NUMA ノード 0 の空きの Huge Page が使い果たされていることを確認します。ただし、NUMA ノード 1 には十分なスペースがあります。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/log/nova/nova-compute.logの情報により、インスタンスの CPU が NUMA ノード 0 に固定されていることが分かります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
numatune セクションで、nodeset=0 は、メモリーが NUMA0 から要求されることを示します。
11.3. 解決策 リンクのコピーリンクがクリップボードにコピーされました!
管理者は、インスタンスで使用されていない Huge Page メモリーの量を nova に入力できます。
grep reserved_huge /etc/nova/nova.conf -B1
[root@overcloud-compute-1 virt]# grep reserved_huge /etc/nova/nova.conf -B1
[DEFAULT]
reserved_huge_pages=node:0,size:2048,count:512
reserved_huge_pages=node:1,size:2048,count:512
サイズパラメーターは、KiB の Huge Page サイズです。count パラメーターは、NUMA ノードごとに OVS によって使用される Huge Page の数です。たとえば、Open vSwitch で使用される 4096 のソケットメモリーの場合、次の値を使用します。
[DEFAULT] reserved_huge_pages=node:0,size:1GB,count:4 reserved_huge_pages=node:1,size:1GB,count:4
[DEFAULT]
reserved_huge_pages=node:0,size:1GB,count:4
reserved_huge_pages=node:1,size:1GB,count:4
OpenStack Director でこれを実装する方法の詳細は、How to set reserved_huge_pages in /etc/nova/nova.conf in Red Hat OpenStack Platform 10 を参照してください。
このオプションは、Red Hat OpenStack Platform 10: OpenStack nova.conf - 設定オプションに記載されています。
Red Hat OpenStack Platform 11 では、OpenStack nova.conf の設定オプションについて記載しています。
/etc/nova/nova.conf でデバッグを有効にすると、openstack-nova-compute を再起動した後、ログに次の情報が表示されます。
第12章 perf を使用して OVS DPDK PMD CPU 使用率のトラブルシューティングを行い、トラブルシューティングデータを収集して送信します リンクのコピーリンクがクリップボードにコピーされました!
- 前提条件、このセクションの手順を使用して、トラブルシューティングツールをインストールします。
コンピュートノードに
perfをインストールします。yum install perf -y
yum install perf -yCopy to Clipboard Copied! Toggle word wrap Toggle overflow Open vSwitch デバッグ RPM をインストールします。
subscription-manager repos --enable=rhel-7-server-openstack-10-debug-rpms
subscription-manager repos --enable=rhel-7-server-openstack-10-debug-rpmsCopy to Clipboard Copied! Toggle word wrap Toggle overflow sysstat をインストールします (
pidstatコマンドに必要):yum install sysstat -y
yum install sysstat -yCopy to Clipboard Copied! Toggle word wrap Toggle overflow
12.1. 診断 リンクのコピーリンクがクリップボードにコピーされました!
このセクションの手順を使用して、データのトラブルシューティングと収集を行います。
12.1.1. PMD スレッド リンクのコピーリンクがクリップボードにコピーされました!
PMD スレッドの場所を決定します。
IFS=$'\n' ; for l in $(ps -T -p `pidof ovs-vswitchd` | grep pmd);do PID=`echo $l | awk '{print $2}'`; PMD=`echo $l | awk '{print $NF}'` ; PCPU=`taskset -c -p $PID | awk '{print $NF}'` ; echo "$PMD with PID $PID in on pCPU $PCPU"; doneIFS=$'\n' ; for l in $(ps -T -p `pidof ovs-vswitchd` | grep pmd);do PID=`echo $l | awk '{print $2}'`; PMD=`echo $l | awk '{print $NF}'` ; PCPU=`taskset -c -p $PID | awk '{print $NF}'` ; echo "$PMD with PID $PID in on pCPU $PCPU"; doneCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以下に例を示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 問題を再現しながら、perf レコードと perf レポートを実行し、出力を保存します。
スクリプト
gather_perf_data_a.shを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow スクリプトを実行します。
chmod +x gather_perf_data_a.sh ./gather_perf_data_a.sh
chmod +x gather_perf_data_a.sh ./gather_perf_data_a.shCopy to Clipboard Copied! Toggle word wrap Toggle overflow
レポートは、perf report -i ${archive_name} を使用して読み取ることができます。これが Red Hat サポートで開かれたケースの場合は、結果の tar アーカイブをケースに添付します。
12.1.2. 追加データ リンクのコピーリンクがクリップボードにコピーされました!
スクリプト
gather_perf_data_b.shを作成して、追加のデータを収集します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow スクリプトを実行します。
chmod +x gather_perf_data_b.sh ./gather_perf_data_b.sh
chmod +x gather_perf_data_b.sh ./gather_perf_data_b.shCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注記十分なディスク容量があることを確認してください。perf.data ファイルは、数ギガバイトのディスク領域を占める可能性があります。
これが Red Hat サポートチケットの場合は、結果の tar アーカイブをケースに添付します。
12.1.3. Open vSwitch ログ リンクのコピーリンクがクリップボードにコピーされました!
すべての Open vSwitch (OVS) ログを提供します。
/varに十分なディスク容量があることを確認してください。df -hを使用して/var の空きディスク容量を決定し、du -sh /var/log/openvswitchを使用して OVS ログの合計サイズを決定します。tar -cvzf /var/openvswitch_`hostname`_`date +"%F_%H%M%S"`.tar.gz /var/log/openvswitch
tar -cvzf /var/openvswitch_`hostname`_`date +"%F_%H%M%S"`.tar.gz /var/log/openvswitchCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
結果のファイル (例:
/var/openvswitch_overcloud-compute-0_2018-02-27_153713.tar.gz) を分析用のサポートケースに添付します。 sosreport を生成して提供します。
/varに十分なディスク容量があることを確認してください。df -hを使用して、/varの空きディスク容量を決定します。sosreport --batch --all-logs
sosreport --batch --all-logsCopy to Clipboard Copied! Toggle word wrap Toggle overflow
第13章 NFV を使用する仮想環境での virsh emulatorpin の使用 リンクのコピーリンクがクリップボードにコピーされました!
この手順を使用して、NFV を使用する Red Hat OpenStack Platform で virsh emulatorpin を使用した場合の影響を判断します。
13.1. 現象 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat OpenStack Platform {vernum} NFV 環境でパケット損失が発生し、エミュレータースレッドの固定が設定されていません。
Red Hat OpenStack Platform 10 では、エミュレータースレッドの固定に対するサポート例外が必要です。ただし、Red Hat では、ほぼすべての NFV ケースにおいて、エミュレータースレッドを固定することを強く推奨します。デフォルトのエミュレータースレッド設定を変更して、パフォーマンスを大幅に向上させることができます。Red Hat サポートでチケットを作成し、必要に応じてサポート例外をリクエストします。
13.2. 解決策 リンクのコピーリンクがクリップボードにコピーされました!
このセクションを使用して、エミュレーターのスレッドの固定を調査および設定します。
13.2.1. qemu-kvm エミュレータースレッド リンクのコピーリンクがクリップボードにコピーされました!
エミュレータースレッドは、仮想マシンのハードウェアエミュレーションの割り込み要求およびノンブロッキングプロセスを処理します。vCPU を実行していないスレッドは、qemu-kvm エミュレータースレッドです。以下の例を参照してください。
Linux CFS (完全に公平なスケジューラー) により、エミュレータースレッドは通常、libvirt のエミュレーターピンセットで定義されている範囲内で、ある pCPU から別の pCPU に定期的に移動します。
NFV コンテキストでは、isolcpus パラメーターを使用するときにエミュレータースレッドを設定すると、問題が発生する可能性があります。これは、このカーネル設定により、これらの CPU での CFS スケジューリングが無効になるためです。isolcpus parameter を使用していない場合、エミュレータースレッドがパケットを処理している CPU に割り込むと、パケット損失が発生する可能性があります。
エミュレータースレッドの例は次のとおりです。
- qemu-kvm スレッド
- vnc_worker スレッド
- vhost-<qemu-kvm PID> カーネルスレッド (virtio-net が使用されている場合 (ハイパーバイザー上のカーネルネットワーク))
13.2.2. エミュレータースレッドの固定化に関するデフォルトの動作 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、nova はすべての vCPU に割り当てられた pCPU にまたがるエミュレータースレッドピンセットを設定します。isolcpus パラメーターを使用していない場合、エミュレータースレッドは任意の pCPU でスケジュールでき、ある pCPU から別の pCPU に定期的に移動します。
したがって、これらの CPU はいずれも、qemu のエミュレータースレッドによってプリエンプションが実行され、パケットドロップのリスクがあります。
13.2.3. OpenStack nova(OpenStack Platform 10)におけるエミュレータースレッドの現在の実装 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat OpenStack Platforms 10 では、エミュレータースレッドを固定するための公式にサポートされている方法はありません。以下の例のように、virsh エミュレーターピン(…)--live を使用して、エミュレーター スレッドを pCPU セットに移動できます。
to pin emulator threads of instance instance-0000001d to CPU 34 to pin emulator threads of instance instance-0000001d to CPUs 32,34
# to pin emulator threads of instance instance-0000001d to CPU 34
virsh emulatorpin instance-0000001d 34 -live
# to pin emulator threads of instance instance-0000001d to CPUs 32,34
virsh emulatorpin instance-0000001d 32,34 --live
これらの変更は、インスタンスのランタイムのみに対して最後に変更されます。永続的な変更には、cron ジョブ、bash スクリプト、Ansible タスクなどの外部メカニズムが必要です。これは、サポート例外の件名である必要があります。
13.2.4. エミュレータースレッドのスケジューリングに対する isolcpus の影響 リンクのコピーリンクがクリップボードにコピーされました!
isolcpus を使用すると、CFS スケジューラーが無効になり、すべてのエミュレータースレッドが最初に使用可能な最もインデックスの少ない pCPU で実行されます。結果として、介入や追加の設定を行わないと、インスタンスの 1 つの vCPU が、エミュレータースレッドとのリソース競合のリスクが高くなります。
詳細は、Kernel.org Bugzilla – Bug 116701 を参照してください。
次のアルゴリズムを使用して、エミュレータースレッドが使用している vCPU を判別します。
PCPU=MIN([EMULATORPINSET]) VCPU=REVERSE_CPUSET(PCPU) REVERSE_CPUSET := SELECT pcpu from `virsh dumpxml <instance name> | grep "cpuset=$PCPU"`
PCPU=MIN([EMULATORPINSET])
VCPU=REVERSE_CPUSET(PCPU)
REVERSE_CPUSET := SELECT pcpu from `virsh dumpxml <instance name> | grep "cpuset=$PCPU"`
たとえば、この場合、すべてのエミュレータースレッドと子は、デフォルトのエミュレーターピンセットからアフィニティー 1〜3 を継承します。
isolcpus と組み合わせると、すべてのエミュレータースレッドと vhost- *スレッドが pCPU1 で実行され、再スケジュールされることはありません。
13.2.5. エミュレータースレッドの最適な位置 リンクのコピーリンクがクリップボードにコピーされました!
このセクションでは、エミュレータースレッドを次のネットワークに配置する方法について説明します。
- インスタンス内の DPDK ネットワーキングと Open vSwitch の netdev データパス
- インスタンス内の DPDK ネットワーキング、Open vSwitch のシステムデータパス、ハイパーバイザーのカーネルスペースネットワーキング
- Open vSwitch のインスタンス内カーネルネットワーキングと netdev データパス
13.2.5.1. Open vSwitch のインスタンスと netdev データパス内の DPDK ネットワーキングによるエミュレータースレッドの最適な配置 リンクのコピーリンクがクリップボードにコピーされました!
DPDK がインスタンス内で実行される場合、パケット処理は完全にユーザー空間で実行されます。PMD を vCPU0 で実行するようにスケジュールしないでください。これは、OS と割り込み処理のために残しておく必要があります。インスタンス内の PMD CPU はアクティブループを実行し、CPU の 100% を必要とするため、プリエンプトしないでください。これらの vCPU のいずれかがプリエンプトされると、パケット損失が発生する可能性があります。したがって、emulatorpin cpuset は、1 以上の番号が付けられた仮想 CPU を処理する物理 CPU とオーバーラップしないように設定する必要があります。
インスタンス内の DPDK ネットワーキングでは、エミュレータースレッドの最適な場所は、vCPU 0 を処理する pCPU か、仮想 CPU をまったく処理しない専用の物理 CPU のいずれかです。
OVS-DPDK がハイパーバイザーとインスタンス内の DPDK で使用されている場合は、エミュレータースレッドを vCPU0 に配置します。
13.2.5.2. Open vSwitch における DPDK ネットワーキングを用いたエミュレータースレッドのインスタンスおよびシステムデータパス内への最適配置 リンクのコピーリンクがクリップボードにコピーされました!
ハイパーバイザーでカーネルスペースネットワーキングが使用されている場合、ハイパーバイザーでのパケット処理はカーネル内で実行されます。
インスタンス内の DPDK ネットワーキングでは、エミュレータースレッドの最適な場所は、vCPU 0 を処理する pCPU か、仮想 CPU を処理しない専用の物理 CPU のいずれかです。
このシナリオでは、vNIC キューのパケット処理は、ハイパーバイザーの vhost-<qemu-kvm PID> カーネルスレッド内で実行されることに注意してください。トラフィックが多い場合、これらのカーネルスレッドはかなりの CPU 負荷を発生させる可能性があります。エミュレータースレッドの最適な場所は、ケースバイケースで決定する必要があります。
ps aux | grep vhost-
[root@overcloud-compute-0 ~]# ps aux | grep vhost-
root 364948 0.0 0.0 0 0 ? S 20:32 0:00 [vhost-364936]
root 364949 0.0 0.0 0 0 ? S 20:32 0:00 [vhost-364936]
root 364950 0.0 0.0 0 0 ? S 20:32 0:00 [vhost-364936]
13.2.5.3. Open vSwitch のインスタンスと netdev データパス内でのカーネルネットワーキングを利用したエミュレータースレッドの最適な配置 リンクのコピーリンクがクリップボードにコピーされました!
インスタンス内のカーネルネットワークでは、2 つのオプションがあります。
- インスタンス内の softirqs など、割り込み分散を最適化します。このような場合、エミュレータースレッドに追加の pCPU を割り当てる必要はなく、ネットワーク割り込みを処理していない pCPU にエミュレータースレッドを割り当てることができます。
- エミュレータースレッド用に同じ NUMA ノードで専用の pCPU を使用します。
最初のオプションは複雑であるため、2 番目のオプションをお勧めします。
13.3. 診断 リンクのコピーリンクがクリップボードにコピーされました!
13.3.1. デモンストレーション環境 リンクのコピーリンクがクリップボードにコピーされました!
デモンストレーション環境は、instance-0000001d という 1 つのインスタンスを実行します。関連する qemu-kvm スレッドの PID は次のとおりです。
pidof qemu-kvm
[root@overcloud-compute-0 ~]# pidof qemu-kvm
73517
13.3.2. Emulatorpin のしくみ リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、Red Hat OpenStack Platform デプロイメントは以下の設定を使用します。
これにより、qemu-kvm、vnc_worker などのエミュレータースレッドの割り当てが予測できなくなります。
エミュレータースレッドは、virsh emulatorpin を使用して移動できます。
virsh emulatorpin instance-0000001d 34
virsh emulatorpin instance-0000001d 34
CPU 以外のすべてのスレッドのアフィニティーが変更されることに注意してください。
/proc/sched_debug の履歴データ内のスイッチの数に注意してください。次の例では、PID 73517 はすでに cpu#34 に移動しています。他のエミュレーターワーカーは最後の出力以降実行されなかったため、cpu#10 に引き続き表示されます。
スレッド 73517 が CPU#34 に移動する方法に注意してください。ここで VNC セッションを操作すると、/proc/sched_debug が cpu#34 の vnc_worker スレッドも表示していることがわかります。