Do you have a network adapter where you need to find the PCIe link speed in Windows? Common reasons include troubleshooting and verification of installation. Some platforms, such as the Intel Xeon D-1500 / D-1600, and AMD EPYC systems mix different PCIe generations on the same motherboard. Also, some systems will lower link rates to lower power consumption. The process can be entirely frustrating. Here is the simple way to see PCIe link speed in 30 seconds.
How to Get Network Adapter PCIe Link Speed in Windows
Step 1: Start PowerShell – There are many ways to get to PowerShell. Perhaps the easiest is to bring up the Windows menu and start typing “PowerShell”. We have had a few cases where this did not work for us unless we selected Run as Administrator via the right menu or right-clicking and selecting via the context menu.
Step 2: Get Network Adapter Link Speeds – PowerShell has a “Get-NetAdapterHardwareInfo” feature. Copy and paste that in PowerShell and you should see all network connections enumerated. One of the Columns is PcieLinkSpeed.
Here is a handy table that will let you know how the bandwidth that corresponds to PCIe Gen1, Gen2, and Gen3 adapters:
- PCIe Gen1 2.5GT/s
- PCIe Gen2 5.0GT/s
- PCIe Gen3 8.0GT/s
The PCIe Gen3 8.0GT/s may seem strange, but that is due to a change in encoding for the PCIe protocol with PCIe 3.0 which means one gets around twice the performance using 8GT/s speeds.
- PCIe 1.1: 250MB/s per lane
- PCIe 2.0: 500MB/s per lane
- PCIe 3.0: 985MB/s per lane (effective)
If you have a 100GbE adapter in a PCIe Gen2 x8 slot, you are clearly not going to have enough bandwidth available.
Final Words
This was not a huge guide by any means. Linux has fairly easy tools to get at this data. Many Windows 10 and Windows Server users do not know the Get-NetAdapterHardwareInfo trick to help get the PCIe speed that a network adapter is currently running at. We hope this guide helps our readers.
How do you get speeds of all other devices?
IMO, PCIe Lane speeds are the single most important function of a computer. You may install a video card expecting to get 16x, only to have it run at half speed without ever knowing. Recent BIOSs have done a better job showing some of this info, but there is no easy way to show it in real-time at the OS level to make sure you’re getting the speeds you expect. AMD completely discards the PCI Lanes as an afterthought on their CPUs and you have to dig to find out how many they handle.
So, are there any ways to get the PCIe Lane info for all other devices on the box?
@Phil: Yep. Just fire up Linux and run ‘lspci -vv’ as root.
How do you do this in Windows 7? Is this even possible in 7?
You CAN get every PCIe devices’ link information in Windows, it’s just a bit buried. There’s two fairly easy methods:
GUI: In Device Manager, open up the item in question and go to the Details tab. In the drop down, you’re looking for “PCI current link speed/width” (there’s also the max versions a bit further down). Speed is shown in PCIe revision numbers; also, beware that the Value section is displayed in hex (so an x16 item will be ‘00000010’).
CLI: Powershell lets you get at WMI, so we can interrogate the same information DM gets via Win32_PNPEntity class objects. It’s way, way more digging than ‘lspci’ would be. This script will try to make a nice user-readable table for you: https://gist.github.com/brokenwindupdoll/07575ac26b002c2111bce950b780ccc1
One thing to note about the Max link info: these are firmware-dependent. So if your motherboard lies, Windows will dutifully report the lie. If, for example, a card only supports 2.0 and is put in a 3.0 slot, the firmware can report the slot as maxing out at 2.0. The same goes for width (which is common on a board that can be x16/x0 or x8/x8 on a pair of slots).
(This may or may not work on Windows 7 and older; the only machines I have access to right now to test with are VMs.)
This command is fun on Linux :D
sudo lspci -vv | grep -P “[0-9a-f]{2}:[0-9a-f]{2}\.[0-9a-f]|LnkSta:”
thanks for sharing such an informative and helpful post.