After updating my Turris Omnia to Turris OS 7.1.3, I noticed that my CPU0 was hitting 100% utilization during high-speed internet tests (750Mbps+), while CPU1 remained completely idle.
Running htop and mpstat -P ALL 1 confirmed that CPU0 was fully loaded, but CPU1 wasn't being used at all.
Checking interrupt assignments showed that all Ethernet IRQs were handled by CPU0 only:
cat /proc/interrupts | grep eth
Output:
47: 5694427 0 MPIC 10 Level eth1
48: 10434821 0 MPIC 12 Level eth2
The second column (CPU1) was at zero for both interfaces, confirming the issue. Solution: Distribute Network Load Across Both CPUs
To fix this, I manually reassigned IRQ affinity and enabled Receive Packet Steering (RPS) / Transmit Packet Steering (XPS).
First, I checked the current CPU assignment:
cat /proc/irq/47/smp_affinity
cat /proc/irq/48/smp_affinity
If the value was 1, that meant the IRQ was assigned only to CPU0.
To allow both CPUs to handle interrupts:
echo 3 > /proc/irq/47/smp_affinity
echo 3 > /proc/irq/48/smp_affinity
(3 in hexadecimal = 11 in binary, which enables both CPUs).
2. Enable RPS (Receive Packet Steering)
Checked the current RPS configuration:
cat /sys/class/net/eth1/queues/rx-0/rps_cpus
cat /sys/class/net/eth2/queues/rx-0/rps_cpus
If the value was 0, only CPU0 was handling the network load.
To distribute packet processing across both CPUs:
echo 3 > /sys/class/net/eth1/queues/rx-0/rps_cpus
echo 3 > /sys/class/net/eth2/queues/rx-0/rps_cpus