本文主要介绍在KVM虚拟机中如何进行配置调整可以最大限度地提高 VPP 应用程序的数据包处理性能。
- 禁用中断平衡 (irqbalance)
Irqbalance 守护进程默认启用。它的目的是为了在多核系统中跨 CPU 分配硬件中断,以提高性能。但是,它可能/将会导致运行 vpp 虚拟机的 cpu 停滞,从而导致 Rx 数据包丢失。当 irqbalance 被禁用时,所有中断都将由 cpu0 处理,因此 vpp (或任何其他服务 VM)不应在 cpu0 上运行。
我们可以通过在rc.local文件中设置关闭irqbalance服务:
代码语言:javascript复制 1#查询中断服务默认运行。
2root@jinsh:~# systemctl status irqbalance
3● irqbalance.service - irqbalance daemon
4 Loaded: loaded (/lib/systemd/system/irqbalance.service; enabled; vendor preset: enabled)
5 Active: active (running) since Sat 2023-09-23 08:17:39 UTC; 1 day 6h ago
6 Docs: man:irqbalance(1)
7 https://github.com/Irqbalance/irqbalance
8 Main PID: 907 (irqbalance)
9 Tasks: 2 (limit: 4513)
10 Memory: 892.0K
11 CPU: 495ms
12 CGroup: /system.slice/irqbalance.service
13 └─907 /usr/sbin/irqbalance --foreground
14
15Sep 23 08:17:39 jinsh systemd[1]: Started irqbalance daemon.
16##可以在rc.local文件中设置关闭
17 systemctl stop irqbalance
18 systemctl disable irqbalance
也可以通过在默认配置文件 (/etc/default/irqbalance) 中设置 ENABLED="0" 来禁用 irqbalance:
代码语言:javascript复制1#Configuration for the irqbalance daemon
2
3#Should irqbalance be enabled?
4ENABLED="0"
5#Balance the IRQs only once?
6ONESHOT="0"
- 禁用内核相同页面合并 (KSM)
KSM是一种节省内存的重复数据删除功能,它可以合并匿名(私有)页面(而不是页面缓存页面)。
在诊断vpp Rx零丢包问题时,我们注意到/sys/kernel/debug/kvm/pf_fixed计数器增加与周期性Rx丢包之间存在相关性。我们观察到禁用KSM消除了这些计数器的增量。KSM仅在Ubuntu 14.04服务器的主机操作系统上启用。Ubuntu 14.04服务器在虚拟机中运行时关闭。在主机操作系统的“/sys/kernel/mm/ KSM /run”中写入“0”关闭KSM。
代码语言:javascript复制1 echo 0 > /sys/kernel/mm/ksm/run
- 配置KVM参数
为了在虚拟机中运行 VPP,必须在命令行调用或 libvirt / virsh xml 域配置中配置以下参数:
代码语言:javascript复制 1-cpu host : This parameter causes the VM to inherit the host OS flags.
2Note: libvirt 0.9.11 or greater is required for this to be included in the xml configuration.
3
4-m 8192 : 8 GB of ram is required for optimal zero packet drop rates.
5 TBD: Need to investigate why this is true. 4GB has Rx pkt drops even though there is only 2.2GB allocated!
6
7-smp 2,sockets=1,cores=4,threads=2
8
9To disable PXE boot delays, add the ",rombar=0" option to the end of each "-device" option list or
10add "<rom bar='off'/> to the device xml configuration.
11
-cpu host: 表示 Guest OS 使用和 Host OS 相同的 CPU model。除了可以指定 Guest OS 的 CPU 模型,还可以指定附加的 CPU 特性。并且 -cpu 会将指定的 CPU 模型的所有功能全部暴露给 Guest OS,即使某些特性在实际的宿主机 pCPU 上并不支持,此时 QEMU-KVM 就会通过软件模拟的方式来支持这些特性,因此,也消耗一些性能。
-m 8192: kvm虚拟机至少需要需要 8 GB 内存才能实现最佳零丢包率。TBD:需要调查为什么这是真的。即使只分配了 2.2GB,4GB 的 Rx pkt 也会下降!
- 删除 VirtIO Balloon 驱动程序
在vpp虚拟机中使用VirtIO Balloon驱动程序,当用VirtIO Balloon驱动程序调用mmap()时,会导致Rx数据包丢失。
从虚拟机配置中删除VirtIO Balloon驱动程序:如果编辑xml配置,通过设置model='none'删除memballoon驱动程序:
代码语言:javascript复制1 <memballoon model='none'/>
或者从命令行参数列表中删除设备定义:
代码语言:javascript复制1 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x6
代码语言:javascript复制
- 设置VPP虚拟机线程的CPU亲和性和NUMA内存策略
CPU 亲和性和 NUMA 内存策略可以通过 进行配置libvirt。可以通过dpdk脚本cpu_layout.py来查询CPU core与numa 绑定关系。不幸的是此脚本在KVM虚拟机环境下,查询结果是错误的。可以通过numactl命令行来查询。
代码语言:javascript复制
代码语言:javascript复制 1dpdk-23.03/usertools# ./cpu_layout.py
2======================================================================
3Core and Socket Information (as reported by '/sys/devices/system/cpu')
4======================================================================
5
6cores = [0]
7sockets = [0, 2, 4, 6]
8
9 Socket 0 Socket 2 Socket 4 Socket 6
10 -------- -------- -------- --------
11Core 0 [0] [1] [2] [3]
12
13 ###numactl --hardware 命令行查询是正确的。
14 available: 1 nodes (0)
15 node 0 cpus: 0 1 2 3
16 node 0 size: 3875 MB
17 node 0 free: 2049 MB
18 node distances:
19 node 0
20 0: 10
代码语言:javascript复制
代码语言:javascript复制先了解更多的信息,建议详细阅读知乎文章《OpenStack Nova 高性能虚拟机之 NUMA 架构亲和》https://zhuanlan.zhihu.com/p/631094464
不要在虚拟机中运行任何其他程序!如前一节所述,在VM中为vpe和qn应用程序设置CPU亲和性非常重要,可以防止在适当的情况下出现Rx数据包丢失。在vpp VM中运行其他应用程序(例如htop)也可能导致Rx数据包丢失。关闭超线程
当启用超线程时,每个物理CPU核心显示为两个逻辑核心。每个逻辑内核共享物理内核的资源(L1和L2缓存、寄存器)。这是由BIOS中的设置控制的。
一般来说,当启用超线程时,数据平面性能会受到影响,因此建议禁用它。
由于HT配置是一种BIOS设置,更改它需要重新启动,因此部署将选择使用特定设置进行操作,而不是根据机器上运行的工作负载启用/禁用它。
如果启用了HT,仍然可以获得与禁用HT时相同的性能。为此,隔离额外的逻辑内核(请参阅CPU隔离),并且不要为它们分配任何线程。
代码语言:javascript复制
代码语言:javascript复制--------------------------------------------------------
代码语言:javascript复制下面是在实际环境中宿主机的grub cmdline设置参数及说明:
代码语言:javascript复制1 isolcpus=1-13 rcu_nocbs=1-13 nohz_full=1-13 kthread_cpus=0
2 irqaffinity=0 default_hugepagesz=1G hugepagesz=1G hugepages=4
3 nmi_watchdog=0 intel_pstate=disable nosoftlockup
- 设置核隔离,使转发核专注用于转发: isolcpus=1-13
- 将RCU Callback,内核线程,中断移出转发核:rcu_nocbs=1-13 kthread_cpus=0 irqaffinity=0
- 将转发核设置成无时钟滴答核,减少时钟中断次数:nohz_full=1-13
- 关闭看门狗: nmi_watchdog=0
- 设置大页内存默认页大小为1G, 分配大页内存: default_hugepagesz=1G hugepagesz=1G hugepages=64
- 禁止操作系统调整CPU频率