Proxmox安装OPNsense调整网络性能方法

OPNsense的默认参数设置非常保守,在千兆以上的高带宽网络中可能会出现无法跑满的情况。有国外网友在Proxmox安装上OPNsense,出现了网络吞吐量不达标的的问题。通过摸索,他最终解决了问题。以下为文章翻译内容。

最近出于多种原因,我决定开始淘汰我的Ubiquiti EdgeRouter Infinity,我决定尝试一下OPNsense。我订购了一些企业级硬件,包括E5-2650L v3处理器、64GB内存和X520-DA2I万兆网卡。我安装好了Proxmox,然而当我使用OPNsense 时,问题出现了。

我的互联网带宽为6Gbps,我原以为像我这样的硬件设备处理10G连接应该没有任何问题,尤其是在如此强大的系统上。但是在Proxmox中安装了OPNsense VM后,经过测试, 最大吞吐量只有2-3Gbps(大约是我速度的一半)。

即使使用iperf从OPNsense VM与本地网络上的计算机进行测试,速度也一样不达标。为什么OPNsense VM只能使用10Gbps网络连接的大约25%?我花了几天时间梳理文章和论坛主题,通过不断摸索,最终解决了网络吞吐量不达标的问题。我把解决过程整理出来以供将来参考,也希望给有同样问题的人们进行参照。

排除硬件问题

我了解到Proxmox是能够通过虚拟机处理10Gbps网络速度,而且英特尔X520-DA2I 网卡在过去任何系统中使用也没出现过任何问题。

为了排除组装硬件的任何问题,我创建了一个连接到相同虚拟接口的Debian 11 VM,并进行了iperf 测试。我发现 Debian VM没有问题,在LAN接口上的iperf测试中能跑出 9.6Gbps的带宽速率。

FreeBSD虚拟网络问题

在研究过程中,我沮丧地发现FreeBSD在涉及虚拟网络适配器时,似乎有出现性能问题的历史, 不仅在Proxmox上, 在VMWare也出现过。

一些消息来源似乎暗示VirtIO在FreeBSD 11或12中存在主要驱动程序问题,建议使用 E1000。一些消息来源似乎建议我在使用的版本(基于 FreeBSD 13)中修复 VirtIO 驱动程序。

我测试了Proxmox 接口中提供的每种虚拟网络适配器类型:VirtIO、E1000、Realtek RTL8139和VMWare vmxnet3。

测试时没有进行任何性能调整,表现最好的是VirtIO。其他类型适配器甚至出现无法达到1Gbps速率的情况,VirtIO可以达到大约2.5Gbps。所以,我决定使用VirtIO,并做一些其他额外的调整。

在测试过程中,我还对HOST CPU与KVM64两种类型进行了测试,KVM64 实际上表现更好,所以我决定使用默认值。我添加了AES 标志(可以提升VPN性能),还添加了Numa 标志,虽然这可能不会增加任何性能提升。

硬件卸载问题

一般普遍的共识是不要在防火墙设备上启用硬件TSO或硬件LRO。

我分别尝试了这些设置的每一个选项,可能偶尔有一些性能提升(硬件LRO有显著的性能提升),但一些设置也极大地降低了性能。启用硬件VLAN过滤后网络速度非常慢,甚至无法可靠地访问Web UI。

在测试过程中,在硬件卸载方面遇到了一些非常奇怪的问题。在某些情况下,硬件卸载会帮助LAN端显著提高性能,但WAN端的性能却会急剧下降。

由于存在这些奇怪的结果,我决定关闭所有硬件卸载。最后,我能够在不启用任何功能的情况下实现上述性能。

低效的默认可调参数

我在FreeBSD上进行更深入的参数调整旅程始于这个 帖子,来自一个似乎和我有同样问题的人。其他用户也在讨论,诉说自己的经历,他们同样对OPNsense为何表现如此糟糕感到困惑。

正是通过论坛,我偶然发现了这个非常流行且备受推崇的FreeBSD 网络性能调整指南。我梳理了本指南中的所有内容,忽略了所有 ZFS 内容和DDoS缓解内容,重点关注可以提高网络性能的所有内容。

进行这些调整后,网络性能确实有了巨大的提升。现在OPNsense防火墙可以实现大约4-5Gbps的速率,但仍然未达到我的Internet限制速度,还需要做更多的事情来提高性能。

我阅读了其他几篇文章和讨论,例如Github上的这个帖子,OPNsense 论坛上关于接收端缩放的帖子, pfSense性能调整指南,一个类似的基于 FreeBSD 的防火墙解决方案,以及关于同一问题的/r/OPNsenseFirewall2 年前的 Reddit 线程。

我看过的每个文章都列出了一两个其他可调参数,这似乎是它们的灵丹妙药。我一次只改变一件事情,然后重新启动我的防火墙。我没有仔细地跟踪哪些参数调整产生了影响,哪些没有,因为当我读到每件事是什么时,我普遍同意“是的,增加这个似乎是个好主意”,并决定保持平衡似乎没有显著提高性能的修改。

也许您想要进行更多测试,并缩小范围来确定哪些参数值的设置有意义,我现在提供经过测试的配置供您参考,它为我解决了网络吞吐量的问题,我对此感到非常满意。

正确的配置方法

