OpenWrt 下 Tailscale 性能调优全记录:网卡中断、内核参数与传输协议的选择

摘要: 本文记录了解决异地组网(Tailscale)访问 NAS 速度缓慢问题的完整过程。通过分析发现,瓶颈并非单一因素,而是由 SMB 协议在高延迟下的低效、运营商对 UDP 大包的 QoS 限制以及软路由 CPU 单核软中断瓶颈共同导致。文章详细介绍了如何通过更换传输协议(WebDAV/FTP)、伪装 UDP 443 端口绕过 QoS、开启 Linux BBR 拥塞控制、以及优化网卡 Ring Buffer 和 RPS 软负载均衡,最终将传输速度从 86Mbps 提升至跑满带宽的 399Mbps。

原因-openwrt性能不行

tailscale涉及到加密解密,若是将tailscale安装在软路由上,性能将会很不佳,3~10MB就是上限了,应该将 tailscale 安装在x86的电脑上。

原因-SMB 协议的物理定律 (带宽延迟积)

如果是直接在 Windows 资源管理器里“复制/粘贴”文件,那么这就是原因。

  • 原理: SMB(Windows 共享协议)是一个串行确认协议

    • 它发一个数据块(Block),就必须停下来等 NAS 回复一句“收到了”,才能发下一个。

      • 延迟是 45ms。这意味着每秒钟只能进行约 22 次(1000ms / 45ms)有效的“发送-确认”握手。
  • 现象:

    • 为什么慢? TCP 窗口无法被填满。单线程 SMB 在 40ms+ 延迟下的物理极限速度通常就是在 5MB/s ~ 15MB/s 左右。

      • 为什么波动? 因为 TCP 协议在尝试通过“慢启动”增加发送窗口,一旦遇到丢包(公网 UDP 传输常见的抖动),窗口大小瞬间减半,速度就会从 11MB/s 掉到 2MB/s,然后重新慢慢爬升。这就是看到的“锯齿状”波动。

验证方法:

请不要用“拷贝文件”来测速,那测的是 SMB 的效率,不是网络的带宽。请用 iPerf3打流测试(后文有写):

需要可以更换专业的软件 Rclone Browser 、FileZilla、AirExplorer 才能更好的传输, 最好用ftp+AirExplorer, 然后在一个文件夹中创建8个1G以上的压缩文件, 传输这个文件夹, 测试最大速度.

还可以在ubuntu中打流测试会更准.

使用专业的传输工具(强烈推荐 - 跑满速) 请下载 FileZilla (免费开源)。

  1. 主机: sftp://192.168.50.201 (使用 SSH 协议,最稳) 或 WebDAV 地址。

  2. 用户名/密码: NAS 的账号密码。

  3. 关键设置: 它可以同时传输多个文件,或者把一个大文件分成多块同时传。

    • 这能用并发连接数(Concurrency)来抵消 45ms 的延迟。

    • 效果: 速度应该能稳定在 30MB/s - 40MB/s (取决于 350Mbps 下行带宽极限)。

预测结果: 单线程可能只有 20-50Mbps (几MB/s),但多线程(-P 8)很可能会跑满上行带宽(200Mbps+)。如果是这样,说明网络没问题,是 SMB 协议拉胯。

  • Windows 资源管理器的“单线程”机制

    • 当在“我的电脑”里复制文件到 Z 盘(RaiDrive 挂载盘)时,Windows 是按顺序一个块一个块传输的。

    • 它发一个块,必须等 NAS 回复“写入成功”,再发下一个。

    • 45ms 的延迟 意味着每秒钟只能交互 20 次左右。这直接物理锁死了单线程传输上限(通常就在 10MB/s 左右)。

  • RaiDrive 的缓存与上传机制

    • RaiDrive 会先在本地缓存文件,然后尝试上传。

    • 波动原因: Windows 资源管理器试图推数据 -> RaiDrive 缓冲区满 -> 暂停等待网络上传 -> 网络上传受限于延迟 -> 缓冲区空了 -> 继续推数据。这种“推-停-推-停”的过程,体现在进度条上就是速度忽高忽低(锯齿状)。

  • WebDAV 协议的开销

    • WebDAV 基于 HTTP,本身协议头就比较重。加上 Tailscale 的加密头,有效载荷进一步降低。

解决方案建议

如果 iPerf3 多线程 能跑出高分(比如 200Mbps+),那么网络架构是完美的。要解决传文件慢的问题,需要换“交通工具”:

  1. 换协议(最推荐):

    • WebDAV: 之前用 RaiDrive 挂载的就是 WebDAV。WebDAV 对延迟的容忍度比 SMB 好很多。

    • FTP / SFTP: 传输大文件时,FTP 是效率之王。

  2. 多线程复制(如果必须用 SMB):

    • 不要用 Windows 自带的复制粘贴。

    • 使用 FastCopyRobocopy 等工具。

    • 开启 多线程/缓冲 选项。这能同时建立多个连接,把 45ms 的延迟因为并发而抵消掉,轻松跑满带宽。

原因-运营商对 UDP 大包的 QoS (限速/丢包)

Tailscale 底层走的是 UDP 协议

  • 现状: 国内运营商(特别是跨运营商,或者高峰期)对 大流量的 UDP 数据包 非常敏感。他们会认为这是 P2P 下载或者攻击流量,从而进行 QoS 丢包

  • 后果:

    • WireGuard 协议一旦发生丢包,就需要重传。

      • 在 TCP(SMB)之上再跑一个丢包的 UDP(Tailscale),会发生“TCP 拥塞控制崩溃”,导致速度剧烈波动。

      • 2~11MB/s 的波动 非常符合“丢包-重传-降速-恢复”的特征。

(一般)尝试优化 MTU(对抗波动)-Tailscale所在Linux

虽然很难对抗运营商,但可以尝试修改 Tailscale 的 MTU(最大传输单元),减小包的大小,降低被运营商丢弃的概率。

  • 在笔记本和 Ubuntu Server 上: 尝试将 Tailscale 接口的 MTU 从默认的 1280 改为 1200 甚至更小,看看波动是否减小。

如果 iPerf3 测试结果也不稳定,说明运营商在丢 UDP 包。请尝试在 笔记本电脑 的管理员 CMD 中修改Linux Tailscale 虚拟网卡的 MTU:

# 查看当前 MTU
ip addr show tailscale0

# 修改 MTU 为 1200 (默认是 1280)
sudo ip link set dev tailscale0 mtu 1200

改小 MTU 可以让数据包更“小巧”,更容易穿过运营商拥堵的管道,减少丢包重传带来的速度骤降。

实测MTU1200会有一点提升, 但区别不大, 当前网络环境不需要修改.

(极佳)Linux开启 BBR 拥塞控制算法

