Linux Command To Find SATA Link Speed Such as 1.5 / 3.0 / 6.0 Gbps [ Hard Disk ]

by on September 4, 2012 · 12 comments· LAST UPDATED September 4, 2012

in

Tutorial details
DifficultyEasy (rss)
Root privilegesYes
RequirementsNone
Estimated completion timeN/A

How do I find out my SATA link speed? How do I make sure my sata hard disk is working at 6Gbps speed and how do I verify this under Linux server running on HP hardware?

You need to go through the dmesg command output or a log file called /var/log/messages as follows:

 
dmesg | grep -i sata | grep 'link up'
 

Sample outputs:

[   18.120000] ata1: SATA link up 3.0 Gbps (SStatus 123 SControl F300)
[   39.530000] ata2: SATA link up 3.0 Gbps (SStatus 123 SControl F300)

You can find same info using /var/log/messages:
# grep -i SATA /var/log/messages | grep --color -i 'link up'
Sample outputs:

Sep  2 14:56:50 wks01 kernel: [25518.962661] ata2: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
Sep  2 14:56:50 wks01 kernel: [25520.158303] ata1: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
Sep  2 14:56:50 wks01 kernel: [25521.117722] ata3: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
Sep  2 22:09:06 wks01 kernel: [    3.451270] ata1: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
Sep  2 22:09:06 wks01 kernel: [    3.823019] ata2: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
Sep  2 22:09:06 wks01 kernel: [    4.154815] ata3: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
Sep  3 04:14:11 wks01 kernel: [    3.486897] ata1: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
Sep  3 04:14:11 wks01 kernel: [    3.858745] ata2: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
Sep  3 04:14:11 wks01 kernel: [    4.186682] ata3: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
Sep  3 09:17:10 wks01 kernel: [    3.538938] ata1: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
Sep  3 09:17:10 wks01 kernel: [    3.906824] ata2: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
Sep  3 09:17:10 wks01 kernel: [    4.234739] ata3: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
Sep  4 04:13:33 wks01 kernel: [    3.510810] ata1: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
Sep  4 04:13:33 wks01 kernel: [    3.878764] ata2: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
Sep  4 04:13:33 wks01 kernel: [    4.206646] ata3: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
TwitterFacebookGoogle+PDF versionFound an error/typo on this page? Help us!

{ 12 comments… read them below or add one }

1 ashwani September 5, 2012 at 12:35 am

Hi,

How to know speed of my external usb HDD is there any specific command?

thanks

Reply

2 Balachander Ganesan September 5, 2012 at 6:05 am

Ashwani the most reliable method is to copy a big file say 4GB or so.
From your system to external HDD and check iostat.
However, your internal HDD should be fast enough and system shouldn’t be loaded.
I trust this method :)

Reply

3 Petrinko Philippe September 5, 2012 at 8:50 am

Interesting, but then, I would like to know more:
- How to you toggle to higher bit rate when/if possible?
- How do you link these message to your drives? For instance, you have here “ata3″ link, how does this links to any /dev/sd.. ?
TIA,
– P

Reply

4 nixCraft September 6, 2012 at 12:02 am

How to you toggle to higher bit rate when/if possible?

You need to pass boot time kernel parameters using grub. Search libata.force using this doc. Example to force 1.5G and 3.0G: libata.force=1:3.0G,2:1.5G

How do you link these message to your drives? For instance, you have here “ata3″ link, how does this links to any /dev/sd.. ?

You need to go through /sys/class/ata_link. Search for sata_spd file. Use lsscsi command to map ids.

cat /sys/devices/pci0000:00/0000:00:1f.2/ata3/link3/ata_link/link3/sata_spd

Also

dmesg | grep -i --color ahci
dmesg | grep -i  ahci | grep -i --color Gbps

Reply

5 Philippe Petrinko September 6, 2012 at 8:53 am

Thanks Vivek.

By the way, on my Debian squeeze 6.0.5, /sys/class does not contain /ata_link but it contains:

  • scsi_device
  • scsi_disk
  • scsi_generic
  • scsi_host

I tried to find clues, such as in /sys/class/scsi_device/2\:0\:0\:0/device/, but then I cannot make a link to ata3 or alikes. No sata_spd found yet.

I have used lsscsi, either, and I have just watched your video and your lsscsi topic.

I am still unable to link “ata3″ to an exact drive, “dmesg|grep” commands didn’t tell much, but thanks to you, I learned some new stuff. :-))

– Philippe

Reply

6 nixCraft September 6, 2012 at 11:31 am

Philippe,

Commands discussed here depends upon your bios, hd firmware, motherboard and kernel driver. You need libata driver loaded. Linux ship with various ata driver located in /lib/modules/$(uname -r)/kernel/drivers/ata. Linux will load the correct driver at boot time as per your hardware. The examples output is taken from kernel v3.2.0 running on Debian Linux 6.0.5. For testing purpose try loading backported kernel v3.2.0.

HTH

Reply

7 Philippe Petrinko September 6, 2012 at 1:28 pm

Thanks again.

FYI, on my plain debian 6.0.5, Linux uses following modules tree:
ata_generic => libata => scsi_mod
So kernel v3.2.0 does not seem mandatory for libata
Linux runs on a Thinkpad T400 laptop (exact model 64741AG).

–P

Reply

8 george September 14, 2012 at 10:10 am

To measure the actual speed of an external USB disk:
I use dd command from dev/null to a file on that USB disk, using block size parameter set to 1MB, and count set to 1000. This creates a 1 GB file, so averages disk speed, and eliminates buffering.
The above is for write speed
from a 1 GB file on the USB disk to /dev/null, you can test read speed

Reply

9 Dhaval September 14, 2012 at 6:06 pm

Hi Guys,

My SATA link shows 1.5 GB
[ 1.204017] ata1: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
However when I check the read write speed I get
/dev/sda1:
Timing cached reads: 412 MB in 2.01 seconds = 205.47 MB/sec
Timing buffered disk reads: 166 MB in 3.03 seconds = 54.80 MB/sec

And when I copy a file over a 1 Gbps network connection I get around 30 to 40 mbps. What could be the bottle neck as I believe the network file transfer speeds should be able to reach over 105-110 Mbps.

Reply

10 Alex January 26, 2014 at 10:02 pm

The problem with relying on dmesg is that the message may have dissapeared on systems with a long uptime.

This can be an alternative:
$ smartctl -a /dev/sda|grep ^SATA
SATA Version is: SATA 3.0, 6.0 Gb/s (current: 3.0 Gb/s)

(on my SATA 1 disk, this line does not appear)

Reply

11 Shawn Hicks January 29, 2014 at 4:08 am

Your post (and some of the comments) inspired me to write this, it prints all ata_link speeds and devices:

#!/bin/sh
for i in `grep -l Gbps /sys/class/ata_link/*/sata_spd`; do
 echo Link "${i%/*}" Speed `cat $i`
 cat "${i%/*}"/device/dev*/ata_device/dev*/id | perl -nE 's/([0-9a-f]{2})/print chr hex $1/gie' | echo "    " Device `strings` | cut -f 1-3
done

Reply

12 Ankur March 29, 2014 at 12:25 pm

Thanks for this script. It clearly printed the hard drive name and speed.

Reply

Leave a Comment

Tagged as: , , , ,

Previous Faq:

Next Faq: