I built a real-time web UI for CAKE SQM stats

I built a real-time web UI for CAKE SQM stats — and it runs great on my OpenWrt

If you're running CAKE for SQM, you already know the drill: SSH in, run tc -s qdisc, squint at the output, repeat. I wanted something better — so I built cake-stats, a lightweight web UI that shows your CAKE statistics live, with graphs, right in the browser.

Here's the repo: https://github.com/galpt/cake-stats


What it does

It polls your CAKE qdisc every 100 ms and pushes the stats to your browser over SSE (Server-Sent Events) — no WebSocket, no page refresh needed. You get a live table of all your tiers (target, interval, delays, drops, marks, flows, and more) plus sparkline graphs for throughput, latency, and drop rate per interface. Click any sparkline to get a full-screen history chart.


Why I built it this way

I care about it actually running well on real router hardware, not just on my dev machine. That meant making some deliberate choices:

  • Fiber v3 for the HTTP layer — it's fast, battle-tested, and has a minimal footprint

  • zerolog for structured logging with near-zero allocations

  • easyjson for pre-generated serializers so the hot poll loop doesn't hammer the GC

  • A single static binary with no runtime dependencies — just drop it on your router and run it

The result is a program that comfortably sits in the 4–12 MB RSS range depending on your hardware, kernel malloc behaviour, and the number of browser clients connected.


My setup

I tested it on an Intel N100 with 8 GB RAM and a 120 GB SSD — I know, overkill for a home router, but the point isn't the specs. The point is that it's designed to be small and portable, so it should fit just fine on something like a GL-MT3000. I haven't tested that specific model yet, but feel free to try it and let me know how it goes.


Getting started


# Install (auto-detects your architecture)

sh install.sh

# Or with custom options

sh install.sh --port 11112 --interval 100ms

# Uninstall cleanly

sh uninstall.sh

Then open http://<router-ip>:11112 in a browser. That's it.


A few things worth noting

  • No auth or HTTPS built in — keep it on your trusted LAN or behind a reverse proxy

  • CAKE-only — it reads what CAKE sees when it's actively shaping traffic, so you get the real numbers

  • The UI is intentionally minimal; less UI means less CPU, memory, and disk

  • It'll also work on a small VPS (1c/1g is fine) if you just want to keep an eye on traffic without SSH-ing in every few minutes

It's MIT licensed, so fork it, adapt it, make it yours. Issues and PRs are welcome — just know I'd rather keep this lean and focused than turn it into a kitchen-sink monitoring platform. Big feature ideas are probably better off as a separate project.

Would love to hear if anyone gets it running on low-spec hardware!

5 Likes

My man, thank you for this fantastic tool! Now I can quit trying to write an sqm monitoring plugin for netdata 1.3! lol I bet this will work with the upcoming cake_mq too!

I installed on a gl.inet MT-6000 Flint 2 running the pesa1234 build. For noobs like me here is how it can be done on Windows:

Download “cake-stats-linux-arm64.tar.gz” from Releases · galpt/cake-stats.
Extract it once to get “cake-stats-linux-arm64.tar.gz”.
Extract that to get “cake-stats-linux-arm64”.
To keep it simple, rename that to “cake-stats”.

Login to the router using WinSCP. WinSCP Official Site
Drag “cake-stats” to /usr/bin.
Right click /usr/bin/cake-stats, Properties, and set Permissions to Octal 0755.

Open the WinSCP terminal Shift+Ctrl+T.
Type “cake-stats” and hit enter.
You should see a nice echo:

The terminal will hang until timout. Not sure what to do about that.

Finally, in your browser go to “http://127.0.0.1:11112”. Booyah!

2 Likes

Hey JackH,

Glad to hear the tool is working out for you! Seeing it running on a Flint 2 is great.

Regarding the "hang" you experienced: that's actually normal behavior when running a server application in the foreground on Linux/OpenWrt. The terminal stays focused on the cake-stats process.

The install.sh script I included handles this by ensuring the app runs in the background automatically so your terminal stays usable. While you could manually run it in the background using ./cake-stats &, I wouldn't recommend it for most users. Managing or "killing" background processes manually can be a bit of a headache if you're not used to it.

That’s why I suggest using the scripted route—it keeps the setup, execution, and removal much cleaner.

Recommended Installation

  1. Install git on your OpenWrt:
opkg update && opkg install git

  1. Clone the repo directly to your router:
git clone https://github.com/galpt/cake-stats.git

  1. Run the installer:
cd cake-stats      # Enter the cloned directory
sh install.sh      # Run the installer script

This script handles the permissions and setup for you. By default, it'll be available at http://<your-router-ip>:11112. Using the install.sh and uninstall.sh scripts is much faster and ensures everything is wiped properly if you ever want to remove the tool later.

How to Update

Whenever there's a new update on GitHub, you can just:

  1. Run sh uninstall.sh inside the folder.
  2. Go back one directory: cd ..
  3. Delete the old folder: rm -rf cake-stats
  4. Then just repeat the git clone and sh install.sh steps above to get the latest version.

Regarding cake_mq, if it ends up being officially supported in Linux and OpenWrt (like fq_codel or the current cake), I'll definitely look into updating this tool to support it.

Let me know if you run into any issues with the script!

1 Like

You can parse single command ouptput by any monitor tool with timeline graphs?

Hi,

First of all, thank you for your work on cake-stats — it’s a very clean and genuinely useful tool. The real-time visibility into CAKE behavior makes tuning SQM much easier, especially with diffserv setups.

I’m running OpenWrt x86 (25.12.0-rc) on an Intel N5105 system with cake_mq enabled on a multi-queue NIC.

