Just got my Gig-E dongles, and at least part of the article matches the quick iperf test I did. I get about 170Mbps TCP Tx and about 200Mbps Rx. A simultaneous dualtest (iperf -d) gives 174Mbps Rx and 50Mbps Tx.
I ran atop during the test and it showed a single core being maxed out. For Rx it showed about 45% sys and 55% irq for this core. For Tx, the numbers for sys and irq are swapped. This suggests that the bottleneck is somewhere inside the Linux kernel, and driver optimisations might be possible, limited by the 480Mbps USB 2.0 speed + protocol overhead obviously. The components in this chain would be:
* Linux kernel generic IRQ framework
* USB host driver
* Linux kernel generic USB layer
* Driver for USB dongle. In my case, Startech.com USB 3.0 Gig-E adapter
* Linux kernel network layer
There is probably room for improvement in the drivers, but the work is tedious and probably needs GPIO debug. There might be possibilities for threading by breaking the path into a pipeline, but the large amount of time spent in the IRQ handlers severely limits the possibilities here, since the IRQ handlers must stay on a single core. Could be fun to look into though.
I will run another benchmark once I get the NAT router running and see what I can get. But there will be 3 cores practically unused from the USB/NIC layers, so I don't expect this will limit throughput much compared to the combined Rx/Tx throughput.