Hi all, hoping for community/engineer insight on a persistent CPU issue that I've spent 4+ days investigating.
Setup
- Router: RouterOS x86, Intel 4 cores @ 3.3 GHz, 4 GB RAM
- RouterOS: 7.12.1 (stable), Nov 2023 build
- Role: PPPoE server for ~560 FTTH customers (WISP)
- PPP profiles: 9 profiles, all with
queue-type=FQ CODEL(rate 3-20 Mbps per package) - Simple queues: 557 dynamic (auto-created per PPPoE session), all FQ_CODEL
- Active PPPoE sessions: 559
- FastTrack: enabled (
chain=forward action=fasttrack-connection src-address-list=!blocked dst-address-list=!blocked) - Firewall: 17 filter / 12 NAT / 7 mangle rules
- Connection tracking: ~36k concurrent
Symptom
Exactly one CPU core is constantly at 100%, while the other 3 idle at 8–20%.
The 100%-core rotates between cpu0/1/2/3 (single kernel thread being rescheduled).
Total CPU averages ~35% = (100 + 3×~12)/4.
This happens BOTH during traffic peaks (~800 Mbps aggregate) AND during idle (0 Mbps at 00:11 local time). Traffic is NOT the driver.
Currently no packet drops (rx-drop/tx-drop = 0 on WAN interfaces). This is a spare-capacity concern before I lose margin, not an active service impact yet.
What I've Ruled Out With Data
| Hypothesis | Result |
|---|---|
| Traffic-bound | |
| Packet-bound | |
| Broadcast flood | |
| NIC IRQ affinity | |
| Profiler stuck | |
| Winbox mgmt session | |
| Scheduler task | /system scheduler empty |
| PPPoE auth loop | |
| Post-reboot recovery | |
| FastTrack enabled |
Current Prime Suspect
Hypothesis: RouterOS processes simple queues single-threaded. 557 dynamic PPPoE queues with FQ_CODEL scheduler saturate one core because FQ_CODEL is significantly more CPU-heavy than pfifo, especially when running per-session.
FastTrack doesn't help because it bypasses firewall but NOT the queue subsystem — 97.6% of traffic still hits queue processing.
The Blocker: Cannot Test The Hypothesis
Yesterday I tried to prove/disprove this without a reboot:
- Changed
queue-typeon all 9 PPP profiles fromFQ CODELtodefault(pfifo) via/ppp/profile/set
verified applied - Kicked 10 test sessions via
/ppp/active/remove
8 auto-reconnected within 3 min - Checked queue-type of reconnected sessions → still FQ_CODEL

Dynamic PPPoE simple queues appear to be persistent across session kicks — the queue is not deleted on /ppp active remove, just its statistics reset. When the session reconnects, it re-attaches to the existing queue (still FQ_CODEL).
Attempted workarounds — also blocked:
/queue/simple/seton dynamic queue → "can't edit dynamic object"/queue/simple/removeon dynamic queue → "can't remove dynamic object"
Questions
-
Am I right that dynamic PPPoE simple queues are single-threaded per queue-instance, and FQ_CODEL vs pfifo is what's saturating one core?
-
Is there any way to force a dynamic simple queue to refresh its
queuefield from the parent PPP profile without a full reboot or deleting the PPP secret? I can accept short (seconds) glitches per-customer but I can't drop 560 customers for 5-10 min just to test a hypothesis. -
My
/tool profilehas been locked with "profile already running" for months — only a fresh reboot clears it. Any way to unstuck this without reboot? Without it I can't identify the exact process eating the pegged core. -
For ~600 PPPoE customers with per-customer rate limiting on x86 RouterOS 7.x, is per-customer dynamic simple queue the right architecture? Would you recommend Queue Tree + PCQ with mangle-based classification for better multi-core scaling? Any real-world examples of WISPs at this scale that solved it?
-
Known issue with FQ_CODEL scaling on 7.12.1 at 500+ concurrent queue instances?
Environment context (for anyone considering the same setup)
- Rural WISP, single upstream + backup
- Dual WAN (primary + backup ISP)
- Address-list has ~27k static entries (public CDN/speedtest ranges + ASN routing lists) — dormant, not in packet path, confirmed not the CPU cause
- No hotspot, no DHCP other than one small subnet
- FastTrack was added mid-investigation and reduced TOTAL CPU load significantly (100%→36%) but didn't eliminate the single-core 100% pattern
Thanks in advance to anyone who can shed light or has been through this. Happy to share any additional data — logs, /export, screenshots.