Because this build uses apk instead of opkg, and git HTTPS support was not available by default, I had to install it slightly differently:
• Downloaded the release tarball manually using uclient-fetch
• Extracted it locally
• Copied the binary to /usr/bin/cake-stats
• Created a custom procd init script in /etc/init.d/
• Enabled and started it from there

After that, everything worked perfectly.

I also want to confirm for others using cake_mq:

Even with multiple internal CAKE instances per interface (4 in my case), no adaptation is required. The statistics are correctly aggregated at the logical interface level, and cake-stats displays consolidated values properly for both egress and ingress, including diffserv classes.
So cake_mq works out of the box — no changes needed.

One small suggestion regarding the init script:
It may be helpful to include a stop_service() function explicitly and add a slightly more defensive/robust procd configuration (argument separation, respawn limits, binary existence check). I ended up using the following version, which has been working reliably:


#!/bin/sh /etc/rc.common

START=95
STOP=10
USE_PROCD=1

PROG="/usr/bin/cake-stats"
PORT="11112"
INTERVAL="100ms"
HOST="0.0.0.0"

start_service() {
    [ -x "$PROG" ] || return 1

    procd_open_instance
    procd_set_param command "$PROG" \
        -host "$HOST" \
        -port "$PORT" \
        -interval "$INTERVAL"

    procd_set_param stdout 1
    procd_set_param stderr 1
    procd_set_param respawn 3600 5 5
    procd_close_instance
}

stop_service() {
    :
}

This is just a minor enhancement suggestion — the tool itself works great as-is.

Thanks again for the excellent project :+1:

1 Like

Below are two screenshots taken under heavy load (multiple concurrent downloads saturating the 900/900 link).

You can clearly see:
• Best Effort accumulating drops
• Voice remaining stable (no drops)
• Very low pk_delay values
• Dynamic bandwidth redistribution working as expected

This confirms that cake_mq works properly with cake-stats and that diffserv4 classification is behaving correctly under saturation.


2 Likes

Hi brada,

I'm not quite sure I follow what you mean. "Any monitor tool" is a pretty broad claim and as a developer, I feel it's important to keep the project scope well-defined to ensure a solid end goal.

For context, cake-stats has one clear objective: monitoring the CAKE qdisc. If I started trying to make it monitor fq_codel or everything else under the sun, the project would lose its focus and the final result would likely suffer.

That being said, if the community here needs a similar tool to monitor something else with timeline graphs, it really depends on whether Golang is the right fit for that specific target. If the problem can be solved effectively using Go, then the answer is likely yes—we could definitely build a monitoring tool with timeline graphs for other specific use cases.

Hi segal,

Thanks a ton for taking the time and effort to test this out!

To be honest, my experience with advanced shell scripting is still a bit limited, so the current install.sh and uninstall.sh are definitely on the basic side—though I'm glad they at least get the job done for now haha.

I really appreciate the suggestions for the init script. I've noted them down and will likely implement those improvements in the next update. Quick question though: currently, if you use the installer, you can already stop the process by typing service cake-stats stop. In your opinion, do you think we still need a separate script/flag to stop it via the shell script, or is the standard service command enough?

Thanks again for the solid feedback!

Hi segal,

Thanks again for taking the time to share those screenshots!

This is actually the first time I’ve heard about cake_mq, so I’m stoked to see that the core script works out of the box with it. However, looking at the screenshots, I noticed a bug in the header graphs.

Specifically, where it says 0 B/s TX—on a 900 Mbit/s link under heavy load, that should be showing something like 100 MB/s. Even though the visual graph bars are moving, the text stays at 0 B/s. Since the rest of the tool is confirmed working with cake_mq, this should hopefully be a relatively easy fix.

I’m going to explore cake_mq a bit deeper and try to get that sorted in the next update. those graphs are one of the best parts of the tool, so it’d be a shame if they didn't work as expected just because of the cake_mq logic haha.

Stay tuned!

Hi @segal_72 ,

Quick update—I’ve just released v1.0.1!

I’ve integrated some of your suggestions into the new init script. After reviewing the code, I found a few areas where we could bridge the gap:

  • Host Binding: I’ve added the -host flag so you can now bind to a specific interface/IP via the init script (defaults to 0.0.0.0).
  • Cleaner Arguments: Refactored the command with proper argument separation (\) to make it much easier to read.
  • Conservative Respawn: Changed the retry delay from 0 to 5 seconds. This gives the system a bit more breathing room if the service ever needs to restart.

For the other bits like stop_service and the binary checks, I kept my existing implementation since it already handles logging and triggers a bit more comprehensively. Regarding your feedback about stopping the service: service cake-stats stop is the standard Procd way to handle it, so I’ll stick with that instead of adding a redundant flag in the shell script.

About the cake_mq bug:

I’ve attempted a fix for that 0 B/s display issue in this version. Since I’m currently on OpenWrt 24.10.5, I don't have a multi-queue NIC setup to verify it myself just yet.

If you have some spare time to pull the latest version and see if the throughput numbers finally show up for your cake_mq setup, I’d really appreciate it!

You can grab the update here: https://github.com/galpt/cake-stats/releases/tag/v1.0.1

Cheers!

Just take a note that this does not work without fetching random tracking scripts from the internets, ie if you try to keep admin network without internet etc.

1 Like

hi galpt is a ip of router or any ip ex my pc ? thanks

Hi @Drop ,

The -host flag should be set to the IP address of the machine that is actually running cake-stats. For example, since my router is at 10.0.0.1, I would use -host 10.0.0.1.

