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.

Issue Diagnosis

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).

  1. Reassign IRQ Affinity

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
  1. Enable XPS (Transmit Packet Steering)