Linux(Tailscale在的系统),BBR 是 Google 开发的拥塞控制算法,特别擅长在高丢包、高延迟的网络环境下“抢带宽”。

在 Ubuntu Server 上检查并开启 BBR:

  1. 检查当前算法:

    sysctl net.ipv4.tcp_congestion_control
    

    (如果是 cubicreno,那就必须得换)

  2. 开启 BBR:

    echo "net.core.default_qdisc=fq" | sudo tee -a /etc/sysctl.conf
    echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.conf
    sudo sysctl -p
    
  3. 验证是否开启:

    lsmod | grep bbr
    

    (如果看到 tcp_bbr,说明开启成功)

开启 BBR 后再测一次 iperf3。对于这种跨运营商的高丢包线路,BBR 往往有奇效,能把被 QoS 丢掉的速度抢回来。

(较好)Windows设置开启“接收窗口自动调节”

更简单的,开启“接收窗口自动调节”:
管理员权限运行cmd

netsh interface tcp set global autotuninglevel=normal

(极佳)更换 Tailscale 端口 (绕过运营商 QoS)

注意: Windows客户端不好修改, 推荐用虚拟机中UbuntuServer安装Tailscale当子网路由

运营商通常对 41641 这个默认端口盯得很紧。我们把它改成 UDP 443(伪装成 QUIC 流量)或者随机端口。

在 Ubuntu Server(Linux)上,修改 Tailscale 监听端口的正确方法是修改系统配置文件

在终端中输入以下命令打开配置文件:

sudo vim /etc/default/tailscaled
  1. 修改或添加端口变量

PORT="41641"修改为PORT="0"设置为 0 (或443)后,Tailscale 每次启动都会随机选择一个高位端口。这能有效防止运营商针对固定端口(41641)的长期 QoS 限速。

  1. 重启 Tailscale 服务

修改配置后,必须重启服务才能生效:

sudo systemctl restart tailscaled

验证端口是否改变

重启后,可以检查一下当前 Tailscale 到底监听在哪个端口:

sudo netstat -ulpn | grep tailscaled

随机端口后会好很多, 如果隔一段时间又不佳了, 设置为443看看, 一般都会好很多!

  1. 屏蔽的是“入站 TCP 443” (建站行为)

    • 运营商为了防止家庭用户搭建非法网站,确实会封锁家庭宽带公网 IP 的 TCP 80TCP 443 端口。

    • 这意味着:外网无法通过 https://的IP 访问家里的 Web 服务器。

  2. 放行的是“UDP 443” (HTTP/3 QUIC 协议)

    • Tailscale 使用的是 UDP 协议。

    • 现代互联网(Google, YouTube, Bilibili, 抖音等)正在全面普及 HTTP/3 (QUIC) 协议,而 QUIC 协议的标准端口正是 UDP 443

    • 运营商不封锁 UDP 443: 如果运营商封了 UDP 443,会导致大量主流 APP 卡顿、网页打不开。

为什么改成 443 后速度起飞了?

这就涉及到运营商的 QoS (流量整形) 策略了:

  • 随机高位端口 (之前): 运营商看着一个不知名的 UDP 端口跑了 300M 流量,判定为:“疑似 P2P 下载/BT 流量/垃圾流量”,策略:“低优先级,网络拥堵时优先丢包”

  • UDP 443 端口 (现在): 运营商看着 UDP 443 跑了 300M 流量,判定为:“疑似 QUIC 网页浏览/流媒体视频”,策略:“高优先级,这是用户在看视频,尽量别卡”

真相:成功地将 Tailscale 流量“伪装”成了正常的网页浏览流量,骗过了运营商的 QoS 限制!

(可选)openwrt安装Turbo ACC

注意Turbo ACC的安装比较复杂, 需要重新编译, 建议用别的方式替代!

这个是针对R2S之类的性能较弱的软路由, 若是Openwrt运行在x86平台, 在x86PVE中运行openwrt, 4核心, 开启了irqbalance和软件流量卸载, PVE9安装R8125 2.5G网卡驱动、开启缓冲区、开启硬件多队列支持, 则不需要.

Turbo ACC (特别是其中的 SFE - Shortcut Fast Path Engine) 主要针对 MIPS/ARM 等低功耗 CPU 的路由器,这些路由器的 CPU 性能有限,需要软件加速来弥补。 x86 CPU (4核心) 性能远超普通路由器 CPU,处理数据包的能力强大得多。即使没有 SFE,也能以非常高的 PPS (每秒包数) 处理流量。

irqbalance 它将网卡中断请求(IRQ)分发到不同的 CPU 核心,避免单个核心成为瓶颈,充分利用了多核心优势。这对于高 PPS 的流量至关重要。

软件流量卸载 (Software Flow Offloading) 这是 OpenWrt 内核自带的流量加速机制,其作用和 Turbo ACC (SFE) 的核心功能高度重合。它通过在内核中建立快速路径,让已建立连接的流量绕过大部分复杂的防火墙和 NAT 查询,直接进行转发。这正是 Turbo ACC 试图实现的目标。

R8125 驱动和缓冲区: 确保了网卡驱动的稳定性和足够的队列缓冲区,可以更好地应对突发大流量,减少网卡层面的丢包。

硬件多队列 (Hardware Multiqueue): 这是非常关键的优化!它允许网卡将入站数据包分发到多个 CPU 核心的独立队列中。结合 irqbalance,这意味着不同的 CPU 核心可以并行处理不同的数据流,极大地提高了 PPS 处理能力和总带宽。

  • 找到 “网络” -> “Turbo ACC 网络加速” (或者在“系统”里)。

  • 检查设置:

    • 软件流量分流 (Software Flow Offloading): 必须 勾选

    • 硬件流量分流 (Hardware Flow Offloading): 如果有,勾选

    • DNS 缓存: 可以开。

  • 保存并应用

    • 原理:开启后,OpenWrt 转发数据包不再经过 CPU 复杂计算,而是直接走快速通道。这对 UDP 大流量传输至关重要。

