Increase performance on WRT1900ACS

I just got a gigabit connection, and my WRT1900ACS doesn't seem to handle it.

The issue is the number of interrupts and that only one of the cores has to deal with it.

Is there a way to increase performance a bit?

I'm currently on OpenWrt 21.02.0 r16279-5cc0535800.

Try this first under Network/Interfaces/Global Network Options

Enabling packet steering may help a little but not much.

I have gone back to using 19.07 as I have a gigabit fibre connection and this makes use of both CPUs.

Thanks. I've tried RSS and software flow offloading, neither made any difference.

Does 19.07 really manage to distribute interrupts across multiple cores, but 21.02 can't? If so, what's up with that?

21.02 and master use DSA. There is work going on trying to get multi-cpu use for DSA but to date this hasn't been accepted.

19.07 uses the old swconfig which uses both cpus. The problem with 19.07 it's near end of line with it only getting security fixes.

1 Like

I just switched to 19.07, but it doesn't use both CPU cores. All interrupts for eth0 and eth1 goes to CPU0, so CPU1 is basically idle while the other core is pinned to 100 % handling interrupts.

Are you sure it's using both cores for you? If so, how?

I've tried to distribute interrupts to both cores, but I can't get it to work.

Have you tried doing some speed tests while running htop?

The "0" and "1" are the cpu core utilisation.

Note: This is with SQM enabled. I can get very close to full line speeds without SQM enabled.

If the service is symmetrical 1000 / 1000 the MultiPort DSA change might offer an assist. De-conflate, the MultiPort DSA change is not CPU core usage, you may still have an issue distributing IRQs

cat /proc/interrupts
example from mamba with MP-DSA in play, notice etho and eth1
           CPU0       CPU1       
 24:   14271835    9721970      MPIC   5 Level     armada_370_xp_per_cpu_tick
 26:   15248250          0      MPIC  31 Level     mv64xxx_i2c
 27:       1032          0      MPIC  41 Level     ttyS0
 33:          0          0      MPIC  45 Level     ehci_hcd:usb1
 34:   19830264          0      MPIC   8 Level     eth0
 35:     336350          0      MPIC  10 Level     eth1
 36:          0          0      MPIC  55 Level     sata_mv[f10a0000.sata]
 37:        105          0      MPIC 113 Level     marvell-nfc
 38:      47763          0      MPIC  48 Level     f1090000.crypto
 39:        311        122      MPIC  49 Level     f1090000.crypto
 48:          2          0      MPIC  51 Level     f1060900.xor
 49:          2          0      MPIC  94 Level     f10f0900.xor
 50:          0          0  MPIC MSI 524288 Edge      xhci_hcd
 54:          0          0  mv88e6xxx-g1   3 Edge      mv88e6xxx-f1072004.mdio-mii:00-g1-atu-prob
 56:          0          0  mv88e6xxx-g1   5 Edge      mv88e6xxx-f1072004.mdio-mii:00-g1-vtu-prob
 59:          0          1  mv88e6xxx-g1   7 Edge      mv88e6xxx-f1072004.mdio-mii:00-g2
 61:          0          0  mv88e6xxx-g2   0 Edge      mv88e6xxx-1:00
 62:          0          0  mv88e6xxx-g2   1 Edge      mv88e6xxx-1:01
 63:          0          0  mv88e6xxx-g2   2 Edge      mv88e6xxx-1:02
 64:          0          1  mv88e6xxx-g2   3 Edge      mv88e6xxx-1:03
 65:          0          0  mv88e6xxx-g2   4 Edge      mv88e6xxx-1:04
 76:          0          0  mv88e6xxx-g2  15 Edge      mv88e6xxx-f1072004.mdio-mii:00-watchdog
 77:          0          0  f1018140.gpio   0 Edge      gpio_keys
 78:          0          0  f1018140.gpio   1 Edge      gpio_keys
 79:      14782  181161303      MPIC  59 Level     mwlwifi
 80:  179969867          0      MPIC  60 Level     mwlwifi
IPI0:          0          0  CPU wakeup interrupts
IPI1:          0          0  Timer broadcast interrupts
IPI2:     135942     138422  Rescheduling interrupts
IPI3:     657931    3797409  Function call interrupts
IPI4:          0          0  CPU stop interrupts
IPI5:    2226117    1726050  IRQ work interrupts
IPI6:          0          0  completion interrupts

See if irqbalance helps.

1 Like

I was hoping I could split it into multiple RX/TX queues and direct the queues to different cores, but I'm not even able to set CPU affinity(ash: write error: I/O error), so eth0(wan?) and eth1(lan?) are on the same CPU. On a normal Linux box with half-decent network cards, this is straightforward, but I really don't get what's going on here.

Not sure if it's a hardware limit or software, but I do find it strange if the hardware of a dual-core router can't use all cores for interrupts.

I've also tried to enable interrupt coalescing to reduce the number of interrupts, but I'm not able to enable it using ethtool.

If someone knows how to enable interrupt coalescing(or if it's even supported by the hardware) or split interrupts across multiple cores then that would be awesome as I'm totally lost now.

Any news about this? Now there is another version (22.03) and... ?