To give you a better idea of how it works:

  1. -host 0.0.0.0: This tells cake-stats to listen on all available interfaces. Your web UI will be accessible from anywhere, like 127.0.0.1 (locally) or 10.0.0.1 (from your network).
  2. -host 10.0.0.1: This restricts cake-stats to only listen on that specific IP. If your OpenWrt has multiple interfaces (like 172.16.0.1 or 192.168.1.1), the UI will only be accessible to devices on the 10.0.0.x subnet.
  3. -host 127.0.0.1: This means only the machine running the program can access the UI. This is mostly useful for local testing if you're running it on a Linux desktop.

By default, cake-stats uses -host 0.0.0.0. I'd honestly recommend just leaving it that way unless you have a specific reason to hide the web UI from others. Since it's just monitoring and cake statistics—not sensitive info like social media passwords—I usually don't worry about anyone else in the house seeing it.

I suggest using the install.sh and uninstall.sh scripts to keep things quick and easy. Just let everything stay on its default settings by following the steps I mentioned here.

Hope that clears it up!

1 Like
root@VDF-WRT:~# git clone https://github.com/galpt/cake-stats.git
Cloning into 'cake-stats'...
remote: Enumerating objects: 196, done.
remote: Counting objects: 100% (112/112), done.
remote: Compressing objects: 100% (52/52), done.
remote: Total 196 (delta 57), reused 92 (delta 43), pack-reused 84 (from 1)
Receiving objects: 100% (196/196), 6.40 MiB | 12.00 MiB/s, done.
Resolving deltas: 100% (82/82), done.
root@VDF-WRT:~# cd cake-stats
root@VDF-WRT:~/cake-stats# sh install.sh
[INFO] cake-stats installer v1.0.0
[OK]   Dependencies OK
[INFO] Downloading cake-stats-linux-arm64 from GitHub Releases...
wget: unrecognized option: show-progress
Usage: wget [options] <URL>
Options:
        -4                              Use IPv4 only
        -6                              Use IPv6 only
        -O <file>                       Redirect output to file (use "-" for stdout)
        -P <dir>                        Set directory for output files
        --quiet | -q                    Turn off status messages
        --continue | -c                 Continue a partially-downloaded file
        --header='Header: value'        Add HTTP header. Multiple allowed
        --user=<user>                   HTTP authentication username
        --password=<password>           HTTP authentication password
        --user-agent | -U <str>         Set HTTP user agent
        --post-data=STRING              use the POST method; send STRING as the data
        --post-file=FILE                use the POST method; send FILE as the data
        --spider | -s                   Spider mode - only check file existence
        --timeout=N | -T N              Set connect/request timeout to N seconds
        --proxy=on | -Y on              Enable interpretation of proxy env vars (default)
        --proxy=off | -Y off |
        --no-proxy                      Disable interpretation of proxy env vars

HTTPS options:
        --ca-certificate=<cert>         Load CA certificates from file <cert>
        --no-check-certificate          don't validate the server's certificate
        --ciphers=<cipherlist>          Set the cipher list string

[ERROR] Download failed: https://github.com/galpt/cake-stats/releases/latest/download/cake-stats-linux-arm64.tar.gz
root@VDF-WRT:~/cake-stats# git clone https://github.com/galpt/cake-stats.git

yes is work perfectly thanks so much

1 Like

its working , i have found the error.

1 Like

I reinstalled successfully on GL.iNet GL-MT6000 Flint 2 running a fresh pesa1234 build of OpenWRT, mostly using a GUI.

From luci I had to install
git-http
wget-ssl
luci-app-sqm

I ran the git clone command from WinSCP terminal. Navigated to cake-stats folder using the WinSCP gui. Ran sh install.sh from the WinSCP terminal.

I love how all the settings are exposed, that’s very helpful.

Both eth1 and ifb4eth1 are labeled [EGRESS]. Is there an ingress somewhere?

Thanks!

Hi @JackH ,

Thanks for the follow up.

Can you give me the output of tc -s qdisc from your OpenWrt?
Since my OpenWrt doesn't support cake_mq yet, it'd be great to see the full output of tc -s qdisc from a real machine running cake_mq.

For example, this is how tc -s qdisc looks like on my machine:

root@galpt:~# tc -s qdisc
qdisc noqueue 0: dev lo root refcnt 2 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
qdisc fq_codel 0: dev eth0 root refcnt 2 limit 10240p flows 1024 quantum 1514 target 5ms interval 100ms memory_limit 32Mb ecn drop_batch 64 
 Sent 26200902060 bytes 22740323 pkt (dropped 0, overlimits 0 requeues 121) 
 backlog 0b 0p requeues 121
  maxpacket 65102 drop_overlimit 0 new_flow_count 1395 ecn_mark 0
  new_flows_len 0 old_flows_len 0
qdisc cake 8009: dev eth1 root refcnt 2 bandwidth 50Mbit diffserv4 dual-srchost nat nowash no-ack-filter split-gso rtt 100ms atm overhead 48 memlimit 32Mb 
 Sent 3324338975 bytes 10822688 pkt (dropped 4472, overlimits 9456974 requeues 0) 
 backlog 0b 0p requeues 0
 memory used: 999616b of 32Mb
 capacity estimate: 50Mbit
 min/max network layer size:           28 /    1500
 min/max overhead-adjusted size:      106 /    1749
 average network hdr offset:           14

                   Bulk  Best Effort        Video        Voice
  thresh       3125Kbit       50Mbit       25Mbit    12500Kbit
  target         5.81ms          5ms          5ms          5ms
  interval        101ms        100ms        100ms        100ms
  pk_delay          0us        105us         93us        107us
  av_delay          0us         15us         13us         21us
  sp_delay          0us          3us          3us          2us
  backlog            0b           0b           0b           0b
  pkts                0     10787255         1085        38820
  bytes               0   3324004264        80020      6359078
  way_inds            0       301686            0         3515
  way_miss            0       171575          535         1161
  way_cols            0            0            0            0
  drops               0         4472            0            0
  marks               0           15            0            0
  ack_drop            0            0            0            0
  sp_flows            0            4            1            1
  bk_flows            0            1            0            0
  un_flows            0            0            0            0
  max_len             0        68338          551          590
  quantum           300         1514          762          381

