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 · 3820 次点击
    这是一个创建于 401 天前的主题,其中的信息可能已经有所发展或是发生改变。

    众所周知,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 分类的方案

    14 条回复    2024-10-21 16:33:51 +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  
       164 天前
    感谢 OP !
    suhh
        9
    suhh  
       145 天前
    @xwchenhui 使用了你的命令并且检查 iptable 确实有流量生效了,然后我使用 tcpdump 对流量标记进行分析发现流量并没有被标记,奇怪的是我对 WXY 的下载流量可以标记成功,上传流量就无法标记成功 我甚至换了固件也还是这样,网上搜不到解决方案,tcpdump -i any host 192.168.31.189 -vv 楼主可以试一下这个命令看看能查看到流量带有 tos 标记吗
    stefwoo
        10
    stefwoo  
       140 天前
    @xwchenhui 请问第一张图片显示延迟丢包这些是通过哪个插件显示的?我搜索了半天没找到
    zzlzhang
        11
    zzlzhang  
       102 天前
    求问 在
    nat dual-srchost diffserv4 这一行设置里
    是优先执行 dual-srchost 的按设备公平流量
    还是优先执行 diffserv4 的 DSCP
    GPT 回答是后者
    那么实际上 不是无视了 dual-srchost 的按设备公平流量么
    xwchenhui
        12
    xwchenhui  
    OP
       66 天前
    @suhh 我之前就查过,上行流量是生效的;下载没有都是 CS0 ,至少广东电信是这样的;你是不是搞反了接口🤦‍
    xwchenhui
        13
    xwchenhui  
    OP
       66 天前   ❤️ 1
    @stefwoo collectd-mod-sqm
    xwchenhui
        14
    xwchenhui  
    OP
       66 天前
    @zzlzhang 这个还真没研究过,我理解是先执行公平流量;然后每个设备的出包按 DSCP 排序;
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2977 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 14:32 · PVG 22:32 · LAX 06:32 · JFK 09:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.