OVS-DPDK 最终用户故障排除指南
包含 OVS-DPDK 端到端故障排除步骤的指南
摘要
前言 复制链接链接已复制到粘贴板!
本文档包含 OVS-DPDK 系统管理员的步骤,用于识别和解决与 Red Hat OpenStack Platform 10 中数据包丢失相关的问题。本指南中记录的步骤会取代之前发布的知识库文章。
第 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,并且每个主机的状态为 up State。如果有任何问题,请查看 /var/log/nova 中的日志以确定问题。
2.2. 确认计算节点 OVS 配置 复制链接链接已复制到粘贴板!
要验证网络适配器和 OpenvSwitch 的配置和健康状况,请完成以下步骤。
要在计算节点上验证 DPDK 网络设备,请安装 dpdk 工具。运行以下命令。该 rpm 在 repo 中找到:
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 和巨页。有关更多信息,请参阅: 为 OVS-DPDK 创建类别和部署实例。
要确认实例配置,请完成以下步骤:
确认实例已固定 CPU。可以使用 virsh 识别专用 CPU:
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 开始,您可以按照类别设置模拟器。请参阅使用 Red Hat OpenStack Platform 12 配置仿真程序线程策略。
对于较旧版本,必须在实例开机时手动完成仿真程序线程固定。请参阅关于在带有 NFV 的虚拟环境中使用 virsh 模拟器固定的影响(以及没有 isolcpus)以及优化仿真程序线程固定。
确认实例正在使用巨页,这是最佳性能所必需的。
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 中添加。此命令执行新的 PMD 队列分配,以便根据最新的 rxq 处理周期信息在 PMD 之间平等平衡。pmd-stats-show命令显示自 PMDs 运行或上次清除统计以来的完整历史记录。如果没有清除它,在设置端口前,它将融入到统计中,数据会被流处理。如果用于查看数据路径上的负载(通常是这样),那么将无用。最好将系统置于稳定状态,清除 stats,等待几秒钟,然后显示统计信息。这可让您准确显示 datapath。
使用以下命令来显示 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 repo 中的 openvswitch-test RPM。
对于性能问题,不建议在生产环境中使用 ovs-tcpdump。如需更多信息,请参阅: 如何在 Red Hat OpenStack Platform 中对 vhost-user 接口使用 ovs-tcpdump?
2.5. 简单 Compute 节点 CPU 分区和文件系统检查 复制链接链接已复制到粘贴板!
先决条件
在部署的计算节点上运行此命令,并记下 cpu masks 如何映射到 TripleO Heat 模板值:
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 Templates 中的HostCpusList。 -
DPDK-socket-mem映射到 TripleO Heat Templates 中的NeutronDpdkSocketMemory。 TripleO Heat Templates 中
PMD-cpu-mask映射到NeutronDpdkCoreList。要将这些 CPU 掩码转换为十进制值,可以将其协调回 TripleO Heat 模板和实际系统值 see: 如何将十六进制 CPU 掩码转换为位掩码并识别掩码的 CPU?
2.5.1. 检测 CPU 复制链接链接已复制到粘贴板!
要检测 CPU for pid 1,请使用以下命令。这些内核不应运行 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 parameters HostCpusList 或 HostIsolatedCoreslist 的值重叠:
2.5.3. 检测 NUMA 节点 复制链接链接已复制到粘贴板!
为了获得最佳性能,请确保实例的物理网络适配器、PMD 线程和固定 CPU 都在同一个 NUMA 节点上。如需更多信息,请参阅: CPU 和 NUMA 节点。
以下是检查 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 检查为该端口提供服务并记录 NUMA 节点的 PMD 线程:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 查找实例的物理固定 cpu。例如,注意此实例的端口位于 cpu 2 上,并且实例由 cpus 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
另外,您可以通过查询 PCI 地址(即使由 OVS DPDK 管理的)来查看网络适配器的 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. Detectng Isolated 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. Detectng CPU Dedicated 到 Nova 实例 复制链接链接已复制到粘贴板!
使用以下命令,显示专用于 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 Pages 配置 复制链接链接已复制到粘贴板!
检查计算节点上的巨页配置。
如果没有配置巨页,请参阅 ComputeKernelArgs。
2.6. Packet Drops 原因 复制链接链接已复制到粘贴板!
当队列已满时,数据包会被丢弃,通常是当队列没有足够快时,数据包被丢弃。瓶颈是当队列没有足够快排空时,应该排空队列的实体。在大多数情况下,使用 drop 计数器来跟踪丢弃的数据包。有时,硬件或软件设计中的一个错误可能会导致数据包跳过丢弃计数器。
Data Plan Development Kit(DPDK)包括用于转发数据包的 testpmd 应用。在本章中显示的情况下,testpmd 安装在虚拟机上,并轮询带有分配的逻辑内核(lcore)的端口,以将数据包从一个端口转发到另一个端口。testpmd 常与流量生成器一起使用,在本例中为物理虚拟物理(PVP)路径中的吞吐量。
2.6.1. OVS-DPDK Too Slow to Drain physical NIC 复制链接链接已复制到粘贴板!
本例显示 PMD 线程负责轮询物理网络适配器(dpdk0)的接收(RX)队列。当 PMD 线程无法跟上数据包卷或中断时,数据包可能会被丢弃。
图 2.1. 轮询物理适配器 RX 队列
以下命令显示 dpdk0 界面中的统计信息。如果数据包被丢弃,因为 ovs-dpdk 没有快排空物理适配器,您会看到 rx_dropped 的速度会快速增长。
PMD 应该为每个 NUMA 节点有一个以上物理 CPU 内核。
2.6.2. VM Too Slow to Drain vhost-user 复制链接链接已复制到粘贴板!
此示例与 图 2.1 中的示例类似,如果 lcore 线程超过发送到实例接收(RX)队列的数据包卷,则可能会遇到数据包丢失。
如需更多信息,请参阅以下文章:
图 2.2. 轮询虚拟适配器 RX 队列
要检查主机的 tx_dropped 值是否与虚拟机的 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 Too Slow to Drain vhost-user 复制链接链接已复制到粘贴板!
在本例中,MonyD 线程是从主机角度轮询 virtio TX 的接收队列。如果 PMD 线程被数据包卷超过,或者中断,数据包可能会丢弃。
图 2.3. 轮询虚拟适配器 TX 队列
跟踪来自虚拟机的数据包的返回路径,并提供主机上的丢弃计数器(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. Egress 物理接口上的数据包丢失 复制链接链接已复制到粘贴板!
PCIe 和 RAM 之间的慢速传输速率可能会导致物理适配器从 TX 队列丢弃数据包。虽然这不经常存在,但是了解如何识别和解决这个问题非常重要。
图 2.4. 轮询物理适配器 TX 队列
以下命令显示 dpdk1 界面中的统计信息。如果 tx_dropped 大于零且快速增长,则创建一个红帽支持问题单。
如果您看到这些类型的数据包丢失,请考虑重新配置内存频道。
- 要计算内存频道,请参阅: 网络功能虚拟化规划和聚合指南 中的内存参数。https://access.redhat.com/documentation/en-us/red_hat_openstack_platform/13/html-single/network_functions_virtualization_planning_and_configuration_guide/#c_ovsdpdk-memory-params
- 要确定内存频道的数量,请参阅: 如何确定 Red Hat OpenStack Platform 中的 NeutronDpdkMemoryChannels 或 OvsDpdkMemoryChannels 的内存频道数。
第 3 章 NFV 命令备忘单 复制链接链接已复制到粘贴板!
本章包含许多 Red Hat OpenStack Platform 10 系统可观察性最常用的命令。
默认情况下,下面的某些命令可能不可用。要为给定节点安装所需工具,请运行以下命令:
sudo yum install tuna qemu-kvm-tools perf kernel-tools dmidecode
3.1. UNIX 套接字 复制链接链接已复制到粘贴板!
使用这些命令显示进程端口和 UNIX 套接字域。
| 操作 | 命令 |
|---|---|
| 显示所有状态(LISTEN、Win6、CLOSE_WAIT 等等)的所有 TCP 和 UDP SOCKETS | # lsof -ni |
| 显示所有状态(LISTEN、Win6、CLOSE_WAIT 等等)的所有 TCP SOCKETS | # lsof -nit |
| 显示所有状态(LISTEN、Win6、CLOSE_WAIT 等等)的所有 UDP SOCKETS | # lsof -niu |
| 显示所有状态(LISTEN、Win6、CLOSE_WAIT 等)且没有主机名查找 IPv4 的所有 TCP 和 UDP SOCKETS | # lsof -ni4 |
| 显示所有状态(LISTEN、Win6、CLOSE_WAIT 等)且没有主机名查找 IPv6 的所有 TCP 和 UDP SOCKETS | # lsof -ni6 |
| 显示所有相关的 SOCKETS(LISTEN、Win6、CLOSE_WAIT 等),但不为给定端口进行主机名查找 | # lsof -ni :4789 |
| 在没有主机名查找的情况下显示 LISTEN 状态下的所有 SOCKETS | # ss -ln |
| 显示在 LISTEN 状态下对 IPv4 进行主机名查找的所有 SOCKETS | # ss -ln4 |
| 显示所有位于 LISTEN 状态下 IPv6 的 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 命名空间 | # 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 |
| 显示给定网络接口的 default、启用和禁用的硬件卸载 | # 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 |
| 显示快速重要的网络设备信息(Interface name、MAC、NUMA、PCIe 插槽、固件、内核驱动程序) | # biosdevname -d |
| 显示内核内部丢弃计数器。如需更多信息,请参阅: 监控网络数据处理。 | # cat /proc/net/softnet_stat |
3.3. OVS 复制链接链接已复制到粘贴板!
使用这些命令显示 Open vSwitch 相关信息。
| 操作 | 命令 |
|---|---|
| OVS DPDK 人类可读的统计 | 请参阅 Open vSwitch DPDK 统计。 |
| 显示 OVS 基本信息(version、dpdk enabled、PMD 内核、Lcore、ODL 网桥映射、平衡、自动平衡等) | # OVS-vsctl list Open_vSwitch |
| 显示 OVS 全局切换视图 | # OVS-vsctl show |
| 显示 OVS 所有详细的接口 | # OVS-vsctl list interface |
| 显示一个接口的 OVS 详情(链接速度、MAC、状态、统计等) | # ovs-vsctl list interface dpdk0 |
| 显示给定接口的 OVS 计数器 | # ovs-vsctl get interface dpdk0 statistics |
| 显示 OVS 所有详细端口 | # OVS-vsctl list port |
| 显示一个端口的 OVS 详情(链接速度、MAC、状态、统计等) | # OVS-vsctl list port vhu3gf0442-00 |
| 显示一个网桥的 OVS 详情(数据路径类型、多播侦听、停止工作等) | # OVS-vsctl list bridge br-int |
| 显示 OVS 日志状态 | # ovs-appctl vlog/list |
| 将所有 OVS 日志更改为 debug | # ovs-appctl vlog/set dbg |
| 将一个特定的 OVS 子系统更改为文件日志输出的调试模式 | # OVS-appctl vlog/set file:backtrace:dbg |
| 禁用所有 OVS 日志 | # ovs-appctl vlog/set off |
| 将所有 OVS 子系统更改为仅对文件日志输出进行调试 | # OVS-appctl vlog/set file:dbg |
| 显示所有 OVS advanced 命令 | # 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 '\-\-'" |
| 显示给定端口的 OVS mempool 信息 | # ovs-appctl netdev-dpdk/get-mempool-info dpdk0 |
| 显示 PMD 性能统计 | # ovs-appctl dpif-netdev/pmd-stats-show |
| 以一致的方式显示 PMD 性能统计 | # OVS-appctl dpif-netdev/pmd-stats-clear && ovs-appctl dpif-grafana/pmd-stats-show |
| 显示 DPDK 接口统计数据人类可读的 | # OVS-vsctl get interface dpdk0 statistics|sed -e "s/,/\n/g" -e "s/[\",\}, ]//g" -e "s/=/ =0286 /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 Address 表过期时间(默认 300s) | # OVS-vsctl set bridge br-provider other_config:mac-aging-time=900 |
| 设置 OVS vSwitch MAC Address 表大小(默认 2048s) | # 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 |
| 显示给定网桥中的 OVS OpenFlow 规则 | # 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 |
| 要下载 OVS tcpdump | # curl -O -L ovs-tcpdump.in |
| 从 DPDK 接口执行数据包捕获 | # OVS-tcpdump.py --db-sock unix:/var/run/openvswitch/db.sock -i <bond/vhu> <tcpdump 标准参数,如 -v -n -e -w <path/to/file> |
| (OVS 2.10+)详细的 PMD 性能统计 | # ovs-appctl dpif-netdev/pmd-perf-show |
3.4. IRQ 复制链接链接已复制到粘贴板!
使用这些命令显示中断请求行(IRQ)软件和硬件中断。
| 操作 | 命令 |
|---|---|
| 显示 ksoftirqd worker 执行的每个 CPU 的 SoftIRQ 平衡 | # cat /proc/softirqs | less -S |
| 显示 ksoftirqd worker 每 CPU 每秒执行的 SoftIRQ 平衡 | # watch -n1 -d -t "cat /proc/softirqs" |
| 显示每个 CPU 的硬件和软件中断(NMI、LOC、TLB、RSE、PII、PIW)平衡 | # cat /proc/interrupts | less -S |
| 显示每个 CPU 的硬件和软件中断(NMI、LOC、TLB、RSE、PII、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(CPUMask)的 IRQ 关联性 | # cat /proc/irq/89/smp_affinity |
| 显示给定 IRQ(DEC)的 IRQ 关联性 | # cat /proc/irq/89/smp_affinity_list |
| 为给定的 IRQ(CPUMask)设置 IRQ 关联性 | # 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 关联性(支持 rage,例如 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 |
| 显示 SoftIRQ CPU 使用率分布 | # mpstat -I SCPU | less -S |
| 显示给定 CPU 的 SoftIRQ CPU 使用率分布 | # mpstat -I SCPU -P 4 | less -S |
3.5. Process 复制链接链接已复制到粘贴板!
使用这些命令显示 Linux 中的进程和线程、进程调度程序和 CPU 关联性。
| 操作 | 命令 |
|---|---|
| 显示给定进程名称分布 CPU 用量和 CPU 关联性,包括所有进程线程 | # pidstat -p $(pidof qemu-kvm) -t |
| 显示给定进程名称分布 CPU 用量和 CPU 关联性,包括所有进程线程(共 10 秒)的 30 迭代 | # 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 RealTime(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 wakeup、上下文切换、计时器、Halt Pool、vIRQ) | # kvm_stat |
| 显示深度 KVM 管理程序统计信息 | # kvm_stat --once |
| 显示给定客户机的实时 KVM 管理程序统计信息(VMExit、VMEntry、vCPU wakeup、上下文切换、计时器、Halt Pool、vIRQ) | # kvm_stat --guest=<VM name> |
| 显示给定虚拟机的深度 KVM 管理程序统计信息 | # kvm_stat --once --guest=<VM name> |
| 显示 KVM 分析捕获统计 | # perf kvm stat live |
| 显示 KVM 分析统计 | # perf kvm top |
| 显示给定虚拟机的 vCPU 固定 | # virsh vcpupin <Domain name/ID> |
| 显示给定虚拟机的 QEMU 模拟器 Thread | # virsh emulatorpin <Domain name/ID> |
| 显示给定虚拟机的 NUMA 固定 | # virsh numatune <Domain name/ID> |
| 显示给定虚拟机的内存统计信息 | # virsh dommemstat <Domain name/ID> |
| 显示给定虚拟机的 vCPU 统计信息 | # virsh nodecpustats <Domain name/ID> |
| 显示给定虚拟机的所有 vNIC | # virsh domiflist <Domain name/ID> |
| 显示给定虚拟机的 vNIC 统计信息(不使用 DPDK VHU) | # virsh domifstat <Domain name/ID> <vNIC> |
| 显示给定虚拟机的所有 vDisk | # virsh domblklist <Domain name/ID> |
| 显示给定虚拟机的 vDisk 统计信息 | # virsh domblkstat <Domain name/ID> <vDisk> |
| 显示给定虚拟机的所有统计 | # 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 迭代显示给定 CPU 的详细 CPU 使用分布时间(10 秒) | # 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" |
| 显示所有 CPU 的详细频率和 CPU % C-States 统计信息,包括 SMI(对于 RT 很有用) | # turbostat --interval 1 |
| 显示给定 CPU 的更多详细信息和 CPU % C-States 统计信息,包括 SMI(对于 RT 很有用) | # turbostat --interval 1 --cpu 4 |
| 显示 CPU 详情和 ISA 支持 | # lscpu |
| 具体用于 Intel CPU: 显示 CPU 使用率、CPU IPC、CPU Execution(%)、L3 和 L2 Cache Hit、Miss、Miss、Miss、Temperature、内存频道使用和 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 节点数>/numastat |
| 显示为什么 NUMA 节点和 PCI 设备的 NUMA 拓扑 | # lstopo --physical |
| 使用相关设备生成物理 NUMA 拓扑的图形(svg 格式) | # lstopo --physical --output-format svg > topology.svg |
3.9. 内存 复制链接链接已复制到粘贴板!
使用这些命令显示内存统计信息、巨页、DPC、物理 DIMM 和频率。
| 操作 | 命令 |
|---|---|
| 显示 meminfo,如系统范围内存用量 | # numastat -m |
| 显示虚拟内存、I/O 和 CPU 统计信息 | # vmstat 1 |
| 显示全局内存信息 | # cat /proc/meminfo |
| 显示给定 NUMA 节点的 2MB 巨页总数 | # /sys/devices/system/node/node<NUMA node number>/hugepages/hugepages-2048kB/nr_hugepages |
| 显示给定 NUMA 节点的 1GB 巨页总数 | # /sys/devices/system/node/node<NUMA node number>/hugepages/hugepages-1048576kB/nr_hugepages |
| 显示给定 NUMA 节点的总可用 2MB 巨页 | # /sys/devices/system/node/node<NUMA node number>/hugepages/hugepages-2048kB/free_hugepages |
| 显示给定 NUMA 节点的总可用 1GB 巨页 | # /sys/devices/system/node/node<NUMA node number>/hugepages/hugepages-1048576kB/free_hugepages |
| 实时分配 100x 2MB 巨页到 NUMA0(可以更改 NUMA 节点) | # echo 100 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages |
| 实时分配 100x 1GB 巨页到 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 viewer |
| 显示已安装的内存 DIMM Speed | # dmidecode -t memory | grep Speed |
3.10. PCI 复制链接链接已复制到粘贴板!
使用这些命令显示 PCI 统计信息、PCI 详细信息和 PCI 驱动程序覆盖。
| 操作 | 命令 |
|---|---|
| 显示系统中详细的 PCI 设备信息 | # lspci -vvvnn |
| 显示 PCI 树视图 | # lspci -vnnt |
| 显示 PCI 设备 NUMA 信息 | # lspci -vmm |
| 显示给定设备的最大链接速度 | # 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 配置集、验证和日志。
| 操作 | 命令 |
|---|---|
| 显示 tuned 当前启用的配置集和描述 | # tuned-adm profile_info |
| 显示 tuned 可用配置集和当前启用的配置集 | # tuned-adm list |
| 启用特定的 tuned 配置集 | # tuned-adm profile realtime-virtual-host |
| 验证当前启用的配置集 | # tuned-adm verify |
| tuned 的日志 | # less /var/log/tuned/tuned.log |
3.12. 分析过程 复制链接链接已复制到粘贴板!
使用这些命令显示 CPU 分析、进程性能分析和 KVM 分析。
| 节 | 操作 | 命令 |
|---|---|---|
| Process | 特定 PID 的性能分析 | # perf record -F 99 -p PID |
| Process | 对具体 PID 进行性能分析(30 秒) | # 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)>10.10.10.2-sleepsleep 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 | 为特定 CPU 核心列表进行性能分析,以 5 秒查找缓存效率 | # perf stat -C <CPU Core(s)> -B -e cache-references,cache-misses,cycles,instructions,branches,faults,migrations sleep 5 |
| Report | 分析 perf 分析 | # perf report |
| Report | 在 stdout 中报告 perf 分析 | # perf report --stdio |
| Report | 在 stdout 中报告 KVM 分析 | # perf kvm stat 报告 |
3.13. 块 I/O 复制链接链接已复制到粘贴板!
使用这些命令显示存储 I/O 分发和 I/O 分析。
| 操作 | 命令 |
|---|---|
| 显示所有系统设备的 I/O 详情 | # iostat |
| 显示所有系统设备的高级 I/O 详情 | # iostat -x |
| 显示所有系统设备的高级 I/O 详情,每 10 秒显示 30 次迭代 | # 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. Real Time 复制链接链接已复制到粘贴板!
使用这些命令显示 Real Time 测试相关、SMI 和延迟。
| 操作 | 命令 |
|---|---|
| 识别是否存在任何 SMI 是否阻止普通 RT 内核执行,以推断定义的阈值。 | # hwlatdetect --duration=3600 --threshold=25 |
| 使用很多附加选项验证给定时间的最大调度延迟:
| # cyclictest --duration=3600 \ --mlockall \ --priority=99 \ --nanosleep \ --interval=200 \ --histogram=5000 \ --histfile=./output \ --threads \ --numa \ --notrace |
3.15. 安全性 复制链接链接已复制到粘贴板!
使用这些命令验证执行和 GRUB 引导参数。
| 操作 | 命令 |
|---|---|
| 检查所有当前的 Speculative 执行安全状态 | |
| GRUB 参数禁用所有 Speculative Execution 补救 | 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 变体 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 Kernel space human 可读取统计 | 请参阅: 显示 Contrail vRouter 统计信息。 |
| vRouter DPDK 人类可读的统计 | 请参阅: 显示 Contrail vRouter 统计信息。 |
| 要从 DPDK 接口执行数据包捕获(不要在 vifdump 之后使用 grep) | # vifdump vif0/234 <tcpdump 标准参数,如 -v -nn -e -w <path/to/file>> |
| 显示所有 vRouter 接口和子接口统计和详情 | # VIF --list |
| 显示给定接口的 vRouter 统计和详情 | # vif --list --get 234 |
| 显示所有接口和子接口的 vRouter packer 速率 | # VIF --list --rate |
| 显示给定接口的 vRouter packer 速率 | # 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 路由表(您可以从 vif --list 中找到 VRF 号) | # rt --dump 0 |
| 显示给定 VRF 的 vRouter IPv4 路由表(您可以从 vif --list 中找到 VRF 号) | # rt --dump 0 --family inet |
| 显示给定 VRF 的 vRouter IPv6 路由表(您可以从 vif --list 中找到 VRF 号) | # rt --dump 0 --family inet6 |
| 显示给定 VRF 的 vRouter 转发表(您可以从 vif --list 中找到 VRF 号) | # 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 nexthop(可以通过 mpls --dump 输出找到) | # nh --get 21 |
| 显示所有 vRouter nexthops | # nh --list |
| 显示所有 vRouter VXLAN VNID | # VXLAN --dump |
| 显示 vRouter 代理(supervisor、xmmp connection、vrouter 代理等)状态 | # contrail-status |
| 重启 vRouter(以及所有 Contrail 本地计算节点组件) | # systemctl restart supervisor-vrouter |
3.17. OpenStack 复制链接链接已复制到粘贴板!
使用这些 OpenStack 命令显示虚拟机计算节点。
| 操作 | 命令 |
|---|---|
| 显示根据计算节点排序的计算节点上所有虚拟机的列表 | $ Nova list --fields name,OS-EXT-SRV-ATTR:host --sort host |
| 显示按照虚拟机名称排序的计算节点上所有虚拟机的列表 | $ Nova list --fields name,OS-EXT-SRV-ATTR:host |
第 4 章 实例 Tap 接口的 TX 队列中的高数据包丢失 复制链接链接已复制到粘贴板!
使用这个部分对 TX 队列中的数据包丢失进行故障排除。
4.1. 症状 复制链接链接已复制到粘贴板!
在使用仅主机联网的虚拟功能(VNF)测试过程中,可以在实例的 tap 接口的 TX 队列中观察高数据包丢失。测试设置会将一个节点上的一个虚拟机的数据包发送到同一节点上的另一虚拟机。数据包丢失。
以下示例显示了 tap 的 TX 队列中丢弃的大量数据包。
4.2. 诊断 复制链接链接已复制到粘贴板!
本节检查数据包丢弃(内核路径)接口。有关用户数据路径中的 vhost 用户界面中的数据包丢弃,请参考 https://access.redhat.com/solutions/3381011
TX 丢弃是因为实例 vCPU 和虚拟机监控程序上其他进程之间的干扰而造成的。tap 接口的 TX 队列是一个缓冲区,可以在实例无法获取数据包时存储简短的数据包。如果实例的 CPU 阻止运行(或冻结)长时间,会出现这种情况。
TUN/TAP 设备是一个虚拟设备,一个末尾是一个内核网络接口,另一个端是用户空间文件描述符。
TUN/TAP 接口可在两种模式下运行:
- TAP 模式使用 L2 标头将 L2 以太网帧馈送到设备中,并期望从用户空间接收相同的数据。这个模式用于虚拟机。
- tun 模式使用 L3 标头将 L3 IP 数据包馈到该设备中,并期望从用户空间接收相同的数据包。这个模式主要用于 VPN 客户端。
在 KVM 网络中,用户空间文件描述符归 qemu-kvm 进程所有。发送到 tap 的帧(从 hypervisor 的视角到TX),最终在 qemu-kvm 内作为 L2 帧,然后将这些帧作为收到到虚拟网络接口的网络数据包(从虚拟机的视角来看)将那些帧发送到虚拟机中的虚拟网络设备。
使用 TUN/TAP 的重要概念是管理程序中的传输方向是虚拟机的接收方向。相反方向也是如此;从虚拟机传输虚拟机监控程序的接收是相同的。
virtio-net 设备上没有数据包的"ring buffer"。这意味着,如果 TUN/TAP 设备的 TX 队列被填满,因为虚拟机未接收(足够快或根本),那么新数据包都没有什么位置,并且虚拟机监控程序看到利用的 TX 丢失。
如果您注意到 TUN/TAP 上的 TX 丢失,增加 tap txqueuelen 以避免,类似增加 RX 环缓冲,以停止物理 NIC 丢失。
但是,假设虚拟机在接收中只是"slow"和"bursty"。如果虚拟机没有足够快,或者根本没有收到接收,则调整 TX 队列长度不会帮助。您必须发现为什么虚拟机没有运行或接收。
如果唯一需要提高虚拟机数据包处理性能,请完成以下步骤:
-
在管理程序上启用
virtio-net 多队列。 - 在虚拟机中的不同内核上平衡这些多个虚拟设备中断。
这记录在 KVM 的 libvirt 域规格中,并可在 RHEL KVM 管理程序上通过 virsh edit 进行。
如果您无法在 Red Hat OpenStack Platform 中配置 virtio-net multiqueue,请考虑在虚拟机中配置 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 上生成额外负载。请注意,这是用于演示目的。您可以在虚拟机内重复相同的测试,且无需加载。仅在虚拟机监控程序上的另一个进程从实例的 vCPU 传输时间时进行 TX 丢弃。
以下示例显示了测试前的一个实例:
运行以下脚本,并观察 TX 队列中丢弃的软件包。仅当 dd 进程从实例的 CPU 占用大量处理时间时,才会发生这些情况。
以下示例显示了测试过程中 dd 对虚拟机监控程序的影响。st 标签标识虚拟机监控程序中被攻击的时间百分比。
请注意,ssh 可在实例上进行第二一半测试时变得缓慢,包括如果测试用时过长,可能会超时。
4.3. 解决方案 复制链接链接已复制到粘贴板!
增加 TX 队列有助于缓解这些小冻结,对 CPU 固定完全隔离,内核参数中的 isolcpus 是最佳解决方案。更加信息,请参阅在 OpenStack 中配置 CPU 固定与 OpenStack 中的 NUMA 固定。
第 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 字节。
5.2. 诊断 复制链接链接已复制到粘贴板!
当客户机无法接收数据包时,可以看到 TX 丢弃到 vhost 用户端口。TCP 旨在恢复数据包丢失,这在普通网络条件中发生。NFVI 具有严格的要求,但对数据包丢弃的容错较少。
使用 DPDK 加速的 OVS,因为内核数据路径太慢。另外,部署启用了 DPDK 的客户机(可匹配主机的数据包处理速度)非常重要。
5.3. 解决方案 复制链接链接已复制到粘贴板!
确保分配给虚拟机的 vCPU 只处理客户机的任务。
检查集群是否使用 heat 以下模板参数进行了部署:
-
IsolcpusList: 从调度中删除 CPU -
NovaVcpuPinSet:为固定分配 CPU -
NovaComputeCpuSharedSet: 为仿真程序线程固定分配 CPU
-
例如:
- 确保虚拟机已部署了利用固定 CPU 和仿真器池集的类别。
例如:
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>
- 确保这些设置按预期运行。如需更多信息,请参阅 简单 Compute 节点 CPU 分区和文件系统检查。
如果您将完全专用 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%)
在本例中,错误表示 DPDK 数据路径中未分类的数据包('emc' 或 'dp' 类器)。在正常情况下,它们将发送到 a proto 层。在个别情况下,由于流重新验证锁定,或者 a proto 层返回错误,数据包会被丢弃。在这种情况下,丢失 的值也会递增,以指示丢失。
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 数据路径分类器。
6.3. 解决方案 复制链接链接已复制到粘贴板!
本节演示了使用 ovs-appctl 命令查看流量流的步骤。
6.3.1. idle PMD 复制链接链接已复制到粘贴板!
以下示例显示了一个系统,其中 core_ids 为 dpdk0 固定为 dpdk0,它只会管理通过 dpdk0 的流量流:
6.3.2. 带有数据包丢弃的 load 测试中的 PMD 复制链接链接已复制到粘贴板!
以下示例显示了一个系统,其中 core_ids 为 dpdk0 固定为 dpdk0,其负载测试流通过 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. pmD 在 loadtest 下具有 50% 的 mpps 容量 复制链接链接已复制到粘贴板!
以下示例显示了一个系统,其中 core_ids 为 dpdk0 固定于 dpdk0 的 PMD,其负载测试流过 dpdk0,发送 6.4 Mpps(大约大约 12.85 Mpps):
当 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. hit vs miss vs lost 复制链接链接已复制到粘贴板!
以下示例显示了有关主题的 man page:
其中一些文档指的是内核数据路径,因此当它指出 用户空间处理时,意味着数据包不会被归类为内核 proto 层。
sw 缓存中(等同于 emc 和 dpcls)并将其发送到用户空间中的
第 7 章 在 nova 中附加和分离 SR-IOV 端口 复制链接链接已复制到粘贴板!
使用以下部分附加和分离 SR-IOV 端口。
7.1. 症状 复制链接链接已复制到粘贴板!
您无法在 Red Hat OpenStack Platform 10 及之后的版本中的 nova 中附加或分离 SR-IOV 端口。Nova 日志报告 VIF 类型 hw_veb 尚未转换。
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 DPDK 配置和测试 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)和 enslave 接口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
有关更改绑定模式的详情,请参考: 如何在不重启系统的情况下更改绑定模式?
8.3. 为 LACP 配置 OVS DPDK 绑定 复制链接链接已复制到粘贴板!
下一目标是在 OVS DPDK 中配置 LACP 绑定。
8.3.1. 准备 Open vSwitch 复制链接链接已复制到粘贴板!
确定在 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 Bond 复制链接链接已复制到粘贴板!
添加绑定:
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。
使用上述模板更改部署或重新部署 overcloud。完成后,在 overcloud 节点上执行以下步骤。
验证 os-net-config 配置:
验证绑定:
10.1. 症状 复制链接链接已复制到粘贴板!
您收到 ovs-vsctl 显示消息中的 Could not open network device dpdk0(不包括这样的设备)。
10.2. 诊断 复制链接链接已复制到粘贴板!
红帽支持在 DPDK 支持的硬件 中列出的轮询模式驱动程序(PMD)的子集。红帽在 2017 年 8 月被禁用的 PMD。
上游 PMD 可能会存在安全性或性能问题。因此,M PMD 需要经过大量测试才能通过红帽的资格测试。
您可以查看 /usr/share/doc/openvswitch-<version>/README.DPDK-PMDS 中所有启用的 PMD 的列表。此列表可能包含红帽不支持 PMD。不支持在 README.DPDK-PMDS 中列出的轮询模式驱动程序。
10.3. 解决方案 复制链接链接已复制到粘贴板!
以下示例显示了 openvswitch-2.6.1 支持的 PMD:
本例显示了 openvswitch-2.9.0 支持的 PMD:
第 11 章 可用主机内存页面不足,可使用 Open vSwitch DPDK 分配客户机 RAM 复制链接链接已复制到粘贴板!
11.1. 症状 复制链接链接已复制到粘贴板!
在部署实例时,把它调度到一个仍有足够 pCPU 的计算节点,并且实例内存有足够的空闲的巨页,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 不知道其他进程使用了一定数量的巨页内存。默认情况下,nova 假定所有巨页内存都可用于实例。如果假定这个 NUMA 节点仍有 pCPU 和空闲的巨页内存,Nova 将首先填满 NUMA 节点 0。这可能是因为以下原因造成的:
- 请求的 pCPU 仍适用于 NUMA 0
- 所有现有实例的合并内存加上实例的内存仍然被生成至 NUMA 节点 0
- OVS 等另一个进程在 NUMA 节点 0 上保存一定数量的巨页内存。
11.2.1. 诊断步骤 复制链接链接已复制到粘贴板!
检查
meminfo。以下显示了每个 NUMA 节点有 2MB 巨页和 512 个可用巨页的虚拟机监控程序: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 保留的巨页。在以下输出中,OVS 会为每个 NUMA 节点保留 512MB 的巨页:
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 上的空闲巨页是否已耗尽。然而,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" 表示内存将被声明从 NUMA 0。
11.3. 解决方案 复制链接链接已复制到粘贴板!
管理员可以输入实例没有使用的巨页内存量到 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
size 参数是巨页大小(以 KiB 为单位)。count 参数是每个 NUMA 节点使用的 OVS 巨页数量。例如,对于 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 实现这一点的详细信息,请参阅如何在 Red Hat OpenStack Platform 10 中设置 reserved_huge_pages。
Red Hat OpenStack Platform 10: OpenStack nova.conf - 配置选项没有包括在 Red Hat OpenStackPlatform 10 中。
Red Hat OpenStack Platform 11 中包括了以下信息: OpenStack nova.conf - 配置选项
在 /etc/nova/nova.conf 中启用了 debug 后,您应该在重启 openstack-nova-compute 后在日志中看到以下信息:
- 先决条件使用本节中的步骤来安装故障排除工具。
在计算节点上安装
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 Threads 复制链接链接已复制到粘贴板!
确定 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 报告并保存输出。
创建 script
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} 读取报告。如果出现这种情况,在红帽支持中打开,请将生成的 tar 归档附加到问题单中。
12.1.2. 附加数据 复制链接链接已复制到粘贴板!
创建 script
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' 文件可占用几个 Gigabytes 磁盘空间。
如果是红帽支持问题单,请将生成的 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 模拟器 复制链接链接已复制到粘贴板!
使用此流程确定在 Red Hat OpenStack Platform 中使用 virsh 模拟器与 NFV 的影响。
13.1. 症状 复制链接链接已复制到粘贴板!
您体验 Red Hat OpenStack Platform {vernum} NFV 环境中的数据包丢失,并且尚未配置仿真程序线程固定。
在 Red Hat OpenStack Platform 10 中,客户需要支持例外来固定仿真程序线程。但是,在几乎所有 NFV 情形中,红帽都强烈建议使用固定仿真程序线程。您可以通过更改默认仿真程序线程配置来显著提高性能。创建一个红帽支持问题单,并根据需要请求一个支持例外。
13.2. 解决方案 复制链接链接已复制到粘贴板!
使用这个部分来调查和配置仿真程序线程固定。
13.2.1. qemu-kvm Emulator Threads 复制链接链接已复制到粘贴板!
仿真程序线程处理虚拟机硬件模拟的中断请求和非阻塞进程。未运行 vCPU 的线程是 qemu-kvm 仿真程序线程。请参见以下示例。
由于 Linux CFS(完全公平调度程序), 模拟程序线程通常会定期从一个 pCPU 移到另一个(在 libvirt 的仿真器中定义)中。
在 NFV 环境中,如果您使用 isolcpus 参数配置仿真程序线程时,您可能会遇到问题,因为这种内核配置会禁用这些 CPU 上的 CFS 调度。如果您不使用 isolcpus 参数,可以在仿真程序线程中断正在处理数据包的 CPU 时遇到数据包丢失。
仿真程序线程示例包括:
- qemu-kvm 线程
- vnc_worker 线程
- vhost-<qemu-kvm PID> 内核线程(使用 virtio-net(虚拟机监控程序上的内核网络)
13.2.2. 默认行为线程线程处理 复制链接链接已复制到粘贴板!
默认情况下,nova 将配置仿真程序线程固定设置,该设置跨越分配给所有 vCPU 的 pCPU。如果您不使用 isolcpus 参数,则可以在任何 pCPU 上调度模拟器线程,并定期从一个 pCPU 移到另一个 CPU。
因此,这些 CPU 都可以由 qemu 的仿真程序线程来抢占,从而降低数据包丢失的风险。
13.2.3. OpenStack nova 中模拟线程的当前实施(OpenStack Platform 10) 复制链接链接已复制到粘贴板!
在 Red Hat OpenStack Platform 10 中,没有官方支持的方法固定仿真程序线程。您可以使用 virsh emulatorpin(…)--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. 关于在 Emulator Thread scheduling 上 isolcpus 的影响 复制链接链接已复制到粘贴板!
使用 isolcpus 时,C CFS 调度程序被禁用,所有仿真程序线程都将在第一个可用、最低索引的 pCPU 上运行。因此,如果没有干预或进一步配置,实例的一个 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 中的内核网络
如果 DPDK 在实例内运行,则为完全在用户空间中进行数据包处理。不要将 PMD 调度到 vCPU0 上运行,因为这应该留给操作系统和中断处理。由于实例中的 PMD CPU 运行活跃循环并且需要 100% 的 CPU,所以不应被抢占。如果其中一个 vCPU 被抢占,则可能会发生数据包丢失。因此,模拟仿真程序需要进行配置,从而使它不会与处理编号为 1 及以上虚拟 CPU 的物理 CPU 重叠。
在实例中使用 DPDK 网络,仿真程序线程的最佳位置是处理 vCPU 0 的 pCPU,也可以是不处理任何虚拟 CPU 的专用物理 CPU。
如果虚拟机监控程序和 DPDK 在实例上使用 OVS-DPDK,请将仿真器线程放在 vCPU 0 上。
13.2.5.2. 使用 DPDK 网络在 Open vSwitch 中的实例和系统数据路径中优化调度线程的放置 复制链接链接已复制到粘贴板!
如果虚拟机监控程序上使用内核空间网络,则在内核内执行对管理程序的数据包处理。
在实例中使用 DPDK 网络,仿真程序线程的最佳位置是处理 vCPU 0 的 pCPU,也可以是不处理任何虚拟 CPU 的专用物理 CPU。
请注意,在这种情况下,vNIC 队列的数据包处理在 hypervisor 的 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]
在实例中使用内核联网,有两个选项:
- 优化中断分布,例如:实例的 softirqs。在这种情况下,您不必为仿真程序线程分配额外的 pCPU,并可将仿真程序线程分配给不处理任何网络中断的 pCPU。
- 在同一 NUMA 节点上使用一个专用的 pCPU 用于仿真程序线程。
由于第一个选项的复杂性,建议使用第二个选项。
13.3. 诊断 复制链接链接已复制到粘贴板!
13.3.1. 演示环境 复制链接链接已复制到粘贴板!
演示环境运行一个实例: instance-0000001d。其关联的 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 模拟器线程移动模拟程序线程:
virsh emulatorpin instance-0000001d 34
virsh emulatorpin instance-0000001d 34
请注意,所有非 CPU 线程更改的关联性。
请注意在 /proc/sched_debug 中历史数据中的切换数。在以下示例中,PID 73517 已移至 cpu#34。其他仿真程序 worker 没有从最后的输出运行,因此仍然会在 cpu#10 上显示:
请注意,线程 73517 移到 cpu#34。现在,如果您与 VNC 会话交互,您可以看到 /proc/sched_debug 显示了 cpu#34 上的 vnc_worker 线程。