qdisc ingress ffff: dev eth1 parent ffff:fff1 ---------------- 
 Sent 25828489779 bytes 22829480 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
qdisc noqueue 0: dev br-lan root refcnt 2 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
qdisc cake 800a: dev ifb4eth1 root refcnt 2 bandwidth 50Mbit diffserv4 dual-dsthost nat nowash ingress no-ack-filter split-gso rtt 100ms atm overhead 48 memlimit 32Mb 
 Sent 26119960453 bytes 22560008 pkt (dropped 269472, overlimits 26868693 requeues 0) 
 backlog 0b 0p requeues 0
 memory used: 3610880b of 32Mb
 capacity estimate: 50Mbit
 min/max network layer size:           46 /    1500
 min/max overhead-adjusted size:      106 /    1749
 average network hdr offset:           14

                   Bulk  Best Effort        Video        Voice
  thresh       3125Kbit       50Mbit       25Mbit    12500Kbit
  target         5.81ms          5ms          5ms          5ms
  interval        101ms        100ms        100ms        100ms
  pk_delay         12us        771us        402us         60us
  av_delay          0us        158us         44us         16us
  sp_delay          0us          9us          9us          6us
  backlog            0b           0b           0b           0b
  pkts                5     22649757        38670       141048
  bytes             300  26337291765     20005769    129512851
  way_inds            0       323940            3            0
  way_miss            3       162156         1180          106
  way_cols            0            0            0            0
  drops               0       269236           27          209
  marks               0        76839            0            0
  ack_drop            0            0            0            0
  sp_flows            1            3            1            1
  bk_flows            0            1            0            0
  un_flows            0            0            0            0
  max_len            60        68338        62112        21690
  quantum           300         1514          762          381

root@galpt:~# 

And this is how tc -s -j qdisc looks like on my machine

root@galpt:~# tc -s -j qdisc
[{"kind":"noqueue","handle":"0:","dev":"lo","root":true,"refcnt":2,"options":{},"bytes":0,"packets":0,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0},{"kind":"fq_codel","handle":"0:","dev":"eth0","root":true,"refcnt":2,"options":{"limit":10240,"flows":1024,"quantum":1514,"target":4999,"interval":99999,"memory_limit":33554432,"ecn":true,"drop_batch":64},"bytes":26232176640,"packets":22767387,"drops":0,"overlimits":0,"requeues":122,"backlog":0,"qlen":0,"maxpacket":65102,"drop_overlimit":0,"new_flow_count":1398,"ecn_mark":0,"new_flows_len":0,"old_flows_len":0},{"kind":"cake","handle":"8009:","dev":"eth1","root":true,"refcnt":2,"options":{"bandwidth":6250000,"diffserv":"diffserv4","flowmode":"dual-srchost","nat":true,"wash":false,"ingress":false,"ack-filter":"disabled","split_gso":true,"rtt":100000,"raw":false,"atm":"atm","overhead":48,"memlimit":33554432,"fwmark":"0"},"bytes":3325602533,"packets":10832451,"drops":4472,"overlimits":9462093,"requeues":0,"backlog":0,"qlen":0,"memory_used":999616,"memory_limit":33554432,"capacity_estimate":6250000,"min_network_size":28,"max_network_size":1500,"min_adj_size":106,"max_adj_size":1749,"avg_hdr_offset":14,"tins":[{"threshold_rate":390625,"sent_bytes":0,"backlog_bytes":0,"target_us":5813,"interval_us":100813,"peak_delay_us":0,"avg_delay_us":0,"base_delay_us":0,"sent_packets":0,"way_indirect_hits":0,"way_misses":0,"way_collisions":0,"drops":0,"ecn_mark":0,"ack_drops":0,"sparse_flows":0,"bulk_flows":0,"unresponsive_flows":0,"max_pkt_len":0,"flow_quantum":300},{"threshold_rate":6250000,"sent_bytes":3325249265,"backlog_bytes":0,"target_us":5000,"interval_us":100000,"peak_delay_us":79,"avg_delay_us":9,"base_delay_us":1,"sent_packets":10796962,"way_indirect_hits":301796,"way_misses":171929,"way_collisions":0,"drops":4472,"ecn_mark":15,"ack_drops":0,"sparse_flows":3,"bulk_flows":1,"unresponsive_flows":0,"max_pkt_len":68338,"flow_quantum":1514},{"threshold_rate":3125000,"sent_bytes":80200,"backlog_bytes":0,"target_us":5000,"interval_us":100000,"peak_delay_us":92,"avg_delay_us":13,"base_delay_us":3,"sent_packets":1087,"way_indirect_hits":0,"way_misses":537,"way_collisions":0,"drops":0,"ecn_mark":0,"ack_drops":0,"sparse_flows":1,"bulk_flows":0,"unresponsive_flows":0,"max_pkt_len":551,"flow_quantum":762},{"threshold_rate":1562500,"sent_bytes":6377455,"backlog_bytes":0,"target_us":5000,"interval_us":100000,"peak_delay_us":99,"avg_delay_us":20,"base_delay_us":2,"sent_packets":38874,"way_indirect_hits":3515,"way_misses":1161,"way_collisions":0,"drops":0,"ecn_mark":0,"ack_drops":0,"sparse_flows":1,"bulk_flows":0,"unresponsive_flows":0,"max_pkt_len":590,"flow_quantum":381}]},{"kind":"ingress","handle":"ffff:","dev":"eth1","parent":"ffff:fff1","options":{},"bytes":25858899448,"packets":22856281,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0},{"kind":"noqueue","handle":"0:","dev":"br-lan","root":true,"refcnt":2,"options":{},"bytes":0,"packets":0,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0},{"kind":"cake","handle":"800a:","dev":"ifb4eth1","root":true,"refcnt":2,"options":{"bandwidth":6250000,"diffserv":"diffserv4","flowmode":"dual-dsthost","nat":true,"wash":false,"ingress":true,"ack-filter":"disabled","split_gso":true,"rtt":100000,"raw":false,"atm":"atm","overhead":48,"memlimit":33554432,"fwmark":"0"},"bytes":26151190088,"packets":22586809,"drops":269472,"overlimits":26891052,"requeues":0,"backlog":0,"qlen":0,"memory_used":3610880,"memory_limit":33554432,"capacity_estimate":6250000,"min_network_size":46,"max_network_size":1500,"min_adj_size":106,"max_adj_size":1749,"avg_hdr_offset":14,"tins":[{"threshold_rate":390625,"sent_bytes":300,"backlog_bytes":0,"target_us":5813,"interval_us":100813,"peak_delay_us":12,"avg_delay_us":0,"base_delay_us":0,"sent_packets":5,"way_indirect_hits":0,"way_misses":3,"way_collisions":0,"drops":0,"ecn_mark":0,"ack_drops":0,"sparse_flows":1,"bulk_flows":0,"unresponsive_flows":0,"max_pkt_len":60,"flow_quantum":300},{"threshold_rate":6250000,"sent_bytes":26368514979,"backlog_bytes":0,"target_us":5000,"interval_us":100000,"peak_delay_us":702,"avg_delay_us":357,"base_delay_us":28,"sent_packets":22676477,"way_indirect_hits":324209,"way_misses":162509,"way_collisions":0,"drops":269236,"ecn_mark":76839,"ack_drops":0,"sparse_flows":3,"bulk_flows":1,"unresponsive_flows":0,"max_pkt_len":68338,"flow_quantum":1514},{"threshold_rate":3125000,"sent_bytes":20007810,"backlog_bytes":0,"target_us":5000,"interval_us":100000,"peak_delay_us":370,"avg_delay_us":44,"base_delay_us":6,"sent_packets":38694,"way_indirect_hits":3,"way_misses":1180,"way_collisions":0,"drops":27,"ecn_mark":0,"ack_drops":0,"sparse_flows":1,"bulk_flows":0,"unresponsive_flows":0,"max_pkt_len":62112,"flow_quantum":762},{"threshold_rate":1562500,"sent_bytes":129517231,"backlog_bytes":0,"target_us":5000,"interval_us":100000,"peak_delay_us":51,"avg_delay_us":16,"base_delay_us":5,"sent_packets":141105,"way_indirect_hits":0,"way_misses":106,"way_collisions":0,"drops":209,"ecn_mark":0,"ack_drops":0,"sparse_flows":1,"bulk_flows":0,"unresponsive_flows":0,"max_pkt_len":21690,"flow_quantum":381}]}]
root@galpt:~# 