提到没有安装 Turbo ACC。这在普通的上网场景下没问题,但在 高带宽 UDP 转发 场景下是致命的。

  1. 软中断风暴:

    • Tailscale (WireGuard) 是基于 UDP 的。iPerf3 在 100Mbps+ 速度下会产生每秒数万个小包 (PPS)。

    • 没有硬件加速(Offloading),每一个数据包都要 OpenWrt 的 CPU 亲自去“搬运”(从 WAN 到 LAN,再到 NAT 表查询)。

    • CPU 的 softirq(软中断)会瞬间飙升。虽然 CPU 总占用率可能看着不高,但实际上网络栈已经堵塞了。

  2. 丢包机制:

    • 当软中断处理不过来时,网卡缓冲区满了,新的数据包就会被直接丢弃。

    • 这就是为什么看到了 2万次重传

  • 现状(无 Turbo ACC): 每一个数据包进入路由器,Linux 内核都要走一遍完整的流程:网卡中断 -> 防火墙规则检查(iptables) -> 路由表查询 -> NAT转换 -> 转发

    • 瓶颈: 这个流程太长了!虽然 CPU 算得过来(占用率不高),但在处理流程上的延迟(Latency) 很高。

    • 丢包原因: 当瞬间涌入 1000 个包,CPU 还在按部就班地走流程处理前 100 个,后面的 900 个没地方放,网卡缓冲区(Ring Buffer)溢出,直接丢弃。

  • Turbo ACC (SFE/Flow Offloading) 的作用: 它的原理是 “走捷径” (Shortcut)

    • 当第一个数据包走完流程后,Turbo ACC 记住这条路。

      • 后续的 999 个包,跳过 防火墙检查、跳过路由查询,直接由驱动层修改 IP 头并转发。

      • 结果: 处理每个包的时间缩短了 10 倍。缓冲区清空得快,新包进得来,丢包自然就消失了

(较好)openwrt安装irqbalance 硬件中断

openwrt之irqblance_openwrt irqbalance-CSDN博客
检查软件包里有没有 irqbalance,安装并启用它,自动分配中断。

1. 安装 irqbalance
opkg update
opkg install irqbalance
2. 编辑配置文件
vi /etc/config/irqbalance

配置文件内容示例
option enabled '1' # 启用服务
别的暂时不需要修改!

config irqbalance
        option enabled '1'        # 启用服务
        option banirq '0'         # 禁止平衡的IRQ列表(留空或0表示无)
        option banmod 'iwlwifi'   # 禁止平衡的模块(如WiFi驱动)
        option args '--debug'     # 额外启动参数(可选)
3. 启动服务并设置开机自启
/etc/init.d/irqbalance start
/etc/init.d/irqbalance enable
4. 验证服务状态
# 检查进程
ps | grep irqbalance

# 查看服务状态
/etc/init.d/irqbalance status

# 检查中断平衡情况
cat /proc/interrupts

验证是否生效

启动后,可以通过 htop 命令(如果没有安装需 opkg install htop)观察 CPU 的负载情况。

  • 生效前: 做 iperf3 测速时,可能只有一个 CPU 核心(例如 Core 0)占用率飙升到 100%,其他核心围观。

  • 生效后: irqbalance 会尝试把网卡的硬中断(IRQ)分配给不同的核心。应该看到 软中断 (SIR / SoftIRQ) 负载被稍微摊平了一些。


(较好)openwrt安装RPS (软件负载均衡)

仅仅开启 irqbalance 可能不够。 irqbalance 处理的是硬件中断。对于网络包转发,特别是 OpenWrt 这种 Linux 系统,软件中断(SoftIRQ) 才是导致单核打死、大量丢包的元凶。

既然无法安装 Turbo ACC,强烈建议手动开启 Linux 内核自带的 RPS (Receive Packet Steering)。这是“ Turbo ACC平替”,纯软件实现多核分流。

请在 SSH 中执行以下命令(立即生效,重启失效):

# 假设物理网口是 eth0, eth1, eth2... (根据实际情况调整)
#这个要去网络--接口查看, 例如我的就是WAN是eth1,lan是eth0

# 'f' 代表 16进制的 1111,即允许 4 个 CPU 核心参与处理。如果是双核就是 '3'。

# 开启 WAN 口 (eth0) 的多核软中断负载均衡
for file in /sys/class/net/eth0/queues/rx-*/rps_cpus; do echo f > $file; done

# 开启 LAN 口 (eth1) 的多核软中断负载均衡
for file in /sys/class/net/eth1/queues/rx-*/rps_cpus; do echo f > $file; done

操作完这两步(irqbalance + RPS)后,请再跑一次 iPerf3。 这时候, 4 核 CPU 应该会一起工作,虽然 CPU 总占用率可能会上升,但单核不再瓶颈,重传数(Retr)应该会显著下降,速度会更稳。

  1. 登录 iStoreOS 后台

  2. 点击菜单栏的 “系统” (System) -> “启动项” (Startup)

  3. 点击顶部的 “本地启动脚本” (Local Startup) 选项卡(在页面最右边)。

  4. 在编辑器中,找到 exit 0 这一行。

  5. exit 0 之前,粘贴刚才用到的优化代码。

友善R2S

完整的推荐脚本如下(直接复制粘贴进去):

下面是友善R2S的, 可以直接复制粘贴

# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.

# 1. 开启网卡 RPS 软负载均衡 (针对 NanoPi R2S 4核优化)
# eth0 (WAN)
if [ -d /sys/class/net/eth0/queues ]; then
    for file in /sys/class/net/eth0/queues/rx-*/rps_cpus; do echo f > $file; done
fi

# eth1 (LAN)
if [ -d /sys/class/net/eth1/queues ]; then
    for file in /sys/class/net/eth1/queues/rx-*/rps_cpus; do echo f > $file; done
fi

# 2. 优化网卡 Ring Buffer (防止突发丢包)
# 注意:eth0 支持双向调节,eth1 只支持 RX 调节且最大为 4096
if [ -x /usr/sbin/ethtool ]; then
    ethtool -G eth0 rx 1024 tx 1024
    ethtool -G eth1 rx 4096
fi

# 3. 优化内核队列 (配合 Ring Buffer)
sysctl -w net.core.netdev_max_backlog=16384
sysctl -w net.netfilter.nf_conntrack_max=65536


exit 0
  1. 点击底部的 “保存” (Save)
    image
    开启软件流量卸载

x86虚拟机

关于 Ring Buffer (rx/tx) 的精确调整

虽然的脚本设置了 rx 4096 tx 4096,但PVE 虚拟机的网卡(例如 VirtIO)可能支持更大或更小的值,或者根本不能手动设置。

需要先在 OpenWrt 命令行中查看当前和最大值,然后进行调整。

查看当前网卡设置:

  1. SSH 连接到OpenWrt。

  2. 分别查看 WAN (eth1) 和 LAN (eth0) 的 Ring Buffer 信息:

    Bash

    ethtool -g eth1 # 查看 WAN (eth1) 的 Ring Buffer
    ethtool -g eth0 # 查看 LAN (eth0) 的 Ring Buffer
    

    输出(示例):

    root@iStoreOS:~# ethtool -g eth1 # 查看 WAN (eth1) 的 Ring Buffer
    Ring parameters for eth1:
    Pre-set maximums:
    RX:             1024
    RX Mini:        0
    RX Jumbo:       0
    TX:             256
    Current hardware settings:
    RX:             1024
    RX Mini:        0
    RX Jumbo:       0
    TX:             256
    
    root@iStoreOS:~# ethtool -g eth0 # 查看 LAN (eth0) 的 Ring Buffer
    Ring parameters for eth0:
    Pre-set maximums:
    RX:             1024
    RX Mini:        0
    RX Jumbo:       0
    TX:             256
    Current hardware settings:
    RX:             1024
    RX Mini:        0
    RX Jumbo:       0
    TX:             256
    
    root@iStoreOS:~#
    
    
    • Pre-set maximums 这是网卡驱动支持的最大值。
    • Current hardware settings 这是当前正在使用的值。

