这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

网络

利用 debian 12.4 实现的一些网络方案

1 - 使用qbittorrent

在debian12下利用qbittorrent实现PT下载

选择版本

让我们快速了解一下 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/ ,默认登录用户/密码为 adminadminadmin

  • 下载

    • 默认保存路径:"/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实现软交换

在 debian12 下利用 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 - 网卡片上卸载

在 debian 12 下利用cx5网卡的片上卸载功能降低cpu占用

背景

前面用 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