I'll need both the output of tc -s qdisc and tc -s -j qdisc, will try to check if this is a bug or not.

Sorry for the confusion, I’m not running cake_mq, just plain piece of cake, so I don’t think I can help much further. FWIW though:

/$ tc -s -j qdisc
[{"kind":"noqueue","handle":"0:","dev":"lo","root":true,"refcnt":2,"options":{},"bytes":0,"packets":0,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0},{"kind":"mq","handle":"0:","dev":"eth0","root":true,"options":{},"bytes":2945780577,"packets":1973649,"drops":0,"overlimits":0,"requeues":749,"backlog":0,"qlen":0},{"kind":"fq_codel","handle":"0:","dev":"eth0","parent":":10","options":{"limit":10240,"flows":1024,"quantum":1518,"target":4999,"interval":99999,"memory_limit":33554432,"ecn":true,"drop_batch":64},"bytes":0,"packets":0,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0,"maxpacket":0,"drop_overlimit":0,"new_flow_count":0,"ecn_mark":0,"new_flows_len":0,"old_flows_len":0},{"kind":"fq_codel","handle":"0:","dev":"eth0","parent":":f","options":{"limit":10240,"flows":1024,"quantum":1518,"target":4999,"interval":99999,"memory_limit":33554432,"ecn":true,"drop_batch":64},"bytes":0,"packets":0,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0,"maxpacket":0,"drop_overlimit":0,"new_flow_count":0,"ecn_mark":0,"new_flows_len":0,"old_flows_len":0},{"kind":"fq_codel","handle":"0:","dev":"eth0","parent":":e","options":{"limit":10240,"flows":1024,"quantum":1518,"target":4999,"interval":99999,"memory_limit":33554432,"ecn":true,"drop_batch":64},"bytes":0,"packets":0,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0,"maxpacket":0,"drop_overlimit":0,"new_flow_count":0,"ecn_mark":0,"new_flows_len":0,"old_flows_len":0},{"kind":"fq_codel","handle":"0:","dev":"eth0","parent":":d","options":{"limit":10240,"flows":1024,"quantum":1518,"target":4999,"interval":99999,"memory_limit":33554432,"ecn":true,"drop_batch":64},"bytes":0,"packets":0,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0,"maxpacket":0,"drop_overlimit":0,"new_flow_count":0,"ecn_mark":0,"new_flows_len":0,"old_flows_len":0},{"kind":"fq_codel","handle":"0:","dev":"eth0","parent":":c","options":{"limit":10240,"flows":1024,"quantum":1518,"target":4999,"interval":99999,"memory_limit":33554432,"ecn":true,"drop_batch":64},"bytes":0,"packets":0,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0,"maxpacket":0,"drop_overlimit":0,"new_flow_count":0,"ecn_mark":0,"new_flows_len":0,"old_flows_len":0},{"kind":"fq_codel","handle":"0:","dev":"eth0","parent":":b","options":{"limit":10240,"flows":1024,"quantum":1518,"target":4999,"interval":99999,"memory_limit":33554432,"ecn":true,"drop_batch":64},"bytes":0,"packets":0,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0,"maxpacket":0,"drop_overlimit":0,"new_flow_count":0,"ecn_mark":0,"new_flows_len":0,"old_flows_len":0},{"kind":"fq_codel","handle":"0:","dev":"eth0","parent":":a","options":{"limit":10240,"flows":1024,"quantum":1518,"target":4999,"interval":99999,"memory_limit":33554432,"ecn":true,"drop_batch":64},"bytes":0,"packets":0,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0,"maxpacket":0,"drop_overlimit":0,"new_flow_count":0,"ecn_mark":0,"new_flows_len":0,"old_flows_len":0},{"kind":"fq_codel","handle":"0:","dev":"eth0","parent":":9","options":{"limit":10240,"flows":1024,"quantum":1518,"target":4999,"interval":99999,"memory_limit":33554432,"ecn":true,"drop_batch":64},"bytes":2945714275,"packets":1973196,"drops":0,"overlimits":0,"requeues":749,"backlog":0,"qlen":0,"maxpacket":66792,"drop_overlimit":0,"new_flow_count":2568,"ecn_mark":0,"new_flows_len":0,"old_flows_len":0},{"kind":"fq_codel","handle":"0:","dev":"eth0","parent":":8","options":{"limit":10240,"flows":1024,"quantum":1518,"target":4999,"interval":99999,"memory_limit":33554432,"ecn":true,"drop_batch":64},"bytes":0,"packets":0,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0,"maxpacket":0,"drop_overlimit":0,"new_flow_count":0,"ecn_mark":0,"new_flows_len":0,"old_flows_len":0},{"kind":"fq_codel","handle":"0:","dev":"eth0","parent":":7","options":{"limit":10240,"flows":1024,"quantum":1518,"target":4999,"interval":99999,"memory_limit":33554432,"ecn":true,"drop_batch":64},"bytes":0,"packets":0,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0,"maxpacket":0,"drop_overlimit":0,"new_flow_count":0,"ecn_mark":0,"new_flows_len":0,"old_flows_len":0},{"kind":"fq_codel","handle":"0:","dev":"eth0","parent":":6","options":{"limit":10240,"flows":1024,"quantum":1518,"target":4999,"interval":99999,"memory_limit":33554432,"ecn":true,"drop_batch":64},"bytes":0,"packets":0,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0,"maxpacket":0,"drop_overlimit":0,"new_flow_count":0,"ecn_mark":0,"new_flows_len":0,"old_flows_len":0},{"kind":"fq_codel","handle":"0:","dev":"eth0","parent":":5","options":{"limit":10240,"flows":1024,"quantum":1518,"target":4999,"interval":99999,"memory_limit":33554432,"ecn":true,"drop_batch":64},"bytes":0,"packets":0,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0,"maxpacket":0,"drop_overlimit":0,"new_flow_count":0,"ecn_mark":0,"new_flows_len":0,"old_flows_len":0},{"kind":"fq_codel","handle":"0:","dev":"eth0","parent":":4","options":{"limit":10240,"flows":1024,"quantum":1518,"target":4999,"interval":99999,"memory_limit":33554432,"ecn":true,"drop_batch":64},"bytes":66302,"packets":453,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0,"maxpacket":0,"drop_overlimit":0,"new_flow_count":0,"ecn_mark":0,"new_flows_len":0,"old_flows_len":0},{"kind":"fq_codel","handle":"0:","dev":"eth0","parent":":3","options":{"limit":10240,"flows":1024,"quantum":1518,"target":4999,"interval":99999,"memory_limit":33554432,"ecn":true,"drop_batch":64},"bytes":0,"packets":0,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0,"maxpacket":0,"drop_overlimit":0,"new_flow_count":0,"ecn_mark":0,"new_flows_len":0,"old_flows_len":0},{"kind":"fq_codel","handle":"0:","dev":"eth0","parent":":2","options":{"limit":10240,"flows":1024,"quantum":1518,"target":4999,"interval":99999,"memory_limit":33554432,"ecn":true,"drop_batch":64},"bytes":0,"packets":0,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0,"maxpacket":0,"drop_overlimit":0,"new_flow_count":0,"ecn_mark":0,"new_flows_len":0,"old_flows_len":0},{"kind":"fq_codel","handle":"0:","dev":"eth0","parent":":1","options":{"limit":10240,"flows":1024,"quantum":1518,"target":4999,"interval":99999,"memory_limit":33554432,"ecn":true,"drop_batch":64},"bytes":0,"packets":0,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0,"maxpacket":0,"drop_overlimit":0,"new_flow_count":0,"ecn_mark":0,"new_flows_len":0,"old_flows_len":0},{"kind":"cake","handle":"8005:","dev":"eth1","root":true,"refcnt":17,"options":{"bandwidth":2812500,"diffserv":"besteffort","flowmode":"triple-isolate","nat":true,"wash":false,"ingress":false,"ack-filter":"disabled","split_gso":true,"rtt":100000,"raw":true,"overhead":0,"fwmark":"0"},"bytes":137644893,"packets":1054805,"drops":1450,"overlimits":1695570,"requeues":49,"backlog":0,"qlen":0,"memory_used":4195328,"memory_limit":4194304,"capacity_estimate":2812500,"min_network_size":42,"max_network_size":1514,"min_adj_size":42,"max_adj_size":1514,"avg_hdr_offset":14,"tins":[{"threshold_rate":2812500,"sent_bytes":137972293,"backlog_bytes":0,"target_us":5000,"interval_us":100000,"peak_delay_us":1768,"avg_delay_us":162,"base_delay_us":4,"sent_packets":1056255,"way_indirect_hits":266,"way_misses":398,"way_collisions":0,"drops":1450,"ecn_mark":0,"ack_drops":0,"sparse_flows":1,"bulk_flows":1,"unresponsive_flows":0,"max_pkt_len":16654,"flow_quantum":686}]},{"kind":"noqueue","handle":"0:","dev":"lan2","root":true,"refcnt":2,"options":{},"bytes":0,"packets":0,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0},{"kind":"clsact","handle":"ffff:","dev":"lan2","parent":"ffff:fff1","options":{},"bytes":9263,"packets":156,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0},{"kind":"noqueue","handle":"0:","dev":"lan3","root":true,"refcnt":2,"options":{},"bytes":0,"packets":0,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0},{"kind":"clsact","handle":"ffff:","dev":"lan3","parent":"ffff:fff1","options":{},"bytes":0,"packets":0,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0},{"kind":"noqueue","handle":"0:","dev":"lan4","root":true,"refcnt":2,"options":{},"bytes":0,"packets":0,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0},{"kind":"clsact","handle":"ffff:","dev":"lan4","parent":"ffff:fff1","options":{},"bytes":0,"packets":0,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0},{"kind":"noqueue","handle":"0:","dev":"lan5","root":true,"refcnt":2,"options":{},"bytes":0,"packets":0,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0},{"kind":"clsact","handle":"ffff:","dev":"lan5","parent":"ffff:fff1","options":{},"bytes":0,"packets":0,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0},{"kind":"noqueue","handle":"0:","dev":"lan1","root":true,"refcnt":2,"options":{},"bytes":0,"packets":0,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0},{"kind":"clsact","handle":"ffff:","dev":"lan1","parent":"ffff:fff1","options":{},"bytes":128922370,"packets":1061821,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0},{"kind":"noqueue","handle":"0:","dev":"br-lan","root":true,"refcnt":2,"options":{},"bytes":0,"packets":0,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0},{"kind":"clsact","handle":"ffff:","dev":"br-lan","parent":"ffff:fff1","options":{},"bytes":2938891307,"packets":1975829,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0},{"kind":"noqueue","handle":"0:","dev":"phy1-ap0","root":true,"refcnt":2,"options":{},"bytes":0,"packets":0,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0},{"kind":"clsact","handle":"ffff:","dev":"phy1-ap0","parent":"ffff:fff1","options":{},"bytes":1269642,"packets":5103,"drops":0,"overlimits":0,"requeues":0,"backlog":0,"qlen":0}]