根据查看结果修改 rc.local

  • 如果 Pre-set maximums 很高(如 4096 或 8192),那么可以尝试将 ethtool -G ethX rx YYYY tx ZZZZ 中的 YYYYZZZZ 设置为更大的值(例如 rx 4096 tx 4096),但不要超过 Pre-set maximums
  • 如果 ethtool -g 命令报错或者显示 Pre-set maximums 只有 256 或更小,说明虚拟网卡可能不支持手动调节到很高,或者有其他限制。在这种情况下,保持默认或者设置到一个合理值(如 256 或 512)即可。
  • 对于 x86 虚拟机,rx 1024 tx 1024 通常是一个比较安全的起点,rx 4096 tx 4096 是一个比较激进但常见的高性能设置。

PVE 宿主机网卡设置

在 PVE 宿主机上对物理网卡(R8125)的优化,例如安装驱动、开启缓冲区、开启硬件多队列,这些是物理层面的优化,与 OpenWrt 虚拟机内部的 ethtool 命令无关

  • PVE 宿主机上的 ethtool -Kethtool -G 这些命令应该在 PVE 宿主机上对物理网卡 (enpXsXensXX) 执行,以优化物理网卡本身。
  • PVE 虚拟机中的 ethtool -Kethtool -G 这些命令是在 OpenWrt 虚拟机内部对虚拟网卡 (eth0, eth1) 执行的。

确认 PVE 物理网卡设置:

  1. SSH 登录到你的 PVE 宿主机

  2. 使用 ip a 命令查看物理网卡的名称(例如 enp3s0和 eno1)。

  3. 查看物理网卡的 Ring Buffer:

    ethtool -g <你的物理网卡名称,例如 eno1>
    
    root@pve:~# ethtool -g eno1
    Ring parameters for eno1:
    Pre-set maximums:
    RX:                     1024
    RX Mini:                n/a
    RX Jumbo:               n/a
    TX:                     1024
    TX push buff len:       n/a
    Current hardware settings:
    RX:                     1024
    RX Mini:                n/a
    RX Jumbo:               n/a
    TX:                     1024
    RX Buf Len:             n/a
    CQE Size:               n/a
    TX Push:                off
    RX Push:                off
    TX push buff len:       n/a
    TCP data split:         n/a
    root@pve:~# ethtool -g enp3s0
    Ring parameters for enp3s0:
    Pre-set maximums:
    RX:                     1024
    RX Mini:                n/a
    RX Jumbo:               n/a
    TX:                     1024
    TX push buff len:       n/a
    Current hardware settings:
    RX:                     1024
    RX Mini:                n/a
    RX Jumbo:               n/a
    TX:                     1024
    RX Buf Len:             n/a
    CQE Size:               n/a
    TX Push:                off
    RX Push:                off
    TX push buff len:       n/a
    TCP data split:         n/a
    root@pve:~#
    
    
  4. 查看物理网卡的校验和卸载状态:

    ethtool -k <你的物理网卡名称,例如 eno1>
    
    root@pve:~# ethtool -k eno1
    Features for eno1:
    rx-checksumming: on
    tx-checksumming: on
            tx-checksum-ipv4: on
            tx-checksum-ip-generic: off [fixed]
            tx-checksum-ipv6: on
            tx-checksum-fcoe-crc: off [fixed]
            tx-checksum-sctp: off [fixed]
    scatter-gather: on
            tx-scatter-gather: on
            tx-scatter-gather-fraglist: off [fixed]
    tcp-segmentation-offload: on
            tx-tcp-segmentation: on
            tx-tcp-ecn-segmentation: off [fixed]
            tx-tcp-mangleid-segmentation: off
            tx-tcp6-segmentation: on
    generic-segmentation-offload: on
    generic-receive-offload: on
    large-receive-offload: off [fixed]
    rx-vlan-offload: on
    tx-vlan-offload: on
    ntuple-filters: off [fixed]
    receive-hashing: on
    highdma: on [fixed]
    rx-vlan-filter: off [fixed]
    vlan-challenged: off [fixed]
    tx-gso-robust: off [fixed]
    tx-fcoe-segmentation: off [fixed]
    tx-gre-segmentation: off [fixed]
    tx-gre-csum-segmentation: off [fixed]
    tx-ipxip4-segmentation: off [fixed]
    tx-ipxip6-segmentation: off [fixed]
    tx-udp_tnl-segmentation: off [fixed]
    tx-udp_tnl-csum-segmentation: off [fixed]
    tx-gso-partial: off [fixed]
    tx-tunnel-remcsum-segmentation: off [fixed]
    tx-sctp-segmentation: off [fixed]
    tx-esp-segmentation: off [fixed]
    tx-udp-segmentation: off [fixed]
    tx-gso-list: off [fixed]
    tx-nocache-copy: off
    loopback: off [fixed]
    rx-fcs: off
    rx-all: off
    tx-vlan-stag-hw-insert: off [fixed]
    rx-vlan-stag-hw-parse: off [fixed]
    rx-vlan-stag-filter: off [fixed]
    l2-fwd-offload: off [fixed]
    hw-tc-offload: off [fixed]
    esp-hw-offload: off [fixed]
    esp-tx-csum-hw-offload: off [fixed]
    rx-udp_tunnel-port-offload: off [fixed]
    tls-hw-tx-offload: off [fixed]
    tls-hw-rx-offload: off [fixed]
    rx-gro-hw: off [fixed]
    tls-hw-record: off [fixed]
    rx-gro-list: off
    macsec-hw-offload: off [fixed]
    rx-udp-gro-forwarding: off
    hsr-tag-ins-offload: off [fixed]
    hsr-tag-rm-offload: off [fixed]
    hsr-fwd-offload: off [fixed]
    hsr-dup-offload: off [fixed]
    root@pve:~# ethtool -k enp3s0
    Features for enp3s0:
    rx-checksumming: on
    tx-checksumming: on
            tx-checksum-ipv4: on
            tx-checksum-ip-generic: off [fixed]
            tx-checksum-ipv6: on
            tx-checksum-fcoe-crc: off [fixed]
            tx-checksum-sctp: off [fixed]
    scatter-gather: on
            tx-scatter-gather: on
            tx-scatter-gather-fraglist: off [fixed]
    tcp-segmentation-offload: on
            tx-tcp-segmentation: on
            tx-tcp-ecn-segmentation: off [fixed]
            tx-tcp-mangleid-segmentation: off
            tx-tcp6-segmentation: on
    generic-segmentation-offload: on
    generic-receive-offload: on
    large-receive-offload: off [fixed]
    rx-vlan-offload: on
    tx-vlan-offload: on
    ntuple-filters: off [fixed]
    receive-hashing: on
    highdma: on [fixed]
    rx-vlan-filter: off [fixed]
    vlan-challenged: off [fixed]
    tx-gso-robust: off [fixed]
    tx-fcoe-segmentation: off [fixed]
    tx-gre-segmentation: off [fixed]
    tx-gre-csum-segmentation: off [fixed]
    tx-ipxip4-segmentation: off [fixed]
    tx-ipxip6-segmentation: off [fixed]
    tx-udp_tnl-segmentation: off [fixed]
    tx-udp_tnl-csum-segmentation: off [fixed]
    tx-gso-partial: off [fixed]
    tx-tunnel-remcsum-segmentation: off [fixed]
    tx-sctp-segmentation: off [fixed]
    tx-esp-segmentation: off [fixed]
    tx-udp-segmentation: off [fixed]
    tx-gso-list: off [fixed]
    tx-nocache-copy: off
    loopback: off [fixed]
    rx-fcs: off
    rx-all: off
    tx-vlan-stag-hw-insert: off [fixed]
    rx-vlan-stag-hw-parse: off [fixed]
    rx-vlan-stag-filter: off [fixed]
    l2-fwd-offload: off [fixed]
    hw-tc-offload: off [fixed]
    esp-hw-offload: off [fixed]
    esp-tx-csum-hw-offload: off [fixed]
    rx-udp_tunnel-port-offload: off [fixed]
    tls-hw-tx-offload: off [fixed]
    tls-hw-rx-offload: off [fixed]
    rx-gro-hw: off [fixed]
    tls-hw-record: off [fixed]
    rx-gro-list: off
    macsec-hw-offload: off [fixed]
    rx-udp-gro-forwarding: off
    hsr-tag-ins-offload: off [fixed]
    hsr-tag-rm-offload: off [fixed]
    hsr-fwd-offload: off [fixed]
    hsr-dup-offload: off [fixed]
    root@pve:~#
    
    

