分享一下 OpenWRT SQM QOS 的基础配置,以及 PCDN/BT/PT 上行满载的处理方案 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
OpenWrt 是一个专门面向嵌入式设备的 Linux 发行版。你可以将 OpenWrt 支持的型号的嵌入式设备,比如各种路由器上的系统,换成一个有更多可能性可以折腾的 Linux 系统。
OpenWrt 官方网站
xwchenhui
V2EX    OpenWrt

分享一下 OpenWRT SQM QOS 的基础配置,以及 PCDN/BT/PT 上行满载的处理方案

  •  1
     
  •   xwchenhui 2023-11-21 16:01:11 +08:00 6244 次点击
    这是一个创建于 691 天前的主题,其中的信息可能已经有所发展或是发生改变。

    众所周知,SQM 在应对缓冲区膨胀时候的效果非常好,但是在连接数高、上行满载的网络环境下,最简单的piece_of_cake.qos还是差强人意,会出现正常网页/app 浏览由于偶发性丢包引起的高延迟,运气不好某个请求甚至连续丢包到失败;或者你有公网 IP 连接的时候,上行流量没法被很好的分配;

    这几天看了一下layer_cake.qos和 DSCP 相关的内容,解决了上面提出的问题。

    说明:

    1. 仅针对上行
    2. 图传是 imgbb ,看不到带梯子,点击跳大图

    对比效果

    这是直接使用piece_of_cake.qos时上行接口一周的监控数据,第一张表可以看到上行是时刻满载的;第二张表可以看到高峰期 PCDN 对整个网络延迟的影响,高达 100ms ;第三张表可以看到拥塞时的丢包统计数据;

    值得一提的是,这里主要是因为 PCDN 的包多,且和正常流量混在了一起;实际使用,包括测速显示的网络延迟并没有那么高;主要问题还是上面说到的,SQM 通过丢包尽可能满足延迟需求的时候是无差别攻击,偶尔会出现正常浏览的包被丢掉。

    最严重的应当是高峰期上传、实时语音视频,以及公司访问家里的时候,受 PCDN 的影响就会很明显。

    这是调整后的数据,BE 即 Best Effort ,尽力而为,大多数数据包没分类都会被分到这里,最高可以用满整个上行,其实大部分时候,它就相当于piece_of_cake.qos

    BK 即 Bulk ,DSCP CS1 及其他的慢速流量都会被分配到这里,SQM diffserv4 规则下,最多只能用 3648Kbit 的带宽

    可见已经吃满了上行,且存在延迟和丢包。

    BE 和 BK 在 15:25 之后的数据是我特意在公司直接播放了家里的一段高码率视频,把上行拉到了 40-50Mbps ,可以看到 BK 明显被压制;调整前,公网下载家里的文件,最高就 5Mbps 的速度,高峰期还没有;调整后,几乎可以吃满 50Mbps 的带宽,此时去看 PCDN 的速率被压到了 4Mbps 左右;

    SQM 配置参考

    首先是基于你的上下行带宽*85%-95%设置一个值

    注意使用layer_cake.qos,才能为 PCDN/BT/PT 的流量分类

    注意黄色框的内容是要填写的

    入口(下行)填:

    nat dual-dsthost ingress 

    出口(上行)填:

    nat dual-srchost diffserv4 

    这里的 nat dual-xxx 意思是在 NAT 的环境下实施每 IP 公平策略,即所有 IP 均分带宽;其实关于这点我也很奇怪,如果是每 IP 公平,按理说不应该会有上面说的高峰期 5Mbps 都达不到,应该是 http 服务器和 pcdn 主机平分 50Mbps 的带宽;除非它把我那 70 多个几乎没流量,沉默的波比设备也算进去了...

    ingress 我忘了啥意思了...

    layer_cake.qos默认会使用diffserv3,其实我觉得也足够了,家用主要还是把 background traffic 处理掉,毕竟绝大部分时候我们跑的都是 Best Effort

    如果不清楚什么是数据包开销,直接按图设置即可;这个值偏大会浪费一点带宽,但是小了会影响 QOS 的效果;

    给 PCDN/BT/PT 流量打上低速 DSCP 标识

    因为我家的 PCDN 都是单独的机器,所以这里只贴个按 MAC 处理的规则,如果不是,或者有更精细的处理需求的,可以按照这个思路想办法:

    iptables -t mangle -A PREROUTING -m mac --mac-source xx:xx:xx:xx:xx:xx -j DSCP --set-dscp-class CS1 -m comment --comment "dcsp-wxedge" 

    需要特别注意的是,必须关闭快速转发引擎/FastPath 之类的东西,不然打标不生效!

    参考:

    SQM Details

    更加精细化,可以给指定 URL 分类的方案

    15 条回复    2025-06-29 23:02:44 +08:00
    datocp
        1
    datocp  
       2023-11-22 16:58:16 +08:00
    SQM 确实是个挺神奇的东西,因为被很多人誉为有效果。。。当然之前的版本被我判定为没有效果,

    当年研究它和传统的 htb 基本 dstport 的主要性能差别
    1.怎么在 openwrt 给包打 DSCP 标记,没有标记就没有分流的可能,所以哪来的什么效果
    2.性能非常低级的每包命中,如果真的在一个多人共享的网络,估计也许会导致路由崩溃

    htb 有这种包到链接的实现
    -A PREROUTING -i eth1 -j DSCP --set-dscp 0x00
    -A PREROUTING -i eth1 -j CONNMARK --restore-mark --nfmask 0xff --ctmask 0xff
    -A QOSO -j CONNMARK --save-mark --nfmask 0xff --ctmask 0xff

    pkts bytes target prot opt in out source destination
    38M 7364M CONNMARK all -- * * 0.0.0.0/0 0.0.0.0/0 CONNMARK restore mask 0xff
    35M 7132M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 mark match ! 0x0/0xff

    据说后来有不依赖 DSCP 的实现,也不知道现在如何
    xwchenhui
        2
    xwchenhui  
    OP
       2023-11-22 19:21:33 +08:00
    @datocp 专业,我对其原理了解的不多。不过我用 SQM 也有 5 、6 年的时间了,之前主要通过直接扔几十个热门种拉满上下行,然后浏览网页以及跑测速测试,对于 bufferbloat 和延迟降低/平稳性是有效果的;

    我是这么理解的,默认的 piece_of_cake 模式下,没有流量分类,即不依赖 DSCP 的实现,纯粹就是延迟高于目标值,就开始通过丢包的方式控制数据包的速率,最近一两年的版本还加入了对每 IP/设备公平性的支持;当然他的实际原理肯定还是更复杂的,只是我并没有更深入的了解了。

    但是这种方案对 PCDN 而言控制就不太好了,虽然我不知道它是怎么突破每 IP 公平这个策略的……所以我用回 DSCP 这种复杂的,虽然控制不了下行,但是目前的签约带宽下行不会是问题;上行 DSCP 的控制权在我这,反而能更好的管控流量。
    MenGQiu
        3
    MenGQiu  
       2023-11-22 21:52:56 +08:00
    大佬好,OpenWrt 23.05.2 版本防火墙用的是 fw4 ,请问打上低速 DSCP 标识要怎么搞?谢谢
    xwchenhui
        4
    xwchenhui  
    OP
       2023-11-23 11:19:00 +08:00
    @MenGQiu fw4 应该是基于 nftables 吧?抱歉,我对这个还不是很了解;你可以尝试一下使用关键字 nftables+dscp 查一下看看
    MenGQiu
        5
    MenGQiu  
       2023-11-23 12:13:41 +08:00
    @xwchenhui 好的,谢谢。
    Damn
        6
    Damn  
       2023-11-23 19:40:38 +08:00
    我想知道如何保证局域网里一个特定 mac 地址的设备时刻优先?
    老家运营商 iptv 给的 ott 盒子,需要跟所有设备竞争带宽。
    保留带宽又不划算,电视也不是 24 小时都开的。
    xwchenhui
        7
    xwchenhui  
    OP
       2023-11-23 22:42:57 +08:00
    @Damn 其实就用主楼那个打 DSCP 标识的方法就可以,不过不是打 CS1 ,AF3x 或者 CS3 都行,分别对应流媒体和广播媒体

    这里有个小问题,假设是用我主楼贴的配置; SQM 内部会根据总带宽划分 4 个 Class ,满载的时候,每个能占用的最大带宽都不一样,AF3x 或者 CS3 所属的分类,只能保证 50%的带宽给它们;不过我觉得这个问题不大,SQM 可以保证设备独享,不会被抢走

    但是,还有个大问题……我这是仅针对上行的,上行比较自主可控,打标容易;下行就要麻烦多了,下行由于 imq/htb 的关系,得用 veth/nftables 解决

    可以参考下 veth 的方案,挺复杂的: https://forum.openwrt.org/t/ultimate-sqm-settings-layer-cake-dscp-marks-new-script/53209
    NeedforV2
        8
    NeedforV2  
       2024-07-15 17:39:58 +08:00
    感谢 OP !
    suhh
        9
    suhh  
       2024-08-03 18:26:38 +08:00
    @xwchenhui 使用了你的命令并且检查 iptable 确实有流量生效了,然后我使用 tcpdump 对流量标记进行分析发现流量并没有被标记,奇怪的是我对 WXY 的下载流量可以标记成功,上传流量就无法标记成功 我甚至换了固件也还是这样,网上搜不到解决方案,tcpdump -i any host 192.168.31.189 -vv 楼主可以试一下这个命令看看能查看到流量带有 tos 标记吗
    stefwoo
        10
    stefwoo  
       2024-08-08 22:10:20 +08:00
    @xwchenhui 请问第一张图片显示延迟丢包这些是通过哪个插件显示的?我搜索了半天没找到
    zzlzhang
        11
    zzlzhang  
       2024-09-15 02:20:48 +08:00
    求问 在
    nat dual-srchost diffserv4 这一行设置里
    是优先执行 dual-srchost 的按设备公平流量
    还是优先执行 diffserv4 的 DSCP
    GPT 回答是后者
    那么实际上 不是无视了 dual-srchost 的按设备公平流量么
    xwchenhui
        12
    xwchenhui  
    OP
       356 天前
    @suhh 我之前就查过,上行流量是生效的;下载没有都是 CS0 ,至少广东电信是这样的;你是不是搞反了接口
    xwchenhui
        13
    xwchenhui  
    OP
       356 天前   1
    @stefwoo collectd-mod-sqm
    xwchenhui
        14
    xwchenhui  
    OP
       356 天前
    @zzlzhang 这个还真没研究过,我理解是先执行公平流量;然后每个设备的出包按 DSCP 排序;
    bclerdx
        15
    bclerdx  
       105 天前
    感谢 OP 的这篇文章给我带来的思路与灵感,我的 Tomato DualWAN 使用了类似的 DSCP 方式暂时排除了上行满载的问题了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2365 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 15:49 PVG 23:49 LAX 08:49 JFK 11:49
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86