/$ tc -s qdisc
qdisc noqueue 0: dev lo root refcnt 2 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
qdisc mq 0: dev eth0 root 
 Sent 2945616358 bytes 1973175 pkt (dropped 0, overlimits 0 requeues 749) 
 backlog 0b 0p requeues 749
qdisc fq_codel 0: dev eth0 parent :10 limit 10240p flows 1024 quantum 1518 target 5ms interval 100ms memory_limit 32Mb ecn drop_batch 64 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
  maxpacket 0 drop_overlimit 0 new_flow_count 0 ecn_mark 0
  new_flows_len 0 old_flows_len 0
qdisc fq_codel 0: dev eth0 parent :f limit 10240p flows 1024 quantum 1518 target 5ms interval 100ms memory_limit 32Mb ecn drop_batch 64 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
  maxpacket 0 drop_overlimit 0 new_flow_count 0 ecn_mark 0
  new_flows_len 0 old_flows_len 0
qdisc fq_codel 0: dev eth0 parent :e limit 10240p flows 1024 quantum 1518 target 5ms interval 100ms memory_limit 32Mb ecn drop_batch 64 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
  maxpacket 0 drop_overlimit 0 new_flow_count 0 ecn_mark 0
  new_flows_len 0 old_flows_len 0
qdisc fq_codel 0: dev eth0 parent :d limit 10240p flows 1024 quantum 1518 target 5ms interval 100ms memory_limit 32Mb ecn drop_batch 64 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
  maxpacket 0 drop_overlimit 0 new_flow_count 0 ecn_mark 0
  new_flows_len 0 old_flows_len 0