在 PVE 宿主机上优化物理网卡:

对于 R8125 这样的 2.5G 网卡,如果宿主机性能足够,开启硬件卸载(包括校验和、TSO、GSO 等)通常是有益的。但是,如果你的 OpenWrt 虚拟机内部也开启了校验和卸载,有时可能会导致冲突。

鉴于你在 OpenWrt 内部已经关闭了校验和卸载,你可以保持 PVE 宿主机上的物理网卡默认开启硬件卸载,或者也尝试关闭看看效果。通常情况下,虚拟机的内部设置更重要,宿主机的物理网卡保持默认或开启卸载即可。

  • 主要修改 OpenWrt 内部 rc.local 脚本,将网卡名称对调。
  • 根据 ethtool -g ethX 的输出,微调 ethtool -G 的 Ring Buffer 值。
  • PVE 宿主机的物理网卡优化是另一层面的优化,与 OpenWrt 虚拟机内部的 ethtool 命令不直接冲突。

如果你是x86 PVE虚拟机, 可以看下面的配置: # 我的WAN是eth1,lan是eth0( br-lan), 你的和我相反的话, 只需要调换eth0和eth1位置即可.

# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.

# 以下是为 x86 PVE 环境优化的网络配置

# 1. 开启网卡 RPS 软负载均衡 (RPS = Receive Packet Steering)
# 注意:eth1 (WAN), eth0 (LAN)
# 'f' (二进制 1111) 代表将流量分发到所有 4 个核心。
# 如果你的 OpenWrt VM 分配了更多核心(例如 8核),可以改为 'ff' (二进制 11111111)。
# /sys/class/net/ethX/queues/rx-N/rps_cpus 表示将接收队列N的CPU负载分配到哪些核心

# WAN (eth1)
if [ -d /sys/class/net/eth1/queues ]; then
    for file in /sys/class/net/eth1/queues/rx-*/rps_cpus; do echo f > $file; done
fi

# LAN (eth0)
if [ -d /sys/class/net/eth0/queues ]; then
    for file in /sys/class/net/eth0/queues/rx-*/rps_cpus; do echo f > $file; done
fi

# 2. 优化网卡 Ring Buffer (防止突发丢包)
# 根据 OpenWrt 虚拟机内部 ethtool -g 的结果调整:
# eth1 和 eth0 的 RX 最大是 1024,TX 最大是 256。
if [ -x /usr/sbin/ethtool ]; then
    # eth1 (WAN): RX 最大 1024, TX 最大 256
    ethtool -G eth1 rx 1024 tx 256
    # eth0 (LAN): RX 最大 1024, TX 最大 256
    ethtool -G eth0 rx 1024 tx 256
fi

# 3. 关闭校验和卸载 (解决某些虚拟化/隧道兼容性问题)
# 针对 WAN (eth1), LAN (eth0) 和桥接接口 (br-lan)
if [ -x /usr/sbin/ethtool ]; then
    ethtool -K eth1 tx off rx off
    ethtool -K eth0 tx off rx off
    ethtool -K br-lan tx off rx off
fi

# 4. 优化内核队列 (配合 Ring Buffer,避免内核侧拥塞)
sysctl -w net.core.netdev_max_backlog=16384
sysctl -w net.netfilter.nf_conntrack_max=65536
sysctl -w net.core.somaxconn=65536 # 提高 TCP 连接队列最大值

# 启用 BBR 拥塞控制 (如果需要,并确保内核支持)
# BBR 对于 Tailscale 这种 WAN 优化很有用
# sysctl -w net.ipv4.tcp_congestion_control=bbr
# sysctl -w net.core.default_qdisc=fq

exit 0

(极佳)检查openwrt是否支持BBR

要判断你的 OpenWrt 内核是否支持 BBR,最直接的方法是:

  1. SSH 连接到 OpenWrt。

  2. 检查内核模块: 运行以下命令:

    lsmod | grep bbr
    
    • 如果显示有 tcp_bbr 模块,说明内核支持 BBR。
    • 如果没有任何输出,说明内核可能没有编译 BBR 模块。
  3. 检查可用的拥塞控制算法: 运行以下命令:

    sysctl net.ipv4.tcp_available_congestion_control
    
    #示例
    root@iStoreOS:~# lsmod | grep bbr
    root@iStoreOS:~# sysctl net.ipv4.tcp_available_congestion_control
    net.ipv4.tcp_available_congestion_control = reno cubic #说明当前可用的拥塞控制算法只有 reno 和 cubic,不包含 bbr。
    root@iStoreOS:~#
    
    
    • 如果输出中包含 bbr (例如 net.ipv4.tcp_available_congestion_control = cubic reno bbr),说明 BBR 模块已加载并可用。
    • 如果输出中不包含 bbr,则不支持或未加载。

