第 5 章 使用 Open vSwitch DPDK 的 Instance VHU 接口上 TX Drops
使用此流程对实例 vhost-user(VHU)接口传输的丢弃进行故障排除。
5.1. 症状 复制链接链接已复制到粘贴板!
数据包通过 virtio 传输从 vswitch 传输到客户机,而不通过内核或 qemu 进程。这可以通过使用 VHU 接口交换数据包来完成。
VHU 主要由 DPDK librte_vhost 实施,其也提供要发送或接收数据包批量的功能。VHU 的后端是由 qemu 提供的 virtio 环形,用于与虚拟机交换数据包。virtio ring 具有特殊的格式,它由描述符和缓冲区组成。
TX/RX(transmit/receive)统计用于 OpenvSwitch(OVS)。这意味着传输统计与接收虚拟机的统计数据直接相关。
如果虚拟机没有足够快地处理数据包,OVS TX 队列溢出,并丢弃数据包。
5.1.1. Packet Drops 的说明 复制链接链接已复制到粘贴板!
饱和 virtio 环会导致 TX 丢弃 vhost-user 设备。virtio ring 位于客户机的内存中,它与 vhost-user 推送数据包并消耗它们的队列一样。如果虚拟机无法足够快地使用数据包,virtio 环会从缓冲和 vhost-user 丢弃数据包中运行。
使用 Perf 和 Ftrace 工具对数据包丢弃进行故障排除。
- 使用 Perf 计算调度程序切换的数量,这可能会显示 qemu 线程是否被抢占。
- 使用 Ftrace 显示抢占的原因以及其所需的时间。
抢占原因包括:
时间中断(内核循环):
这些添加至少两个上下文切换的成本。计时器中断也可以运行 read-copy update(RCU)回调,这些回调可能会花费无法预计的时间。
- CPU 电源管理和超线程
您可以在以下软件包中找到这些工具:
-
PERF:
在 rhel-7-server-rpms/7Server/x86_64 中 perf rpm。如需更多信息,请参阅关于 Perf -
Fhandler:
trace-cmd info rhel-7-server-rpms/7Server/x86_64.如需更多信息,请参阅关于 Ftrace
5.1.2. 其他丢弃的说明 复制链接链接已复制到粘贴板!
在 OVS 2.9 之前,vHost 用户端口是在 dpdkvhostuser 模式中创建的。在这种模式中,OVS 充当 vhost 服务器,QEMU 充当客户端。当实例停机或重启时,OVS 网桥上的 vhost 用户端口仍然活跃,丢弃目的地为虚拟机的数据包。这会增加 tx_drop_counter :
在以下示例中,虚拟机被 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 设置 dev <br 内部端口名称> down 和 用户空间中丢弃 帧时,这个情况类似。
当虚拟机启动时,它会连接到同一 vhu socket,并将开始清空 virtio 环缓冲。TX 不再中断,正常的网络流量恢复。
5.1.3. 为 DPDK 增加 TX 和 RX 队列长度 复制链接链接已复制到粘贴板!
您可以使用以下 OpenStack director 模板修改来更改 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 字节。