qdisc fq_codel 0: dev eth0 parent :c limit 10240p flows 1024 quantum 1518 target 5ms interval 100ms memory_limit 32Mb ecn drop_batch 64 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
  maxpacket 0 drop_overlimit 0 new_flow_count 0 ecn_mark 0
  new_flows_len 0 old_flows_len 0
qdisc fq_codel 0: dev eth0 parent :b limit 10240p flows 1024 quantum 1518 target 5ms interval 100ms memory_limit 32Mb ecn drop_batch 64 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
  maxpacket 0 drop_overlimit 0 new_flow_count 0 ecn_mark 0
  new_flows_len 0 old_flows_len 0
qdisc fq_codel 0: dev eth0 parent :a limit 10240p flows 1024 quantum 1518 target 5ms interval 100ms memory_limit 32Mb ecn drop_batch 64 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
  maxpacket 0 drop_overlimit 0 new_flow_count 0 ecn_mark 0
  new_flows_len 0 old_flows_len 0
qdisc fq_codel 0: dev eth0 parent :9 limit 10240p flows 1024 quantum 1518 target 5ms interval 100ms memory_limit 32Mb ecn drop_batch 64 
 Sent 2945557136 bytes 1972786 pkt (dropped 0, overlimits 0 requeues 749) 
 backlog 0b 0p requeues 749
  maxpacket 66792 drop_overlimit 0 new_flow_count 2568 ecn_mark 0
  new_flows_len 0 old_flows_len 0
