Hello,
I’m trying to establish communication between two Imx95 verdin EVK A1 Silicon version boards, through their Aquantia 10 Gbps interfaces. Both boards are running Debian 12 ( linux kernel 6.12.3) with the aquantia10 G firmware (AQR-G4_v5.6.D-AQR_Marvell_NoSwap_XFI_ID44834_VER2068.cld ) properly installed using the nxp installer (aquantia-firmware-utility/aq_api_2_9_7 at master · nxp-qoriq/aquantia-firmware-utility · GitHub). They are physically connected using a Cat6a Ethernet cable.
When I run performance tests using iperf3, I get around 5 Gbps in TCP and 1.2 Gbps in UDP with 0% of loss, even when specifying a target bandwidth of 7 Gbps:
# TCP Test
iperf3 -s # on the first board
iperf3 -c
# UDP Test
iperf3 -s
iperf3 -c
when i try to activate jumbo frame with ip link set dev enp1s0 mtu 9000 but i get an error that i exceded the limit (it’s weird that a 10Gbps interface does not accept jumbo frames)
also i tried to to increase the UDP buffer size, but i get the same bitrame
the CPU load does not exceed 40% when i run iperf3 in both sides
Are there any specific n configurations to apply or additional tools to install in order to reach the maximum throughput (close to 10 Gbps)? is the Aquantia FW version is good? the linux kernel version? the FW installer version???
SOmeone have already tried to use the 10Gbps interface on this Targets???
Regards,
Abdelmonaem
1. Try configuring following settings on both of your systems:
cpufreq-set -g performance
sysctl -w net.core.rmem_max=26214400
sysctl -w net.core.wmem_max=26214400
sysctl -w net.core.netdev_max_backlog=250000
sysctl -w net.ipv4.tcp_rmem='4096 87380 16777216'
sysctl -w net.ipv4.tcp_wmem='4096 65536 16777216'
2. If possible use a different reference system as iperf server (e.g. Intel Xeon)
3. iperf3 itself is single-threaded per test stream, try using -P option:
e.g. iperf3 -c
(6 streams)
4. Check both forward and reverse stream (-R)
iperf3 -c 192.168.1.1 -t 10 -b 10G -u -R
it will be a minor version upgrade to 6.12.49
BTW, you may also want to consider DPDK or AF_XDP for better throughput?
=> TCP vs UDP send performance
When you are using iperf3 to send TCP packets, each TCP packet is 128KB, and the packet will be fragmented by the LSO feature of ENETC Hardware. So you see higher TCP transfer performance.
iperf3 does not enable UDP_SEGMENT when creating UDP sockets. Therefore:
- Each UDP packet is approximately MTU-sized (≈1500 bytes).
- For the same data size, UDP requires to send many more packets than TCP.
More packets → more kernel processing → lower performance compared to TCP with LSO.
=> Why receive is much lower in comparison to send for TCP?
- The TX and RX paths are not symmetrical in the Linux kernel, so the processing time for each RX packet and each TX packet in the kernel is different. Also TCP is using LSO offload in send.
- RSC is not enabled by default in kernel; We need to disable TCP timestamp so that the RSC of ENETC can work properly. Currently, the RSC of i.MX95 is disabled by default.
a) Enable RSC of i.MX95 (receiver side):
ethtool -K eth1 large-receive-offload on
b) Disabled TCP timestamp (sender side) :
sysctl -w net.ipv4.tcp_timestamps=0
sysctl -p /etc/sysctl.conf
After enabling RSC, you will see the TCP performance at receiver side will be increased.
Additionally you can try using Jumbo frames to get higher throughput. (Hope you are running latest release).
# Change MTU to 9000 on both side
ip link set dev eth1 mtu 9000
# Change RX buffer length in the ethernet driver.
ethtool -G eth1 rx-buf-len 16384
We can see between 8 to 10 Gbps UDP RX/TX with multi-stream mode.
The RSC settings will also improve UDP performance.
The changes/fixes for Jumbo frames in ENETC should be available in upcoming LF-Q4 release in two weeks.
AF_XDP or DPDK do not use kernel networking stack.
DPDK specially have a different driver and work in userspace only. It is highly optimized for networking and packet processing. It can provide really fast performance for all IP packets. you may check it out at;
Chapter 10: https://www.nxp.com/docs/en/reference-manual/RM00293.pdf
The new kernel tree and changes are available at:
https://github.com/nxp-imx/linux-imx/commits/lf-6.12.49-2.2.0
A1 support has been dropped from newer LF release.
You have following options;
1. Just build the kernel independently and replace the kernel only in your build. (It may work)
2. Ask your marketing contact to replace your boards with B0 - so that you can run LF-Q4'2025 release.
yes, this how the results were tested.
MTU was same on both side in all cases (either both 1500 or both 9000)
see attached,
Also note that I am also running it on A1 SOC
UBOOT logs: -
U-Boot 2025.04-g8c1de2e1deca (May 09 2025 - 15:29:26 +0000)
CPU: i.MX95 rev1.1 at 1800MHz
CPU: Automotive temperature grade (-40C to 125C) at 30C
LM Boot reason: sw, origin: 2, errid: 1
LM shutdown reason: sw, origin: 2, errid: 1
Model: NXP i.MX95 19X19 board
DRAM: 15.8 GiB
--- SM logs
>$ info
SM Version = Build 633, Commit c37b26da
SM Config = mx95evk, mSel=0
Board = i.MX95 EVK, attr=0x00000000
Silicon = i.MX95 A1
Boot mode = normal
Boot device = MMC1
Boot stage = primary
Boot set = 1
ECID = 0x6E5F04BA0000000500041D0899123F81
PMIC 0 (0x08) = 0x20, 0x09, 0x10, 0x00, 0x01
PMIC 1 (0x2A) = 0x54, 0x22, 0x00, 0x0B
PMIC 2 (0x29) = 0x55, 0x22, 0x00, 0x0A
Compiler = gcc 14.2.1 20241119