第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 バイトをサポートしていることを確認する必要があります。