废话
已经好久没有更新博客了,主要是最近有新的项目,加上自己婚期将近,忙的事比较多,所以就没更新了
昨天我的玩客云旁网关报废了,迫不得已出巨资又整了一台X86的小主机,打算用来做软路由,接替玩客云的岗位
X86做软路由有一些网卡有问题,需要关闭TSO才能正常使用,所以整了一个脚本来做测试
简介
TSO是什么
假设CPU要做一顿“发送数据”的大餐:
没有 TSO:CPU需要自己把一整块大肉(数据包)切成无数小块(标准MTU大小),再一块块递给网卡发出。这非常消耗CPU算力。
有 TSO(开启状态):CPU直接把一整块大肉丢给网卡,并说:“帮我切成小块再端出去!” 网卡硬件接过肉自己切好发出。CPU省下了切菜的力气,可以去处理其他任务。
所以,TSO 本质上是个“硬件加速”功能,对普通的电脑、服务器来说,通常百利而无一害。
为什么 X86 软路由有时要关闭 TSO
软路由既是一台电脑,又是一台“快递分拨中心”。当它用电脑的硬件去干路由器的活时,TSO 这个功能就可能“帮倒忙”:
驱动Bug导致断流或重启:这是最常见的原因。部分网卡(尤其是Intel I225-V等2.5G网卡)的驱动程序在Linux下的TSO实现存在Bug。开启后可能导致网卡“卡死”断流,甚至导致软路由系统内核崩溃重启。关闭TSO是回避Bug的无奈之举。
“分拨中心”不喜欢“大包裹”:路由器的核心工作是“快速接收→查表→快速转发”小数据包。TSO把数据包“变大”再交给网卡,实际上改变了数据包的大小和形态,这会额外增加路由转发时的CPU开销,反而让效率下降。因此像pfSense这样的专业防火墙系统,默认就是关闭TSO的。
虚拟机里的“水土不服”:虚拟化运行软路由,半虚拟化网卡(VirtIO)的TSO跟物理网卡的TSO经常互相冲突,导致性能下降。这时虚拟化教程通常都会建议关闭TSO。
测试原理
这个检测方法本质上就是下载数据,然后对比开启和关闭后的下载速率,如果开启和关闭下载速率相差不大,那么就直接开启就可以,如果开启和关闭后下载速率相差较大,那么就更具情况来开启或者关闭
测试需要软件/环境
测试使用的软件工具是iperf3,需要有一台电脑来运行iperf3的服务端
iperf3-windows端项目地址:https://github.com/ar51an/iperf3-win-builds iperf3二进制文件项目地址:https://github.com/userdocs/iperf3-static 还有一个利用AI自制的脚本:【点击下载】
测试方法
下载/运行服务端
打开项目地址,点击tags

然后点击最新的版本号

点击下载zip包

把下载的zip包进行解压

在地址栏输入cmd并回车打开命令行窗口

在命令行窗口中输入下面命令
iperf3 -s

下载/运行客户端开始检测
打开二进制项目地址,点击Tags

点击版本号,客户端和服务端需要下载同一个版本

点击下载二进制文件

把二进制文件上传到openwrt里面,记住上传的路径

授权可执行
chmod +x iperf3-i386

上传脚本

授权脚本可执行
chmod +x tos-file.sh

修改脚本# --- 配置区域 ---里面的IPERF3_CMD变量,改为刚刚上传的iperf3的位置,修改完成后保存并退出

执行脚本
./tos-file.sh

选择网卡

输入服务端地址

确认配置无误回车开始

等待出测试结果

STO永久关闭方法
如果需要关闭STO的话,创建一个脚本,脚本名称为tsooff,赋予可执行权限,然后放到/etc/init.d目录下,然后加入开机自动执行
手动关闭STO
ethtool -K eth0 tso off
注意把名称中的eth0改为实际的网卡名称,可以使用ip add show命令查询网卡名称
进入/etc/init.d目录
cd /etc/init.d
创建脚本
vi tsooff
脚本内容:
#!/bin/sh /etc/rc.common
START=99
STOP=15
start() {
echo start
ethtool -K eth0 tso off
}
stop() {
echo stop
}
赋值权限
chmod +x tsooff
设置开机执行
/etc/init.d/tsooff enable
本站资源下载
本站带宽小,下载速度慢,建议从项目地址上下载,本站提供的下载连接只适合做为应急打不开项目地址的情况下使用
iperf3-windows端:【点击下载】
iperf3-二进制:【点击下载】
测试脚本:【点击下载】