qdisc fq_codel 0: dev eth0 parent :8 limit 10240p flows 1024 quantum 1518 target 5ms interval 100ms memory_limit 32Mb ecn drop_batch 64 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
  maxpacket 0 drop_overlimit 0 new_flow_count 0 ecn_mark 0
  new_flows_len 0 old_flows_len 0
qdisc fq_codel 0: dev eth0 parent :7 limit 10240p flows 1024 quantum 1518 target 5ms interval 100ms memory_limit 32Mb ecn drop_batch 64 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
  maxpacket 0 drop_overlimit 0 new_flow_count 0 ecn_mark 0
  new_flows_len 0 old_flows_len 0
qdisc fq_codel 0: dev eth0 parent :6 limit 10240p flows 1024 quantum 1518 target 5ms interval 100ms memory_limit 32Mb ecn drop_batch 64 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
  maxpacket 0 drop_overlimit 0 new_flow_count 0 ecn_mark 0
  new_flows_len 0 old_flows_len 0
qdisc fq_codel 0: dev eth0 parent :5 limit 10240p flows 1024 quantum 1518 target 5ms interval 100ms memory_limit 32Mb ecn drop_batch 64 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
  maxpacket 0 drop_overlimit 0 new_flow_count 0 ecn_mark 0
  new_flows_len 0 old_flows_len 0
qdisc fq_codel 0: dev eth0 parent :4 limit 10240p flows 1024 quantum 1518 target 5ms interval 100ms memory_limit 32Mb ecn drop_batch 64 
 Sent 59222 bytes 389 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
  maxpacket 0 drop_overlimit 0 new_flow_count 0 ecn_mark 0
  new_flows_len 0 old_flows_len 0
qdisc fq_codel 0: dev eth0 parent :3 limit 10240p flows 1024 quantum 1518 target 5ms interval 100ms memory_limit 32Mb ecn drop_batch 64 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
  maxpacket 0 drop_overlimit 0 new_flow_count 0 ecn_mark 0
  new_flows_len 0 old_flows_len 0
qdisc fq_codel 0: dev eth0 parent :2 limit 10240p flows 1024 quantum 1518 target 5ms interval 100ms memory_limit 32Mb ecn drop_batch 64 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
  maxpacket 0 drop_overlimit 0 new_flow_count 0 ecn_mark 0
  new_flows_len 0 old_flows_len 0
qdisc fq_codel 0: dev eth0 parent :1 limit 10240p flows 1024 quantum 1518 target 5ms interval 100ms memory_limit 32Mb ecn drop_batch 64 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
  maxpacket 0 drop_overlimit 0 new_flow_count 0 ecn_mark 0
  new_flows_len 0 old_flows_len 0
qdisc cake 8005: dev eth1 root refcnt 17 bandwidth 22500Kbit besteffort triple-isolate nat nowash no-ack-filter split-gso rtt 100ms raw overhead 0 
 Sent 137306352 bytes 1053588 pkt (dropped 1449, overlimits 1694970 requeues 49) 
 backlog 0b 0p requeues 49
 memory used: 4097Kb of 4Mb
 capacity estimate: 22500Kbit
 min/max network layer size:           42 /    1514
 min/max overhead-adjusted size:       42 /    1514
 average network hdr offset:           14

                  Tin 0
  thresh      22500Kbit
  target            5ms
  interval        100ms
  pk_delay       3.26ms
  av_delay       1.21ms
  sp_delay          4us
  backlog            0b
  pkts          1055037
  bytes       137632238
  way_inds           86
  way_miss          274
  way_cols            0
  drops            1449
  marks               0
  ack_drop            0
  sp_flows            1
  bk_flows            1
  un_flows            0
  max_len         16654
  quantum           686

qdisc noqueue 0: dev lan2 root refcnt 2 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
qdisc clsact ffff: dev lan2 parent ffff:fff1 
 Sent 6883 bytes 114 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
qdisc noqueue 0: dev lan3 root refcnt 2 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
qdisc clsact ffff: dev lan3 parent ffff:fff1 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
qdisc noqueue 0: dev lan4 root refcnt 2 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
qdisc clsact ffff: dev lan4 parent ffff:fff1 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
qdisc noqueue 0: dev lan5 root refcnt 2 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
qdisc clsact ffff: dev lan5 parent ffff:fff1 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
qdisc noqueue 0: dev lan1 root refcnt 2 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
qdisc clsact ffff: dev lan1 parent ffff:fff1 
 Sent 128855310 bytes 1061442 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
qdisc noqueue 0: dev br-lan root refcnt 2 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
qdisc clsact ffff: dev br-lan parent ffff:fff1 
 Sent 2938388506 bytes 1974648 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
qdisc noqueue 0: dev phy1-ap0 root refcnt 2 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
qdisc clsact ffff: dev phy1-ap0 parent ffff:fff1 
 Sent 952308 bytes 3486 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0
1 Like

Now that I can see the tc output, it looks like you misconfigured cake.

The output tells us that the cake-stats program also has a bug where it couldn't properly handle cases like yours.

I made a script here last week to safely configure cake (add/remove) from an interface that will correctly set up the IFB interface too. You can try that script to re-configure your cake for your eth1 interface. It will use the default recommended parameters such as internet diffserv4 conservative so you just need to worry about setting the proper bandwidth value.

And I released a new version (v1.0.2) where theoretically this version should be better at handling cases like yours.

Let me know if the new version solves your issue.