USB Bandwidth bottleneck

badwhitevision

Disciple
Let us assume a laptop provides 1 USB 3.0 Type C port (for Data only) and 2 USB 3.0 Type A ports.

In this condition, I'm supposed to have a theoretical combined throughput of 15Gbps (3x USB 3.0). I know this is not practically achievable.

But I have read somewhere that most laptops share the same USB controller and running dmidecode/lspci -vv on Debian also shows the presence of only 1 Intel xHCI controller.

Does this mean that even if I theoretically have 3 devices that are capable of achieving the transfer speed of 5 Gbps individually and at the same time, my setup will have a bottleneck due to the bandwidth available at the controller and my final speed will be 5 Gbps only? Or will I be able to hit 15Gbps? Assuming no other loss.

All of this is theoretical and I'm simply trying to understand how having 1 USB controller limits bandwidth.


I understand that using a hub limits bandwidth because even if you have 4 USB 3.0 ports at the hub, you're still connecting the hub to only 1 port. I'm asking whether something similar exists here too.
 
Last edited:
Yes, all three ports will be limited to 5gbps if they're used simultaneously. The limit is for the controller, not the actual port. Some devices have multiple controllers for this reason.

However, it's rare that you'd be maxing out three ports at the same time (unless if you're recording video from a usb capture device directly to an external usb drive while simultaneously displaying that video on a usb monitor).

edit: There are multiport controllers (not hubs) that would work the way you outlined.

edit2: If lspci shows a hub, everything downstream of it will share the 5gbps bandwidth, and everything along with it will have a seperate 5gbps connection to the controller. So if you have two hubs and two ports each for hub, then each set of two ports will be limited to 5gbps. This of course changes to 10gbps or 20gbps if you've got a new system that supports those speeds.
 
Last edited:
Thanks @rsaeon. lspci only shows this "Intel Corporation Sunrise Point-LP USB 3.0 xHCI Controller (rev 21)". Could you point me to the sources you referred to on this subject? Would like to read more on multiport controllers. My google skills gave me nothing.

On these lines, I ran lsusb and I got 2 different buses (One for USB 2.0 and 1 for USB 3.0) with several devices to each bus. I think it is safe to assume that the max speed is 5 Gbps + 480 Mbps for the USB 2.0 hub.

The reason for this question was because I wanted to know what would happen if I tried attaching 3 3.5 inch HDDs via USB enclosures (theoretical max speed of 240 MBps) and a USB-Gigabit Ethernet adapter and ran them all together at full bandwidth.

For example, running dd on all 3 drives would result in speeds of 240 MBps per drive.

Which gives us 1980 Mbps or near about 2Gbps per drive. The 3 drives alone will reach around 6 Gbps and if we add in the USB Ethernet adapter working at it's theoretical maximum another 1 Gbps, giving us a grand total of somewhere around 7 Gbps.

Again all this is simply theoretical.
 
Last edited:
This is how it looks in a windows laptop:
1728613501523.png


Above means both usb 3.0 ports can run at 5gbps each because both are connected to their own usb root hub.

@rsaeon every usb port has its own controller irrespective of whether they have their own usb root hub or not.
 
Could you point me to the sources you referred to on this subject?

I wish I had technical references! I needed to look up the USB tree during my chia plotting days but lsusb -tv was what I had to work with. So I ended up plugging external drives to the ports connected to the highest level root hubs as @guest_999 showed for the best possible performance.

Here are outputs from a few different systems I have running, the tree starts with a Bus (from the controller) which is then connected a Root Hub which is then connected to a Hub or Port:

Code:
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
    ID 1d6b:0002 Linux Foundation 2.0 root hub
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/8p, 480M
        ID 8087:8002 Intel Corp. 8 channel internal hub
        |__ Port 5: Dev 3, If 0, Class=Hub, Driver=hub/4p, 480M
            ID 174c:2074 ASMedia Technology Inc. ASM1074 High-Speed hub
        |__ Port 6: Dev 4, If 0, Class=Hub, Driver=hub/4p, 480M
            ID 174c:2074 ASMedia Technology Inc. ASM1074 High-Speed hub

/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 5000M
    ID 1d6b:0003 Linux Foundation 3.0 root hub

/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 480M
    ID 1d6b:0002 Linux Foundation 2.0 root hub

/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
    ID 1d6b:0002 Linux Foundation 2.0 root hub
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/6p, 480M
        ID 8087:800a Intel Corp. Hub

^ This is an older system, Bus.04 is connected to directly to an internal eight port hub that's on the motherboard itself.

Code:
/:  Bus 06.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 20000M
    ID 1d6b:0003 Linux Foundation 3.0 root hub

/:  Bus 05.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M
    ID 1d6b:0002 Linux Foundation 2.0 root hub

/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 10000M
    ID 1d6b:0003 Linux Foundation 3.0 root hub

/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 480M
    ID 1d6b:0002 Linux Foundation 2.0 root hub

/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/10p, 5000M
    ID 1d6b:0003 Linux Foundation 3.0 root hub

/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/16p, 480M
    ID 1d6b:0002 Linux Foundation 2.0 root hub
    |__ Port 13: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
        ID 05e3:0608 Genesys Logic, Inc. Hub
    |__ Port 14: Dev 8, If 0, Class=Human Interface Device, Driver=usbhid, 12M
        ID 1462:7b94 Micro Star International

^ Bus.01 has a internal hub on this motherboard, I think this is for the RGB controller.

Code:
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M
    ID 1d6b:0003 Linux Foundation 3.0 root hub

/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 480M
    ID 1d6b:0002 Linux Foundation 2.0 root hub

/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 10000M
    ID 1d6b:0003 Linux Foundation 3.0 root hub

/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/10p, 480M
    ID 1d6b:0002 Linux Foundation 2.0 root hub

Code:
/:  Bus 06.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M
    ID 1d6b:0003 Linux Foundation 3.0 root hub

/:  Bus 05.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 480M
    ID 1d6b:0002 Linux Foundation 2.0 root hub

/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 10000M
    ID 1d6b:0003 Linux Foundation 3.0 root hub

/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 480M
    ID 1d6b:0002 Linux Foundation 2.0 root hub

/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/8p, 10000M
    ID 1d6b:0003 Linux Foundation 3.0 root hub

/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/14p, 480M
    ID 1d6b:0002 Linux Foundation 2.0 root hub

Code:
/:  Bus 06.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 10000M
    ID 1d6b:0003 Linux Foundation 3.0 root hub

/:  Bus 05.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 480M
    ID 1d6b:0002 Linux Foundation 2.0 root hub

/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 10000M
    ID 1d6b:0003 Linux Foundation 3.0 root hub

/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 480M
    ID 1d6b:0002 Linux Foundation 2.0 root hub

/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 10000M
    ID 1d6b:0003 Linux Foundation 3.0 root hub

/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/10p, 480M
    ID 1d6b:0002 Linux Foundation 2.0 root hub
    |__ Port 10: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 12M
        ID 26ce:01a2

^ Another motherboard with a RGB controller.

I plugged a few devices for the next couple.

Here we can see two ports connected to the same Root Hub, so they would share the total 10gbps bandwidth:

Code:
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/10p, 10000M
    ID 1d6b:0003 Linux Foundation 3.0 root hub
    |__ Port 3: Dev 6, If 0, Class=Mass Storage, Driver=uas, 5000M
        ID 174c:55aa ASMedia Technology Inc. ASM1153E SATA 6Gb/s bridge
    |__ Port 4: Dev 5, If 0, Class=Mass Storage, Driver=usb-storage, 5000M
        ID 0781:5581 SanDisk Corp. Ultra

/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/16p, 480M
    ID 1d6b:0002 Linux Foundation 2.0 root hub

This motherboard has a stack of four usb3 ports, so I connected something to each port:

Code:
/:  Bus 06.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 10000M
    ID 1d6b:0003 Linux Foundation 3.0 root hub
    |__ Port 1: Dev 2, If 0, Class=Mass Storage, Driver=usb-storage, 5000M
        ID 0781:5581 SanDisk Corp. Ultra
    |__ Port 2: Dev 4, If 0, Class=Vendor Specific Class, Driver=ax88179_178a, 5000M
        ID 0b95:1790 ASIX Electronics Corp. AX88179 Gigabit Ethernet

/:  Bus 05.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 480M
    ID 1d6b:0002 Linux Foundation 2.0 root hub

/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 10000M
    ID 1d6b:0003 Linux Foundation 3.0 root hub
    |__ Port 1: Dev 3, If 0, Class=Mass Storage, Driver=uas, 5000M
        ID 174c:55aa ASMedia Technology Inc. ASM1153E SATA 6Gb/s bridge
    |__ Port 2: Dev 2, If 0, Class=Mass Storage, Driver=usb-storage, 5000M
        ID 8564:4000 Transcend Information, Inc. microSD/SD/CF UHS-II Card Reader [RDF8, RDF9]

/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 480M
    ID 1d6b:0002 Linux Foundation 2.0 root hub

/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 10000M
    ID 1d6b:0003 Linux Foundation 3.0 root hub

/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/10p, 480M
    ID 1d6b:0002 Linux Foundation 2.0 root hub

^ Here the four ports are shared across two controllers, each of which has a 10gbps bus. The other 10gbps bus (Bus.02) is the front panel header.

It would also appear that all of these systems have only single port controllers (there is no Bus 0X.Port 2)

Multiport controllers would look like this (found elsewhere for a ASM1042 controller):

Code:
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 5000M
    |__ Port 2: Dev 2, If 0, Class=hub, Driver=hub/4p, 5000M
        |__ Port 1: Dev 3, If 0, Class=vend., Driver=ax88179_178a, 5000M
        |__ Port 2: Dev 4, If 0, Class=vend., Driver=ax88179_178a, 5000M

^ Here, the second port is connected to a usb to dual gigabit adapter so the adapter has an internal 2 port hub.
 
Back
Top