本文主要介绍在KVM虚拟机中如何进行配置调整可以最大限度地提高 VPP 应用程序的数据包处理性能。
Irqbalance 守护进程默认启用。它的目的是为了在多核系统中跨 CPU 分配硬件中断,以提高性能。但是,它可能/将会导致运行 vpp 虚拟机的 cpu 停滞,从而导致 Rx 数据包丢失。当 irqbalance 被禁用时,所有中断都将由 cpu0 处理,因此 vpp (或任何其他服务 VM)不应在 cpu0 上运行。
我们可以通过在rc.local文件中设置关闭irqbalance服务:
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:
1#Configuration for the irqbalance daemon
2
3#Should irqbalance be enabled?
4ENABLED="0"
5#Balance the IRQs only once?
6ONESHOT="0"
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。
1 echo 0 > /sys/kernel/mm/ksm/run
为了在虚拟机中运行 VPP,必须在命令行调用或 libvirt / virsh xml 域配置中配置以下参数:
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
-m 8192: kvm虚拟机至少需要需要 8 GB 内存才能实现最佳零丢包率。TBD:需要调查为什么这是真的。即使只分配了 2.2GB,4GB 的 Rx pkt 也会下降!
在vpp虚拟机中使用VirtIO Balloon驱动程序,当用VirtIO Balloon驱动程序调用mmap()时,会导致Rx数据包丢失。
从虚拟机配置中删除VirtIO Balloon驱动程序:如果编辑xml配置,通过设置model='none'删除memballoon驱动程序:
1 <memballoon model='none'/>
或者从命令行参数列表中删除设备定义:
1 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x6
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
先了解更多的信息,建议详细阅读知乎文章《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隔离),并且不要为它们分配任何线程。
--------------------------------------------------------
下面是在实际环境中宿主机的grub cmdline设置参数及说明:
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
本文分享自 DPDK VPP源码分析 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!