1 - 使用qbittorrent
选择版本
让我们快速了解一下 qBittorrent 安装方法之间的一些基本区别:
-
qBittorrent 桌面优势:
- 用户友好界面: 提供直观且易于浏览的图形界面。
- 简洁的体验: 作为开源软件,它没有广告和不必要的捆绑软件。
- 功能丰富:包括顺序下载、带宽调度等功能。
-
qBittorrent-nox 的优势:
- 专为无头系统优化: 专为最小化资源占用而设计,是受限系统的理想选择。
- 网络接口: 允许通过基于网络的界面进行操作。
- 远程管理: 通过网络接口方便管理服务器和远程系统。
自动安装
我用的debian是服务器版本,没有UI界面,因此选择安装 qbittorrent-nox (无图形界面版本):
sudo apt install qbittorrent-nox
为 qBittorrent 创建专用系统用户和组:
sudo adduser --system --group qbittorrent-nox
sudo adduser sky qbittorrent-nox
为 qBittorrent-nox 创建 Systemd 服务文件
sudo vi /etc/systemd/system/qbittorrent-nox.service
内容如下:
[Unit]
Description=qBittorrent Command Line Client
After=network.target
[Service]
Type=forking
User=qbittorrent-nox
Group=qbittorrent-nox
UMask=007
ExecStart=/usr/bin/qbittorrent-nox -d --webui-port=8080
Restart=on-failure
[Install]
WantedBy=multi-user.target
重启 daemon-reload:
sudo systemctl daemon-reload
启动
启动 qbittorrent-nox 准备必要的目录:
sudo mkdir /home/qbittorrent-nox
sudo chown qbittorrent-nox:qbittorrent-nox /home/qbittorrent-nox
sudo usermod -d /home/qbittorrent-nox qbittorrent-nox
启动:
sudo systemctl start qbittorrent-nox
查看启动状态:
sudo systemctl status qbittorrent-nox
看到信息如下:
qbittorrent-nox.service - qBittorrent Command Line Client
Loaded: loaded (/etc/systemd/system/qbittorrent-nox.service; enabled; preset: enabled)
Active: active (running) since Sun 2024-05-05 01:09:48 EDT; 3h 7min ago
Process: 768 ExecStart=/usr/bin/qbittorrent-nox -d --webui-port=8080 (code=exited, status=0/SUCCESS)
Main PID: 779 (qbittorrent-nox)
Tasks: 21 (limit: 9429)
Memory: 6.4G
CPU: 5min 23.810s
CGroup: /system.slice/qbittorrent-nox.service
└─779 /usr/bin/qbittorrent-nox -d --webui-port=8080
May 05 01:09:48 skynas3 systemd[1]: Starting qbittorrent-nox.service - qBittorrent Command Line Client...
May 05 01:09:48 skynas3 systemd[1]: Started qbittorrent-nox.service - qBittorrent Command Line Client.
设置开机自动启动:
sudo systemctl enable qbittorrent-nox
管理
访问 http://192.168.20.2:8080/ ,默认登录用户/密码为 admin
和 adminadmin
。
-
下载
- 默认保存路径:"/mnt/storage2/download"
-
连接
- 用于传入连接的端口:在路由器上增加这个端口的端口映射
-
Web-ui
- 语言:用户语言界面选择"简体中文"
- 修改用户密码
- 勾选 “对本地主机上的客户端跳过身份验证”
- 勾选 “对 IP 子网白名单中的客户端跳过身份验证”:
192.168.0.0/24,192.168.192.0/24
-
高级
- 勾选 “允许来自同一 IP 地址的多个连接”
- 勾选 “总是向同级的所有 Tracker 汇报”
参考资料
手工安装
安装依赖包
先安装依赖包:
sudo apt update
sudo apt install build-essential pkg-config automake libtool git libgeoip-dev python3 python3-dev
sudo apt install libboost-dev libboost-system-dev libboost-chrono-dev libboost-random-dev libssl-dev
sudo apt install qtbase5-dev qttools5-dev-tools libqt5svg5-dev zlib1g-dev
安装 libtorrent 1.2.19
安装libtorrent 1.2.19:
wget https://github.com/arvidn/libtorrent/releases/download/v1.2.19/libtorrent-rasterbar-1.2.19.tar.gz
tar xf libtorrent-rasterbar-1.2.19.tar.gz
cd libtorrent-rasterbar-1.2.19
./configure --disable-debug --enable-encryption --with-libgeoip=system CXXFLAGS=-std=c++14
make -j$(nproc)
sudo make install
sudo ldconfig
如果遇到错误:
checking whether g++ supports C++17 features with -std=c++17... yes
checking whether the Boost::System library is available... no
configure: error: Boost.System library not found. Try using --with-boost-system=lib
需要先安装 libboost-system-dev :
sudo apt install libboost-system-dev
如果遇到错误:
checking whether compiling and linking against OpenSSL works... no
configure: error: OpenSSL library not found. Try using --with-openssl=DIR or disabling encryption at all.
需要先安装 libssl-dev :
sudo apt install libssl-dev
安装 qbittorrent
不敢用太新的版本,还是找个稍微久一点的,继续沿用参考文档里面用的 4.3.9 版本:
wget https://github.com/qbittorrent/qBittorrent/archive/refs/tags/release-4.3.9.tar.gz
tar xf release-4.3.9.tar.gz
cd qBittorrent-release-4.3.9
./configure --disable-gui --disable-debug
make -j$(nproc)
sudo make install
设置开机自启
sudo vi /etc/systemd/system/qbittorrent.service
输入以下内容:
[Unit]
Description=qBittorrent Daemon Service
After=network.target
[Service]
LimitNOFILE=512000
User=root
ExecStart=/usr/local/bin/qbittorrent-nox
ExecStop=/usr/bin/killall -w qbittorrent-nox
[Install]
WantedBy=multi-user.target
启用开机自启:
sudo systemctl enable qbittorrent.service
第一次启动
先手工启动第一次:
sudo qbittorrent-nox
*** Legal Notice ***
qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility.
No further notices will be issued.
Press 'y' key to accept and continue...
按 Y 后,Ctrl+C退出。
用 systemctl 后台启动 qbittorrent:
sudo systemctl start qbittorrent.service
参考资料
2 - 用linux bridge实现软交换
准备工作
安装好网卡驱动,如 cx3 / cx4 / cx5 的驱动。
搭建软交换
新建 linux bridge
安装 bridge 工具包:
sudo apt install bridge-utils -y
查看当前网卡情况:
$ ip addr
2: enp6s18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether bc:24:11:97:c4:00 brd ff:ff:ff:ff:ff:ff
inet 192.168.20.25/24 brd 192.168.20.255 scope global enp6s18
3: enp1s0f0np0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether b8:ce:f6:0b:ff:7c brd ff:ff:ff:ff:ff:ff
4: enp1s0f1np1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether b8:ce:f6:0b:ff:7d brd ff:ff:ff:ff:ff:ff
enp6s18 是对外的网卡(wan),enp1s0f0np0 和 enp1s0f1np1 准备用来连接其他机器(lan)。
修改 network interfaces,删除所有和 enp6s18 / 是对外的网卡(wan),enp1s0f0np0 / enp1s0f1np1 有关的内容:
sudo vi /etc/network/interfaces
最后保留的内容应该非常少,类似于:
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
然后新建一个 br0 文件来创建网桥:
sudo vi /etc/network/interfaces.d/br0
内容为:
auto br0
iface br0 inet static
address 192.168.20.2
broadcast 192.168.20.255
netmask 255.255.255.0
gateway 192.168.20.1
bridge_ports enp6s18 enp1s0f0np0 enp1s0f1np1
bridge_stp off
bridge_waitport 0
bridge_fd 0
注意这里要把所有需要加入网桥的网卡都列举在 bridge_ports 中(包括 wan 和 lan, 会自动识别) 保存后重启网络:
sudo systemctl restart networking
或者直接重启机器。(如果之前有配置wan口网卡的ip地址,并且新网桥的ip地址和wan的ip地址一致,就必须重启机器而不是重启网路。)
查看改动之后的网络:
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: enp6s18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
link/ether bc:24:11:97:c4:00 brd ff:ff:ff:ff:ff:ff
3: enp1s0f0np0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether b8:ce:f6:0b:ff:7c brd ff:ff:ff:ff:ff:ff
4: enp1s0f1np1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether b8:ce:f6:0b:ff:7d brd ff:ff:ff:ff:ff:ff
6: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 6e:38:a0:77:09:dc brd ff:ff:ff:ff:ff:ff
inet 192.168.20.2/24 brd 192.168.20.255 scope global br0
valid_lft forever preferred_lft forever
检查网络是否可以对外/对内访问。如果没有问题,说明第一步成功,网桥创建好了。
$ brctl show
bridge name bridge id STP enabled interfaces
br0 8000.6e38a07709dc no enp1s0f0np0
enp1s0f1np1
enp6s18
$ bridge link
2: enp6s18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 100
3: enp1s0f0np0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 1
3: enp1s0f0np0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 hwmode VEB
4: enp1s0f1np1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 1
4: enp1s0f1np1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 hwmode VEB
网卡另一头接上其他电脑,通过 dhcp 自动获取了IP地址,而且内外可以互通,测度测试也正常。
软交换就这么搭建好了。
小结和对比
上面这个方案,比之前在 ubuntu server 用的方案要简单很多,当时也用了 linux bridge,但需要建立子网,安装 dnsmaxq 做 dhcp 服务器端,配置内核转发,还要设置静态路由规则。
这个方案什么都不用做,就需要建立一个最简单的 linux bridge 就可以了。
开启内核转发
备注: 发现不做这个设置,也可以正常转发。不过还是加上吧。
sudo vi /etc/sysctl.conf
把这两行注释取消,打开配置:
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
让改动生效:
sudo sysctl --load /etc/sysctl.conf
设置 MTU
默认 mtu 为 1500,为了最大化发挥网卡的能力,需要修改 mtu 为 9000.
对于机器 B / C,只要执行下面的命令即可:
sudo ip link set enp6s16np0 mtu 9000
对于软交换所在的 A 机器,需要将 linux bridge 和相关的网卡都设置为 mut 9000:
sudo ip link set dev br0 mtu 9000
sudo ip link set dev enp1s0f0np0 mtu 9000
sudo ip link set dev enp1s0f1np1 mtu 9000
这个方式只能临时生效,一旦机器重启就会恢复成默认的 mtu 1500。解决的方法是修改 rc.local
参考资料:
性能测试
cx3测试
cx4测试
25g网卡连接速度25g,用 iperf2 测试出来的带宽有23.5g,接近25g的理论值。
忘了有没有改 mtu了,下次再测试看看。
cx5测试
以 cx5 网卡为例,软交换机器 A (ip 为 192.168.0.100)上一块 cx5 双口网卡,另外两台测试机器 B (ip 为 192.168.0.125) / C (ip 为 192.168.0.127) 上一块单口网卡,用 100G dac线材连接。三台机器都安装好 iperf 和 iperf3。
iperf2 测试
在软交换机器 A 上启动 iperf 服务器端:
iperf -s -p 10001
在 B/C 两台机器上分别启动 iperf 客户端:
iperf -c 192.168.0.100 -P 3 -t 10 -p 10001 -i 1
测试直连速度: 达到 99.0 Gits/sec, 非常接近 100G 的理论最大值。
备注: 如果不设置为 mtu 9000, 采用默认的 mtu 1500,只能达到约 94 G 。
[SUM] 0.0000-10.0001 sec 115 GBytes 99.0 Gbits/sec
测试转发速度: 在其中一台机器 B 上启动 iperf 服务器端,然后从另外一台机器 C 上测试连接机器 B, 速度可以达到 76.9 G,和 100G 理论最大值相比损失还是挺大的。
iperf -c 192.168.0.125 -P 2 -t 10 -p 10001 -i 1
[SUM] 0.0000-6.9712 sec 62.4 GBytes 76.9 Gbits/sec
注意:-P 2
也就是启动两个线程,可以测试出最大值,继续增加线程反而会下降。
特别注意的是,网络速度测试时,在软交换机器 A 上,用 top 命令看似乎几乎没有任何性能消耗:
但实际上,在 pve 虚拟机上,显示占用了块两个核心:
可见此时并没有实现我们期待的在进行软交换时启用 rdma 来减少 cpu 消耗的目的。因此,需要继续考虑如何开启 rdma
iperf3 测试
类似的,测试出来 iperf3 下软交换的速度大概是 63.9 G:
$ iperf3 -c 192.168.0.125 -P 2 -t 10 -i 1
......
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 37.2 GBytes 31.9 Gbits/sec 0 sender
[ 5] 0.00-10.00 sec 37.2 GBytes 31.9 Gbits/sec receiver
[ 7] 0.00-10.00 sec 37.2 GBytes 31.9 Gbits/sec 0 sender
[ 7] 0.00-10.00 sec 37.2 GBytes 31.9 Gbits/sec receiver
[SUM] 0.00-10.00 sec 74.4 GBytes 63.9 Gbits/sec 0 sender
[SUM] 0.00-10.00 sec 74.4 GBytes 63.9 Gbits/sec receiver
top下依然看到 cpu 占用极低,但 pve 页面显示有 5% 的 cpu。
增加 -Z
参数开启 iperf3 的 zero copy 功能再测试,速度大幅提升达到 77.8 G:
iperf3 -c 192.168.0.125 -P 2 -t 10 -i 1 -Z
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 45.3 GBytes 38.9 Gbits/sec 0 sender
[ 5] 0.00-10.00 sec 45.3 GBytes 38.9 Gbits/sec receiver
[ 7] 0.00-10.00 sec 45.3 GBytes 38.9 Gbits/sec 0 sender
[ 7] 0.00-10.00 sec 45.3 GBytes 38.9 Gbits/sec receiver
[SUM] 0.00-10.00 sec 90.6 GBytes 77.8 Gbits/sec 0 sender
[SUM] 0.00-10.00 sec 90.6 GBytes 77.8 Gbits/sec receiver
此时 top 下依然看到 cpu 占用极低,但 pve 页面显示有 6.59% 的 cpu。
参考资料
3 - 网卡片上卸载
背景
前面用 linux bridge 做软交换,功能没问题,性能看似还行,但其实有不少问题:
- 跑不到网卡极限
- cpu占用较高
- rdma 之类的高级特性缺失
cx5 介绍
https://www.nvidia.com/en-us/networking/ethernet/connectx-5/
NVIDIA® Mellanox® ConnectX®-5适配器提供先进的硬件卸载功能,可减少CPU资源消耗,并实现极高的数据包速率和吞吐量。这提高了数据中心基础设施的效率,并为Web 2.0、云、数据分析和存储平台提供了最高性能和最灵活的解决方案。
这里提到的 “先进的硬件卸载功能,可减少CPU资源消耗”,正是我需要的。
实现最高效率的主要特性:
-
NVIDIA RoCE技术封装了以太网上的数据包传输,并降低了CPU负载,从而为网络和存储密集型应用提供高带宽和低延迟的网络基础设施。
-
突破性的 NVIDIA ASAP² 技术通过将 Open vSwitch 数据路径从主机CPU卸载到适配器,提供创新的 SR-IOV 和 VirtIO 加速,从而实现极高的性能和可扩展性。
-
ConnectX 网卡利用 SR-IOV 来分离对虚拟化环境中物理资源和功能的访问。这减少了I/O开销,并允许网卡保持接近非虚拟化的性能。
关键特性:
- 每个端口最高可达100 Gb/s以太网
- 可靠传输上的自适应路由
- NVMe over Fabric(NVMf)目标卸载
- 增强的vSwitch / vRouter卸载
- NVGRE和VXLAN封装流量的硬件卸载
- 端到端QoS和拥塞控制
cx5 网卡资料:
https://network.nvidia.com/files/doc-2020/pb-connectx-5-en-card.pdf
硬件加速的基本知识
NVIDIA DPU白皮书:SR-IOV vs. VirtIO加速性能对比
https://aijishu.com/a/1060000000228117
open vswitch
sudo apt install openvswitch-switch
查看Open vSwitch(OVS)的版本:
$ sudo ovs-vsctl show
2a434d84-f9ec-4da7-af56-a762b068a2e8
ovs_version: "3.1.0"
和 openvswitch 模块的信息:
$ sudo modinfo openvswitch
filename: /lib/modules/6.1.0-25-amd64/kernel/net/openvswitch/openvswitch.ko
alias: net-pf-16-proto-16-family-ovs_ct_limit
alias: net-pf-16-proto-16-family-ovs_meter
alias: net-pf-16-proto-16-family-ovs_packet
alias: net-pf-16-proto-16-family-ovs_flow
alias: net-pf-16-proto-16-family-ovs_vport
alias: net-pf-16-proto-16-family-ovs_datapath
license: GPL
description: Open vSwitch switching datapath
depends: nf_conntrack,nsh,nf_nat,nf_defrag_ipv6,nf_conncount,libcrc32c
retpoline: Y
intree: Y
name: openvswitch
vermagic: 6.1.0-25-amd64 SMP preempt mod_unload modversions
sig_id: PKCS#7
signer: Debian Secure Boot CA
sig_key: 32:A0:28:7F:84:1A:03:6F:A3:93:C1:E0:65:C4:3A:E6:B2:42:26:43
sig_hashalgo: sha256
signature: 52:AF:27:99:1F:1F:EF:6C:2E:7D:16:DB:D9:B9:8E:46:99:13:AA:37:
53:5F:19:45:38:8B:C6:7C:B6:D7:93:A6:5C:B3:59:C7:F4:70:A5:D8:
94:9C:00:4F:17:06:8E:63:BF:69:F1:01:76:85:BB:FC:C7:6B:F4:E3:
C2:BD:01:7F:9A:98:04:76:23:C5:05:58:10:77:21:EC:95:4B:98:DD:
51:DB:58:32:A9:49:19:7B:47:D7:60:FF:D8:BB:81:90:C7:54:14:42:
80:D6:1B:D4:64:E8:DB:EC:A2:3F:49:FD:7E:34:05:78:50:98:A5:BF:
33:47:59:C0:F8:76:7F:F6:26:3E:F0:6F:E5:72:7C:51:CA:31:B7:EE:
B7:C2:03:30:77:DA:B5:13:03:F5:EF:26:CB:32:F8:DA:3F:A0:60:E5:
8F:39:D8:8F:BF:6E:25:15:EA:AB:48:A5:02:56:15:5A:08:BB:34:73:
52:C4:DA:E5:9F:89:BF:7B:6E:6E:B9:D8:9B:6B:46:BA:C9:29:06:0B:
2A:97:4F:D4:92:61:88:18:5B:AF:C1:FE:AA:6D:3D:77:18:96:0C:DF:
EB:20:DE:4F:D2:49:72:B5:F9:02:72:F2:0D:44:3D:6C:DF:C5:D8:3B:
35:A7:8C:08:11:76:B5:F9:34:1B:F7:80:A6:3E:A6:0E
检查 openvswitch 模块的正确加载:
lsmod | grep openvswitch
openvswitch 192512 0
nsh 16384 1 openvswitch
nf_conncount 24576 1 openvswitch
nf_nat 57344 1 openvswitch
nf_conntrack 188416 3 nf_nat,openvswitch,nf_conncount
nf_defrag_ipv6 24576 2 nf_conntrack,openvswitch
libcrc32c 16384 3 nf_conntrack,nf_nat,openvswitch
查看 openvswitch-switch 服务的运行情况:
sudo systemctl status openvswitch-switch
openvswitch-switch.service - Open vSwitch
Loaded: loaded (/lib/systemd/system/openvswitch-switch.service; enabled; preset: enabled)
Active: active (exited) since Tue 2024-09-10 04:27:46 EDT; 3min 59s ago
Process: 1025 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 1025 (code=exited, status=0/SUCCESS)
CPU: 420us
Sep 10 04:27:46 dev100 systemd[1]: Starting openvswitch-switch.service - Open vSwitch...
Sep 10 04:27:46 dev100 systemd[1]: Finished openvswitch-switch.service - Open vSwitch.
sudo systemctl status ovsdb-server
ovsdb-server.service - Open vSwitch Database Unit
Loaded: loaded (/lib/systemd/system/ovsdb-server.service; static)
Active: active (running) since Tue 2024-09-10 04:27:46 EDT; 7min ago
Process: 738 ExecStart=/usr/share/openvswitch/scripts/ovs-ctl --no-ovs-vswitchd --no-monitor --system-id=random --no-record-hostname start $O>
Main PID: 816 (ovsdb-server)
Tasks: 1 (limit: 38413)
Memory: 15.0M
CPU: 41ms
CGroup: /system.slice/ovsdb-server.service
└─816 ovsdb-server /etc/openvswitch/conf.db -vconsole:emer -vsyslog:err -vfile:info --remote=punix:/var/run/openvswitch/db.sock --pr>
Sep 10 04:27:46 dev100 systemd[1]: Starting ovsdb-server.service - Open vSwitch Database Unit...
Sep 10 04:27:46 dev100 ovs-ctl[738]: Starting ovsdb-server.
Sep 10 04:27:46 dev100 ovs-vsctl[817]: ovs|00001|vsctl|INFO|Called as ovs-vsctl --no-wait -- init -- set Open_vSwitch . db-version=8.3.1
Sep 10 04:27:46 dev100 ovs-vsctl[831]: ovs|00001|vsctl|INFO|Called as ovs-vsctl --no-wait set Open_vSwitch . ovs-version=3.1.0 "external-ids:syst>
Sep 10 04:27:46 dev100 ovs-ctl[738]: Configuring Open vSwitch system IDs.
Sep 10 04:27:46 dev100 ovs-ctl[738]: Enabling remote OVSDB managers.
Sep 10 04:27:46 dev100 systemd[1]: Started ovsdb-server.service - Open vSwitch Database Unit.
sudo systemctl status ovs-vswitchd
● ovs-vswitchd.service - Open vSwitch Forwarding Unit
Loaded: loaded (/lib/systemd/system/ovs-vswitchd.service; static)
Active: active (running) since Tue 2024-09-10 04:27:46 EDT; 8min ago
Process: 835 ExecStart=/usr/share/openvswitch/scripts/ovs-ctl --no-ovsdb-server --no-monitor --system-id=random --no-record-hostname start $O>
Main PID: 1012 (ovs-vswitchd)
Tasks: 1 (limit: 38413)
Memory: 5.6M
CPU: 29ms
CGroup: /system.slice/ovs-vswitchd.service
└─1012 ovs-vswitchd unix:/var/run/openvswitch/db.sock -vconsole:emer -vsyslog:err -vfile:info --mlockall --no-chdir --log-file=/var/>
Sep 10 04:27:46 dev100 systemd[1]: Starting ovs-vswitchd.service - Open vSwitch Forwarding Unit...
Sep 10 04:27:46 dev100 ovs-ctl[883]: Inserting openvswitch module.
Sep 10 04:27:46 dev100 ovs-ctl[835]: Starting ovs-vswitchd.
Sep 10 04:27:46 dev100 ovs-ctl[835]: Enabling remote OVSDB managers.
Sep 10 04:27:46 dev100 systemd[1]: Started ovs-vswitchd.service - Open vSwitch Forwarding Unit.
sudo ovs-vsctl add-br br0
sudo ovs-vsctl show
sudo ovs-vsctl list br br0
sudo ovs-vsctl add-port br0 enp6s18
sudo ovs-vsctl add-port br0 enp1s0f0np0
sudo ovs-vsctl add-port br0 enp1s0f1np1
sudo ovs-vsctl show
sudo ovs-vsctl set Open_vSwitch . other_config:hw-offload=true
sudo systemctl restart networking
sudo systemctl restart openvswitch-switch
https://infoloup.no-ip.org/openvswitch-debian12-creation/
➜ ~ sudo ip link set br0 mtu 9000 ➜ ~ sudo ip link set enp1s0f1np1 mtu 9000 ➜ ~ sudo ip link set enp1s0f0np0 mtu 9000 ➜ ~ sudo ip link set enp6s18 mtu 9000
https://docs.openstack.org/neutron/latest/admin/config-ovs-offload.html
https://www.openvswitch.org/support/ovscon2019/day2/0951-hw_offload_ovs_con_19-Oz-Mellanox.pdf
https://docs.nvidia.com/doca/archive/doca-v2.2.0/switching-support/index.html