VPP 如何优化性能(系统调优)--2

2023-09-25 16:44:54 浏览数 (1)

本文主要介绍在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复制

先了解更多的信息,建议详细阅读知乎文章《OpenStack Nova 高性能虚拟机之 NUMA 架构亲和》https://zhuanlan.zhihu.com/p/631094464

代码语言:javascript复制
不要在虚拟机中运行任何其他程序!如前一节所述,在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频率

0 人点赞