以下是我的防火墙上的配置,这些配置达到了超过6Gbps的吞吐量。

Proxmox 虚拟机硬件设置 – 机器类型

OPNsene VM机器类型选q35还是i440fx,网络上的意见非常矛盾。我坚持使用默认的i440fx,在使用过程中没有出现任何巨大的性能波动问题。

Proxmox 虚拟机硬件设置CPU

  • CPU 类型保留为“KVM64”(默认)。 测试中提供了最佳性能。
  • 总核心数与我的物理管理程序CPU匹配,因为这主要是一个路由器,我希望路由器能够使用完整的全部 CPU。
  • 选中“启用 NUMA”(这可能不会提高性能)。
  • 启用“AES CPU标志”(可以提高VPN性能)。

Proxmox 虚拟机硬件设置 – 网络适配器

  • 禁用防火墙选项。Proxmox不需要做任何防火墙处理,我们将在OPNsense 上完成所有防火墙工作。
  • 使用VirtIO 网络设备类型。 测试中提供了最佳性能。
  • 将Multiqueue设置为8。 8是最大值,这为网络适配器提供了额外的并行处理。

OPNsense 设置

选中“接口”>“设置”中的所有禁用硬件卸载选项。

OPNsense 可调参数

参照FreeBSD网络性能调优指南,我对可调整参数进行了以下调整(系统-设置-可调参数)。

hw.ibrs_disable=1

这是一个与CPU相关的可调参数,用于缓解Spectre V2漏洞。禁用它对性能有非常大的提升。

net.isr.maxthreads=-1

取消可用于netisr处理的CPU数量。默认情况下,FreeBSD 网络堆栈是单线程的。设置为 -1 可以使用全部24个CPU线程。

net.isr.bindthreads=1

将每个ISR 线程绑定到1个CPU 核心,这样做很有意义,因为我们为每个核心启动一个线程。

net.isr.dispatch=deferred

根据我之前链接的这个Github 线程,似乎需要将此可调参数更改为“deferred”或“hybrid”才能使其他net.isr可调参数做任何有意义的事情。

net.inet.rss.enabled=1

启用接收方缩放,RSS是另一个可以改进多核系统网络流量并行处理的参数。

net.inet.rss.bits=6

这是来自同一论坛线程的接收端缩放可调参数。我将其设置为6,因为最佳值是CPU内核数除以4。我的CPU有24个内核,所以24/4=6。您的值应基于OPNsense虚拟机上的 CPU内核数。

kern.ipc.maxsockbuf=614400000

我从FreeBSD Network Performance Tuning Guide中发现了这个,如果你有100Gbps网络适配器,这是他们推荐的值。我的OPNsense 安装附带的默认值与指南中2Gbps网络的值相对应。我决定既然我将来可能会扩展,我把它设置增加到这个水平,这样我就不必再处理这个了。您可能需要设置一个更合理的值,16777216适用于10Gbps。上面链接的指南详细介绍了该值的作用以及它影响的其他值。

net.inet.tcp.recvbuf_max=4194304
net.inet.tcp.recvspace=65536
net.inet.tcp.sendbuf_inc=65536
net.inet.tcp.sendbuf_max=4194304
net.inet.tcp.sendspace=65536

这些TCP缓冲区设置取自FreeBSD网络性能调优指南,我没有深入研究它们,但它们都与OPNsense上提供的缓冲区相当或更大,所以我采用了它。该指南详细说明了这些值如何帮助提高性能。

net.inet.tcp.soreceive_stream=1

该参数启用了优化的内核套接字接口,可以显著降低快速 TCP流对CPU的影响。

net.pf.source_nodes_hashsize=1048576

该参数可能对我的问题没有帮助,但它可能会防止将来出现问题。该值增加PF防火墙哈希表的大小,以便在性能下降之前允许表中有更多的连接。

net.inet.tcp.mssdflt=1240
net.inet.tcp.abc_l_var=52

这些参数值提高处理IP片段时的效率。您也可以在此处设置更激进的值,但似乎这些值更安全,所以我选择了它们。

net.inet.tcp.minmss=536

该参数配置了最小段大小,或单个IPv4 TCP段同意传输的最小数据负载,旨在提高效率。

kern.random.fortuna.minpoolsize=128

这与网络完全无关,这是用于改善RNG熵池的值。因为我的防火墙系统上有VPN,我认为RNG 越多越好。

net.isr.defaultqlimit=2048

这个值源自我之前链接的Reddit 线程,它在最后一批可调参数中被添加,最终将吞吐量提升到了极值。

结论

通过上述调整,在Proxmox上的KVM虚拟机中运行的OPNsense实现了我想要的性能。

我想这些相同的概念将适用于任何基于FreeBSD的防火墙,例如pfSense。有些甚至可以适用于家庭实验室环境中常见的其他基于FreeBSD的解决方案,例如FreeNAS。然而,在我的测试中,OPNsense的性能受到了特别的限制,我想这也许跟它使用兼容性有关系。

上面的内容并不是一个全面的指南,我写它是为了我将来的参考,希望有像我一样问题的人能通过本指南找到答案,并希望他在尝试我的指南中的设置后取得同样好的结果。

原文地址

相关文章:OPNsense调整网卡RSS参数提升网络性能

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