前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >VPP 如何优化性能(系统调优)--3

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

作者头像
dpdk-vpp源码解读
发布2023-09-27 15:12:27
5100
发布2023-09-27 15:12:27
举报
文章被收录于专栏:DPDK VPP源码分析DPDK VPP源码分析

本文说明如何进行配置调整可以最大限度地提高 VPP 应用程序的数据包处理性能。

  • 关闭透明巨页

透明巨页(Transparent hugepage, THP)特性自动化了创建和管理巨页的任务。内核守护进程(khugepage)在后台运行,将空闲页面拼接在一起形成/free大页面。

我们建议关闭此功能,而不是显式地分配巨大的页面(这不是一个强烈建议)。在预分配大页面的同时,主机系统上仍然可能有THP守护进程,我们可以通过下面的方式来彻底关闭THP:

代码语言:javascript
复制
1 echo never  > /sys/kernel/mm/transparent_hugepages/enabled
代码语言:javascript
复制
代码语言:javascript
复制
公众号文章:VPP HugePages 也有关于大页内存的介绍,可以阅读。透明大页(THP)和传统大页(HP)在内存管理和分配机制我也没有深入研究过,区别是什么?对dpdk转发面性能有什么影响性?下面是文心一言的回答:

透明大页(THP)和传统大页(HP)的主要区别在于它们的内存分配和管理机制。

传统大页是预分配的方式,当应用程序需要使用大页内存时,必须预先为它分配一大块连续的物理内存。这种方式的优点是可以减少页表转换的开销,因为大页的页表条目可以映射到相同或相邻的物理地址上。但是,如果预先分配的内存没有被完全使用,就会造成内存浪费。

透明大页则采用动态分配的方式,根据实际需要来分配大页。这种方式的优点是可以避免内存浪费,但同时它可能会引入额外的性能开销,因为需要在运行时动态地分配内存。

透明大页和传统大页对DPDK转发性能的影响主要表现在以下几个方面:

  • 内存分配方式的影响:传统大页采用预分配的方式,可能会造成内存浪费,而透明大页采用动态分配的方式,可以避免内存浪费。但是,如果DPDK需要处理大量数据包并且频繁地分配和释放大页内存,透明大页的动态分配方式可能会引入额外的性能开销。
  • 页表转换开销的影响:传统大页的页表条目可以映射到相同或相邻的物理地址上,可以减少页表转换的开销。而透明大页的页表条目可能会映射到不同的物理地址上,导致频繁的页表转换,从而增加性能开销。
  • 多线程的影响:传统大页的分配和管理机制可能会导致不同线程之间的竞争,从而影响DPDK的转发性能。而透明大页的分配和管理机制则可以更好地支持多线程环境下的性能优化。

综上所述,透明大页和传统大页各有优缺点,对DPDK转发性能的影响也因具体场景而异。在实际使用中,需要根据具体的应用场景和需求来权衡选择。

  • Memory locking / Swap behavior

在高负载的主机环境上,Linux 将退出进程的页面以释放内存。这种情况可能发生在由物理存储(硬盘)支持的文本页面上。如果启用交换,在系统内存不足的情况下,可以将数据段换出到磁盘上的交换区域。这通常发生在系统供应过剩时。这是服务器上的典型设置,但在嵌入式系统上并不常见。交换会导致“缓慢”且不确定的响应时间(增加了访问页面的延迟)。如果页面不在内存中,页面回收可能会增加延迟。

我们对运行 nfv 应用程序的建议是不要配置swapping,特别是避免交换(关闭交换)。为了获得确定的响应时间,我们建议为 vpp 应用程序固定 qemu 内存。固定/锁定 qemu 内存可确保 qemu 进程页面始终驻留在内存中。这提供了一致的响应时间。

打开qemu进程内存锁定的参数是:-realtime mlock=on

打开页面锁定需要考虑一些事项。调用进程必须适当设置进程限制 (prlimit),以锁定适当数量/大小的内存。如果使用 virsh 启动虚拟路由器,则必须适当设置 libvirtd 的进程限制。

要验证进程内存是否已锁定,请检查 /proc/<pid>/status 文件中 VmLck 字段的值。<pid> 需要是 qemu 进程的 pid(或虚拟路由器的任何 qemu 线程的 pid)。

  • KSM

KSM是“Kernel SamePage Merging”的缩写,中文可称为“内核同页合并”。KSM是Linux内核的一种特性,它允许内核在两个或多个进程(包括虚拟客户机)之间共享完全相同的内存页。

KSM通过扫描和比较正在运行进程的内存,如果发现它们有完全相同的内存区域或内存页,就将多个相同的内存合并为一个单一的内存页,并将其标识为“写时复制”。这样可以节省系统内存的使用量。当其中一个进程试图修改被标识为“写时复制”的合并内存页时,KSM会为该进程复制出一个新的内存页供其使用。

在QEMU/KVM中,一个虚拟客户机就是一个QEMU进程,因此使用KSM也可以实现多个客户机之间的相同内存合并。如果多个虚拟机运行的是相同的操作系统或应用程序,则客户机之间的相同内存页的数量就可能比较大,这种情况下KSM的作用就更加显著。

至于KSM对DPDK转发性能的影响,由于KSM主要作用于内核内存管理,对DPDK的转发性能影响不是直接作用在DPDK本身,而是间接通过减少内存消耗和增加内存管理开销来影响整体性能。具体来说,如果启用了KSM,那么相同的内存页会被合并,这可能会减少需要由DPDK处理的内存拷贝次数,从而提高数据包的转发效率。但是,由于KSM需要扫描和比较进程的内存页,会增加内核内存管理的开销,这可能会对DPDK的性能产生一定的负面影响。

因此,是否启用KSM取决于具体的应用场景和需求。在一些对内存消耗要求高,而对CPU处理速度要求不那么严格的场景下,启用KSM可能会有利于提高系统整体的效率;而在一些对CPU处理速度要求高的场景下,可能就不太适合启用KSM。

KSM 在尝试优化内存利用率时会消耗主机系统上大量的 CPU 资源。此外,KSM 尝试定期合并页面(通常为 200 毫秒,但可通过调整/sys/kernel/mm/ksm/sleep_millisecs中的条目进行配置)

我们建议在运行单个 vpp 实例时关闭此功能。要关闭此功能,请执行:

代码语言:javascript
复制
echo 0 > /sys/kernel/mm/ksm/run

也可以通过下面的方式直接关闭ksm服务

代码语言:javascript
复制
systemctl stop ksm
systemctl disable ksm

如果关闭ksm不实际,我们建议关闭numa节点上的ksm:

代码语言:javascript
复制
echo 0 > /sys/kernel/mm/ksm/merge_across_nodes

如果系统上运行多个 vpp 实例,打开此功能将节省内存,但会牺牲一些 cpu 周期。

  • VPP开启多线程

在任何需要高吞吐量性能的环境中,建议在多线程模式下运行VPP。

如果在默认的单线程配置中运行,那么处理数据包转发的同一线程还将执行管理配置任务及定时任务处理,例如响应API调用或收集统计数据(根据NIC的制造和型号、NIC的位置以及配置用于VPP的NIC的数量,这些任务可能会消耗不同的时间),从而导致外部因素影响转发性能。因此,即使单个CPU内核可以实现所需的性能目标,在“一个主线程+一个工作线程”配置中运行VPP将有助于减轻外部因素可能产生的影响,并允许一个工作线程提供更好更一致的转发性能。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-09-26 23:00,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DPDK VPP源码分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档