结论:我的 OpenWrt 当前不支持 BBR。

如何安装 BBR (如果不支持)?

如果你的 OpenWrt 内核默认不支持 BBR,你需要安装相应的内核模块

  1. 更新软件包列表:

    opkg update
    
  2. 查找 BBR 模块:

    opkg list | grep kmod-tcp-bbr
    
    # 示例
    root@iStoreOS:~# opkg list | grep kmod-tcp-bbr
    kmod-tcp-bbr - 6.6.110-r1 - Kernel module for BBR (Bottleneck Bandwidth and RTT) TCP congestion control. It requires the fq ("Fair Queue") pacing packet scheduler. For kernel 4.13+, TCP internal pacing is implemented as fallback.
    root@iStoreOS:~#
    # 这明确表示我的 OpenWrt 软件源中有可用的 BBR 内核模块,并且版本是 6.6.110-r1,这与我的内核版本是匹配的。
    
    • 如果能找到类似 kmod-tcp-bbr - 5.10.XX-1-YYYY 的包,说明有预编译好的模块。
  3. 安装 BBR 模块:

    opkg install kmod-tcp-bbr
    
    • 安装完成后,通常会自动加载模块,但最好重启一下 OpenWrt 或者手动加载 modprobe tcp_bbr
  4. 重启后再次验证: 登录 OpenWrt SSH 后,再次运行以下命令确认 BBR 已启用:

lsmod | grep bbr
sysctl net.ipv4.tcp_available_congestion_control
# 示范
root@iStoreOS:~# lsmod | grep bbr
tcp_bbr                16384 50
root@iStoreOS:~# sysctl net.ipv4.tcp_available_congestion_control
net.ipv4.tcp_available_congestion_control = reno cubic bbr
root@iStoreOS:~#

这次应该能看到 tcp_bbr 模块和 bbr 拥塞控制算法。

取消 rc.local 中 BBR 配置的注释: 最后,编辑 /etc/rc.local 文件,将这两行前面的 # 去掉(上面的代码):

sysctl -w net.ipv4.tcp_congestion_control=bbr
sysctl -w net.core.default_qdisc=fq

保存文件,然后再次重启 OpenWrt(这是为了确保 BBR 在每次开机时都被设置为默认)。

  1. 再次验证: 安装后,重复上面“检查可用拥塞控制算法”的步骤,确认 bbr 已经出现在列表中。

BBR 的优点 (对于 Tailscale/WAN 优化尤其突出):

  • 更好的带宽利用率: BBR 不像传统的基于丢包的拥塞控制算法 (如 Cubic) 那样依赖丢包来判断网络拥塞,它基于网络中的带宽和往返时间 (RTT) 来预测网络容量。
  • 更低的延迟: BBR 试图在不填满缓冲区的情况下,最大化发送速度,从而减少排队延迟 (Bufferbloat)。
  • 更少的丢包: 由于不依赖丢包作为拥塞信号,BBR 能够避免不必要的丢包。
  • 公平性: 在混合网络中,BBR 与其他拥塞控制算法也能较好地共存。

潜在的“不好的影响”或需要注意的地方:

  • 轻微的 CPU 额外开销: BBR 算法比 Cubic 更复杂一些,可能会带来微小的 CPU 额外计算量。但在你强大的 x86 4 核心 PVE 环境下,这几乎可以忽略不计。
  • 某些网络环境中可能表现不佳 (极少数): 虽然 BBR 在大多数广域网环境下表现优异,但在一些非常特殊、带宽极高但 RTT 变化剧烈的网络中,或者与某些极端保守的 TCP 实现混合时,理论上可能表现不如预期。但这种情况非常罕见,尤其是在家庭宽带和 VPN 隧道场景。
  • 内核版本依赖: kmod-tcp-bbr 模块必须与你的 OpenWrt 内核版本严格匹配。如果你的 OpenWrt 是自编译的或者经过大幅修改,可能需要自己编译 BBR 模块。但对于官方或常见固件,opkg 安装通常没问题。

开启 BBR 后,你应该会发现通过 OpenWrt 路由出去的 TCP 连接(包括通过 Tailscale 转发的 TCP 流量)在带宽利用率和延迟方面都有更好的表现。

使用多线程对抗丢包

使用8~32线程对抗即可, 用人海战术. 一般16就行了.

修改Openwrt 增大网卡环形缓冲区 (Ring Buffer)

这一步被上文openwrt安装RPS (软件负载均衡) 的配置文件统一合并.

这是最立竿见影的方法。如果不及时处理,包就会在这里被丢掉。

  1. 安装工具:

    opkg update
    opkg install ethtool
    
  2. 查看当前大小:

    # 查看 WAN 口 (eth0) 设置
    ethtool -g eth0
    
    • 会看到 Pre-set maximums (硬件支持的最大值) 和 Current hardware settings (当前值)。

    • 通常默认值很小(比如 256 或 512)。

  3. 修改为最大值: 假设最大值是 4096 (常见值):

    ethtool -G eth0 rx 1024 tx 1024
    # 先看一眼 eth1 的上限(通常也是 1024,但也确认一下) 
    ethtool -g eth1 # 如果上限也是 1024,直接拉满 
    ethtool -G eth1 rx 4096
    ethtool -g eth1
    
    • 原理: 增大缓冲区,让 CPU 来不及处理的突发数据包先在内存里“排队”,而不是直接被丢弃。

    • 注意: 这会消耗少量内存,但看截图还有 600MB+ 空闲,完全没问题。

  4. 修改启动脚本 (重要)

之前的 /etc/rc.local 脚本也需要对应修改,eth0 和 eth1 的命令要分开写,因为参数不同

请将启动脚本修改为:

# 优化网卡 Ring Buffer
if [ -x /usr/sbin/ethtool ]; then
    # eth0 (WAN) 支持双向调节,设为 1024
    ethtool -G eth0 rx 1024 tx 1024
    
    # eth1 (LAN) 只支持调节 RX,且支持更大,设为 4096
    ethtool -G eth1 rx 4096
fi

协议分析和软件

在配置上面的优化后, 速度从86 Mbits/sec提升到了399 Mbits/sec !

根据 399 Mbits/sec 测速结果NAS 支持的服务,最佳使用姿势如下:

