GPU utilization

When two PCIe network ports (including the on-board GBE) are simultaneously used for iperf3 UDP bidirectional tests, GPU utilization hits 100% in rare cases. The system becomes unresponsive at this point, and CPU0 is also fully loaded. My question is why iperf3 impacts the GPU, given that the Xorg process is running during this scenario.

iperf3 -c ip -u -p 8081 -b 1g -t 0 --bidir

iperf3 -c ip -u -p 8082 -b 1g -t 0 --bidir

Hi,
Please share which Jetpack version you are using. Certain issues are found and fixed in later releases. Would like to confirm which version you are currently using and we can suggest next.

r36.4.4

Note: The following technical analysis and suggestions were prepared with the assistance of an AI tool to help summarize and structure the troubleshooting steps.

Hi, @3285195874

Looking at your jtop screenshot, the only processes actively using GPU memory/context are gnome-shell, Xorg, and xdg-desktop-portal. There are no actual CUDA or compute tasks running on the iGPU.

What you are seeing is a driver/memory channel stall caused by CPU interrupt saturation on Orin’s shared SoC fabric rather than actual GPU compute load.

Why this happens:

  1. Interrupt Saturation on CPU0: High-rate bidirectional UDP testing with iperf3 floods CPU0 with softirq packet processing interrupts.

  2. Xorg & GNOME Buffer Stalls: Because the desktop GUI is active, GNOME and Xorg constantly submit composition frames to the GPU. When CPU0 locks up handling packet interrupts, the GPU driver stalls while waiting on CPU-side memory locks and completion events. Performance monitoring tools like jtop render this blocked channel state as 100% GPU utilization.

Recommended Verification & Workarounds:

1. Test Headless

Stop the desktop environment temporarily and re-run your iperf3 test:

sudo systemctl stop gdm
# or drop to runlevel 3:
sudo init 3

Without the display manager running, the GPU load spike should completely disappear.

2. Pin iperf3 Core Affinity

Keep iperf3 execution off CPU0 using taskset:

taskset -c 1,2 iperf3 -c <ip> -u -p 8081 -b 1g -t 0 --bidir

3. Balance Network Interrupts (smp_affinity)

Check which IRQ lines your network interfaces are using:

cat /proc/interrupts | grep -iE "eth|pci|nveth"

Move network interrupts off CPU0 by writing a hexadecimal bitmask to /proc/irq/<irq_num>/smp_affinity:

  • Bind IRQ to CPU1 only (Hex 2 / Binary 00000010):

    sudo sh -c 'echo 2 > /proc/irq/<irq_num>/smp_affinity'
    
    
  • Distribute across CPUs 1, 2, and 3 (Hex e / Binary 00001110):

    sudo sh -c 'echo e > /proc/irq/<irq_num>/smp_affinity'
    
    

You can monitor the real-time interrupt distribution across cores with:

watch -n1 "cat /proc/interrupts | grep -i <irq_num>"