场景 推荐协议 推荐软件 预期体验
异地 搬运大文件 (几十GB) FTP FileZilla (开启多线程) 🚀 极速 (跑满 280Mbps,约 35MB/s)
异地 看电影/浏览图片 WebDAV RaiDrive / PotPlayer 📺 流畅 (拖动进度条稍有延迟,播放稳)
异地 下载单个大文件 WebDAV NDM (32线程下载) ⚡ 极速 (跑满带宽)
异地 改文件名/删文件 SMB Windows 资源管理器 🐢 稍慢 (但在可接受范围内)

建议:

既然开了 Tailscale,可以放心地试一下 FTP + FileZilla。相比 SFTP,标准 FTP 在 Tailscale 隧道里 CPU 消耗更低,速度可能会更稳!

FTP+filezilla

最大10线程, 设置中无法再增加,设置只能1-10并发传输。
客户端 - FileZilla中文网

Air Explorer +ftp

网络在 8~16 线程 下表现最稳, 设置上传16下载8

并行分块下载大文件:已勾选

FTP 协议 下,需要了解 “单个大文件”“一堆小文件” 的区别:

  • 场景 A:上传一个文件夹(里面有 100 张照片或 10 集电视剧)

    • 速度: **起飞 。

    • 原理: 软件会启动 16 个线程,同时传 16 个文件。总速度就是 16 个文件的叠加,预计能达到 25-40 MB/s

  • 场景 B:上传“单个” 20GB 的压缩包

    • 速度: 可能只有 5-10 MB/s(取决于 Air Explorer 对 FTP 分片上传的支持程度)。

    • 原理: 大多数 GUI 客户端(包括 Air Explorer)在 FTP 协议 下,往往不支持把“单个文件”切成几块同时上传(因为 FTP 协议本身对并发写入支持较差)。这时候它可能会回落到单线程。

    • 解决: 如果发现传单个大文件慢,不用怀疑设置,那是软件和协议的物理限制。Rclone 是解决这个单一场景的唯一终极方案。

rclone

Site Unreachable

Rclone downloads
RcloneBrowser | Simple cross platform GUI for rclone. Supports macOS, GNU/Linux, BSD family and Windows.
Releases · kapitainsky/RcloneBrowser

Rclone + Rclone Browser 是目前在 Windows 上免费实现 多线程分片下载/上传(榨干带宽)的终极方案。


第一步:下载必要软件

需要下载三个东西(都是绿色软件,解压即用):

  1. Rclone (核心程序):

  2. Rclone Browser (图形界面):

  3. WinFsp (挂载依赖 - 可选但推荐):

    • 如果以后想把 NAS 挂载成电脑的一个盘符(像 Z 盘),必须安装这个。

    • 下载地址:https://winfsp.dev/rel/


第二步:整理与安装

  1. 安装 WinFsp: 双击安装包,一路 Next 安装即可。

  2. 解压 Rclone: 把下载的 rclone-v1.xx-windows-amd64.zip 解压到一个固定目录,例如 D:\Tools\Rclone。会看到 rclone.exe

  3. 解压 Rclone Browser: 同样解压,建议放在 D:\Tools\RcloneBrowser


第三步:配置连接 (核心步骤)

我们需要先用 rclone.exe 生成配置文件,告诉它怎么连 NAS。我们使用 SFTP 协议,因为它最稳定且支持分片。

  1. 打开资源管理器,进入存放 rclone.exe 的文件夹 (D:\Tools\Rclone)。

  2. 在地址栏输入 cmd 并回车,打开黑窗口。

  3. 输入 rclone config 并回车。

  4. 按照以下交互进行输入 (请根据实际情况):

    • n (新建 New remote) -> 回车

    • name: 输入 MyNAS (名字随便起) -> 回车

    • Storage: 会出现一长串列表,找到 SFTP (通常是数字 40+),输入 sftp -> 回车

    • host: 输入 Tailscale IP 123.123.121.121 -> 回车

    • user: 输入 NAS 用户名 -> 回车

    • port: 输入 22 (或者 SSH 端口) -> 回车

    • pass: 输入 y (Yes, 输入密码) -> 回车

      • 注意:输入密码时屏幕不会显示任何字符,输完按回车,再输一次确认。
    • key_file: 直接 回车 (留空)

    • ...接下来的选项(key_file_pass, md5sum 等)全部直接 按回车 使用默认值即可...

    • 直到看到 Edit advanced config? -> 输入 n (No) -> 回车

    • 最后看到 Keep this "MyNAS" remote? -> 输入 y (Yes) -> 回车

    • 输入 q (Quit) 退出。

恭喜,配置文件生成完毕!


第四步:设置 Rclone Browser (连接 GUI)

  1. 运行 RcloneBrowser.exe

  2. 如果是第一次运行,它会弹窗让设置路径:

    • rclone location: 点击 Browse,选择刚才解压的 D:\Tools\Rclone\rclone.exe

    • rclone.conf location: 通常它会自动识别。如果没有,它通常在 C:\Users\用户名\.config\rclone\rclone.conf

  3. 点击 OK

  4. 现在应该能在主界面看到刚刚创建的 MyNAS 了。双击它,稍等片刻,就能看到 NAS 里的文件列表了。


第五步: 关键性能调优 (如何跑满)

如果不设置这一步,它和普通软件没区别。我们要开启多线程分片

  1. 在 Rclone Browser 中,点击左上角的 File -> Preferences

  2. 找到 Transfers (这里是默认设置,针对多文件):

    • Transfers: 建议改为 810 (同时传 8 个文件)。

    • Checkers: 改为 16

  3. 针对“单文件跑满带宽”的设置:

    • Rclone Browser 的全局设置里可能没有直接暴露 multi-thread-streams,我们需要在执行任务时设置,或者修改 Rclone Browser 的默认参数。

    • 推荐做法:

      • 在 Rclone Browser 里选中要下载的文件/文件夹,点击 Download

      • 在弹出的对话框中,会看到一行 "Extra arguments" (额外参数)。

      • 请在这行里填入:

        Plaintext

        --multi-thread-streams 8 --buffer-size 64M
        
      • (解释:--multi-thread-streams 8 表示把一个大文件切成 8 块同时下;--buffer-size 64M 增大内存缓存防止断流)

  4. 点击 Run

第六步 (可选):挂载为本地硬盘 (像 RaiDrive 那样)

如果想把它变成一个 Z 盘,并且拥有 Rclone 的高性能:

  1. 在 Rclone Browser 主界面,选中 MyNAS

  2. 点击上方的 Mount 按钮。

  3. Mount Point: 选择一个盘符 (例如 Z:)。

  4. Extra arguments 填入:

    Plaintext

    --vfs-cache-mode full --vfs-cache-max-age 24h --vfs-read-chunk-size 64M --vfs-read-chunk-size-limit off
    

    (这一串参数非常重要,开启全功能缓存,能极大提升在 Windows 资源管理器里的浏览和播放体验)

  5. 点击 Run


iperf3打流测试最大速度

NAS-Docker安装

  1. 安装networkstatic/iperf3
  2. 端口为5201:5201
  3. name=iperf3-server
    image

Windows安装

第一步:下载 iPerf3

  1. 点击此链接下载 Windows 64位版本: iperf3-3.1.3-win64.zip (如果链接打不开,请访问 iperf.fr 官网下载)

第二步:解压与运行(最简便方法)

  1. 下载后,将压缩包解压到一个文件夹(比如直接解压在“下载”里的 iperf-3.1.3-win64 文件夹)。

  2. 进入解压后的文件夹,会看到 iperf3.execygwin1.dll 这两个文件。

  3. 关键操作: 在当前文件夹的地址栏(就是显示文件路径的地方),输入 cmd 并按回车。

    • 这会自动打开一个命令提示符窗口,并且路径已经定位到了这个文件夹。

./iperf3 -c 192.168.50.201 -P 8 即可,后面的是线程数。

Linux安装

sudo apt-install iperf3
有弹窗选择NO。

  1. 为了方便查看测试结果: 现在是为了排查网络问题。如果选择 <Yes>(作为守护进程后台运行),iperf3 会在后台默默工作,在屏幕上看不到“谁连上来了”、“当前速度是多少”等实时日志。

  2. 按需运行: 作为测试工具,通常只需要在想测速的时候手动运行一下即可,没必要让它 24 小时占用后台资源和端口。
    iperf3 -c 192.168.50.201 -P 8

Retr (Retransmission) 重传数,严重的重传会导致 TCP 拥塞控制算法(CUBIC/Reno)疯狂降低发送速率,这就是为什么速度上不去且剧烈波动的原因。


结果分析

  • 如果 iPerf3 能跑出 200Mbps (约 25MB/s) 以上且比较稳定,说明网络链路、Tailscale 加密、CPU 性能都没问题

  • 如果 iPerf3 依然在 2~11MB/s 波动,说明是运营商对 UDP 流量进行了 QoS 干扰(见下文 MTU 优化)。

如何针对笔记本进行优化?(可选)

如果想减轻 OpenWrt 和 AP 之间那根网线的压力,并降低笔记本的延迟,可以在 Windows 笔记本 上添加一条 “静态路由”

目的: 让笔记本直接把数据包扔给 Ubuntu,跳过 “笔记本 -> OpenWrt -> Ubuntu” 这个绕路环节。

操作步骤(仅在笔记本电脑上执行):

  1. 以管理员身份打开 CMD (命令提示符)

  2. 添加路由命令: 假设 Ubuntu Server IP 是 192.168.6.x (例如 192.168.6.100),NAS 网段是 192.168.50.0

    PowerShell

    # route add -p [目标网段] mask [掩码] [下一跳网关IP]
    # 请将 192.168.6.100 替换为 Ubuntu 的真实 IP
    route add -p 192.168.50.0 mask 255.255.255.0 192.168.6.100
    
    • -p: 表示永久生效 (Persistent),重启后还有。

优化后的路径:

  • 之前: 笔记本 -> AP -> OpenWrt -> AP -> Ubuntu

  • 之后: 笔记本 -> AP -> Ubuntu (少走了一次 OpenWrt,少了一次转发延迟)

深度解析:为什么 -P 4 反而比 -P 16 更快?

可能会觉得:“之前不是说线程越多越好吗?为什么现在线程少了反而快了?”

这得益于之前做的一系列底层优化(r8125驱动、多队列、443端口伪装),现在的网络环境变了:

1. 1:1 完美映射 (CPU 效率最高)

  • 硬件层: 的网卡现在有 4 个 接收队列 (rx-0rx-3)。

  • 应用层: 开启了 4 个 iPerf3 线程 (-P 4)。

  • 效果: 理想情况下,Linux 内核会将这 4 个数据流分别分配给 4 个不同的 CPU 核心和网卡队列处理。

    • 没有争抢: 每个核心专心处理一个流,上下文切换(Context Switch)最少,CPU 缓存命中率最高。

      • 效率极致: 这就是为什么看到了 323 Mbps 的新高。

2. 边际效应递减 (过犹不及)

  • 当开 -P 16 时:

    • 网卡只有 4 个队列。这意味着平均每个队列(和对应的 CPU 核心)要同时处理 4 个 TCP 流。

    • 后果: CPU 需要频繁在不同的流之间切换,增加了软中断的开销。而且,16 个流同时抢占带宽,会导致更激烈的拥塞控制竞争,反而增加了重传(Retr)的混乱程度。

3. BBR 的强大能力

  • 在未优化前(默认 CUBIC 算法),单线程“太怂”,所以需要用 16 个线程(人海战术)来填满带宽。

  • 现在开启了 BBR 且换了 443 端口,单线程的“战斗力”大大增强。4 个精锐部队(BBR 线程)已经足够打满 350Mbps 的带宽了,不需要 16 个杂牌军来凑数。


💡 最终建议:如何选择线程数?

在未来的实际使用(如 Rclone、Air Explorer)中,请遵循以下原则:

  1. 基准选择: 48

    • 设置为 4:最省 CPU,理论效率最高。

    • 设置为 8:容错率稍好。如果某一个线程突然断流,还有其他 7 个撑着。

  2. 什么时候用 16+?

    • 只有当发现 4 线程跑不满带宽(例如卡在 100Mbps),且 CPU 占用率很低时,才尝试增加到 16。

    • 在现在的环境下,超过 8 线程纯属徒增功耗。

在 OpenWrt 上添加静态路由

需要做的是在 OpenWrt 上添加一条静态路由,告诉它:“凡是有人找 192.168.50.x,别往外网扔,转交给 Ubuntu (192.168.6.152) 处理”。

操作步骤:

  1. 登录 OpenWrt (iStoreOS) 后台

  2. 进入 网络 (Network) -> 静态路由 (Static Routes)

  3. 点击 添加 (Add)

  4. 填写如下信息(请根据实际 IP 填写):

    • 接口 (Interface): lan

    • 目标对象 (Target): 192.168.58.0 (注意:提到的是 58 段,如果之前是 50 段,请核对清楚)

    • 子网掩码 (Netmask): 255.255.255.0 (/24)

    • IPv4 网关 (Gateway): 填写 Ubuntu Server 的局域网 IP (例如 192.168.6.100)

    • 度量值 (Metric): 0 (或者留空)

  5. 点击 保存并应用

生效后: 手机再次访问 192.168.50.201 -> 发给 OpenWrt -> OpenWrt 查表发现该找 Ubuntu -> 转发给 Ubuntu -> 进入 Tailscale 隧道 -> 成功!

posted @ 2025-11-19 17:38  舟清颺  阅读(611)  评论(0)    收藏  举报