Linux проверить скорость диска. Как измерить скорость жесткого диска

Оригинал: Test read/write speed of usb and ssd drives with dd command on Linux
Автор: Silver Moon
Дата публикации: Jul 12, 2014
Перевод: Н.Ромоданов
Дата перевода: октябрь 2014 г.

Скорость работы устройства

Скорость работы устройства измеряется в единицах, указывающих сколько данных оно может читать или писать в единицу времени. Команда dd является простым инструментом командной строки, который можно использовать для чтения и записи произвольных блоков данных на диске и измерять скорость, с которой произошла передача данных.

В этой статье мы будем использовать команду dd для проверки скорости чтения и записи устройств usb и ssd.

Скорость передачи данных зависит не только от диска, но и от интерфейса, через который он подключен. Например порт usb 2.0 имеет максимальное функциональное ограничение по скорости в 35 Мбайт/с, так что даже если вы подключили к порту usb 2 высокоскоростной флэш-накопитель usb 3, скорость будет ограничена меньшим значением.

То же самое относится и к устройству SSD. Устройство SSD подключается через порты SATA, которые имеют разные версии. Sata 2.0 имеет максимальный теоретический предел скорость в 3Гбит/с, что равно примерно 375 Мбайт/с. В то время как SATA 3.0 поддерживает вдвое большую скорость.

Метод тестирования

Смонтируйте диск и перейдите в него из терминального окна. Затем используйте команду dd сначала записи файла, состоящего из блоков фиксированного размера. Затем прочитайте тот же файл с использованием такого же самого размера блоков.

Общий синтаксис команды dd выглядит следующим образом

Dd if=path/to/input_file of=/path/to/output_file bs=block_size count=number_of_blocks

При записи на диске, мы просто выполняем чтение из устройства /dev/zero, которое является источником бесконечного числа байтов. Когда происходит чтении с диска, мы читаем записанный ранее файл и отправляем его в устройство /dev/null, которого на самом деле нет. В течение всего процесса команда dd отслеживает скорость, с которой происходит передача, и сообщает о ней.

Устройство SSD

Устройство SSD, которое мы используем, является диском "Samsung Evo 120GB" SSD. Это устройство ssd начального уровня, относящееся к бюджетным, а также это мой первый диск SSD. Он также является одним из самых производительных твердотельных накопителей из имеющихся на рынке.

В этом тесте диск ssd подключен к порту sata 2.0.

Скорость записи

Давайте сначала сделаем запись на ssd

$ dd if=/dev/zero of=./largefile bs=1M count=1024 1024+0 records in 1024+0 records out 1073741824 bytes (1.1 GB) copied, 4.82364 s, 223 MB/s

Размер блока, на самом деле, довольно большой. Вы можете попробовать использовать меньший размер, например, 64k или даже 4k.

Скорость чтения

Теперь, наоборот, прочитайте тот же самый файл. Но сначала очистите кэш памяти с тем, чтобы быть уверенным, что файл, на самом деле, читается с диска.

Для того, чтобы очистить кэш памяти, выполните следующую команду

$ sudo sh -c "sync && echo 3 > /proc/sys/vm/drop_caches"

Теперь прочитайте файл

$ dd if=./largefile of=/dev/null bs=4k 165118+0 records in 165118+0 records out 676323328 bytes (676 MB) copied, 3.0114 s, 225 MB/s

Устройство USB

В этом тесте мы будем измерять скорость чтения и обыкновенных флеш-накопителей usb. Устройства подключаются к стандартным портам usb 2. Первым устройством является usb-накопитель sony 4gb, а вторым - strontium 16gb.

Сначала подключите устройство и смонтируйте его так, чтобы оно было доступно для чтения. Затем из командной строки перейдите в смонтированный каталог.

Устройство Sony 4GB - запись

В этом тесте, команда dd используется для записи 10000 кусков данных по 8 Кбайт каждый в один файле на диске.

# dd if=/dev/zero of=./largefile bs=8k count=10000 10000+0 records in 10000+0 records out 81920000 bytes (82 MB) copied, 11.0626 s, 7.4 MB/s

Скорость записи составляет около 7,5 Мбайт/с. Это низкий показатель.

Устройство Sony 4GB - чтение

Тот же самый файл считывается для проверки скорости чтения. Для того, чтобы очистить кэш памяти, выполните следующую команду

$ sudo sh -c "sync && echo 3 > /proc/sys/vm/drop_caches"

Теперь прочитайте файл с помощью команды dd

# dd if=./largefile of=/dev/null bs=8k 8000+0 records in 8000+0 records out 65536000 bytes (66 MB) copied, 2.65218 s, 24.7 MB/s

Скорость чтения равна приблизительно 25 Мбайт/с, что более или менее стандартно для дешевых флешек usb.

USB 2.0 имеет теоретическую максимальную скорость передачи сигналов равную 480 Мбит/с или 60 Мбайт/с. Но в силу различных ограничений максимальная пропускная способность ограничена приблизительно значением 280 Мбит/с или 35 Мбайт/с. Помимо этого фактическая скорость зависит от качества флешки, а также и от других факторов.

И поскольку описываемое выше устройство usb было подключено к порту USB 2.0 и была достигнута скорость чтения, равная 24,7 Мбайт/с, что не очень плохо. Но скорость записи сильно отстает.

Теперь давайте выполним тот же самый тест с флешкой Strontium 16gb. Strontium — это еще один бренд, под которым выпускаются очень дешевые флешки usb, но эти флешки надежные.

Скорость записи для устройства Strontium 16gb

# dd if=/dev/zero of=./largefile bs=64k count=1000 1000+0 records in 1000+0 records out 65536000 bytes (66 MB) copied, 8.3834 s, 7.8 MB/s

Скорость чтения для устройства Strontium 16gb

# sudo sh -c "sync && echo 3 > /proc/sys/vm/drop_caches" # dd if=./largefile of=/dev/null bs=8k 8000+0 records in 8000+0 records out 65536000 bytes (66 MB) copied, 2.90366 s, 22.6 MB/s

Скорость чтения данных ниже, чем для устройства Sony.

Чтобы определить скорость записи на диск, необходимо выполнить следующую команду в консоли:

Sync; dd if=/dev/zero of=tempfile bs=1M count=1024; sync

Команда записывает временный файл размером в 1мб 1024 раза и результат ее работы будет вывод таких данных

1024+0 записей получено 1024+0 записей отправлено скопировано 1073741824 байта (1,1 GB), 15,4992 c, 69,3 MB/c

Чтобы определить скорость чтения с диска, необходимо выполнить следующую команду в консоли:

Временный файл, который был сгенерирован предыдущей командой, закеширован в буфер, что само собой повысит скорость его чтения и она будет намного выше чем реальная скорость чтения непосредственно с самого жесткого диска. Для того чтобы получить реальную скорость, необходимо предварительно очистить этот кэш.

Для определения скорости чтения с диска с буфера, нужно выполнить следующую команду в консоли:

Dd if=tempfile of=/dev/null bs=1M count=1024

Вывод предыдущей команды:

1024+0 записей получено 1024+0 записей отправлено скопировано 1073741824 байта (1,1 GB), 15,446 c, 69,5 MB/c

Чтобы измерить реальную скорость чтения с диска очищаем кеш:

Sudo /sbin/sysctl -w vm.drop_caches=3

Вывод команды:

Vm.drop_caches = 3

Производим тест скорости чтения после очистки кеша:

Dd if=tempfile of=/dev/null bs=1M count=1024 1024+0 записей получено 1024+0 записей отправлено скопировано 1073741824 байта (1,1 GB), 16,5786 c, 64,8 MB/c

Выполнение теста скорости чтения/записи на внешнем накопителе

Для тестирования скорости какого-либо Внешнего HDD, USB Флэшки либо иного съемного носителя либо файловой системы удаленной машины(vps/vds), необходимо перейти в точку монтирования и выполнить приведенные выше команды.

Либо, вместо tempfile, можно конечно же прописать путь к точке монтирования, как приведено ниже:

Sync; dd if=/dev/zero of=/media/user/USBFlash/tempfile bs=1M count=1024; sync

Также следует указать, что приведенные выше команды используют временный файл tempfile. Не забудьте удалить его после окончания тестов.

Тест скорости HDD при помощи утилиты hdparm

hdparm — это Linux утилита, которая позволяет быстро узнать скорость чтения с вашего hdd.

Для запуска измерения скорости чтения с вашего жесткого диска необходимо выполнить следующую команду в консоли:

Sudo hdparm -Tt /dev/sda

Вывод команды в консоли:

/dev/sda: Timing cached reads: 6630 MB in 2.00 seconds = 3315.66 MB/sec Timing buffered disk reads: 236 MB in 3.02 seconds = 78.17 MB/sec

На этом все. Таким образом мы смогли узнать производительность нашего жесткого диска и дать примерную оценку его возможностям.

It requires reading the manual (man fio) but it will give you accurate results. Note that for any accuracy, you need to specify exactly what you want to measure. Some examples:

Sequential READ speed with big blocks

Fio --name TEST --eta-newline=5s --filename=fio-tempfile.dat --rw=read --size=500m --io_size=10g --blocksize=1024k --ioengine=libaio --fsync=10000 --iodepth=32 --direct=1 --numjobs=1 --runtime=60 --group_reporting

Sequential WRITE speed with big blocks (this should be near the number you see in the specifications for your drive):

Fio --name TEST --eta-newline=5s --filename=fio-tempfile.dat --rw=write --size=500m --io_size=10g --blocksize=1024k --ioengine=libaio --fsync=10000 --iodepth=32 --direct=1 --numjobs=1 --runtime=60 --group_reporting

Random 4K read QD1 (this is the number that really matters for real world performance unless you know better for sure):

Fio --name TEST --eta-newline=5s --filename=fio-tempfile.dat --rw=randread --size=500m --io_size=10g --blocksize=4k --ioengine=libaio --fsync=1 --iodepth=1 --direct=1 --numjobs=1 --runtime=60 --group_reporting

Mixed random 4K read and write QD1 with sync (this is worst case number you should ever expect from your drive, usually less than 1% of the numbers listed in the spec sheet):

Fio --name TEST --eta-newline=5s --filename=fio-tempfile.dat --rw=randrw --size=500m --io_size=10g --blocksize=4k --ioengine=libaio --fsync=1 --iodepth=1 --direct=1 --numjobs=1 --runtime=60 --group_reporting

Increase the --size argument to increase the file size. Using bigger files may reduce the numbers you get depending on drive technology and firmware. Small files will give "too good" results for rotational media because the read head does not need to move that much. If your device is near empty, using file big enough to almost fill the drive will get you the worst case behavior for each test. In case of SSD, the file size does not matter that much.

However, note that for some storage media the size of the file is not as important as total bytes written during short time period. For example, some SSDs may have significantly faster performance with pre-erased blocks or it might have small SLC flash area that"s used as write cache and the performance changes once SLC cache is full. As an another example, Seagate SMR HDDs have about 20 GB PMR cache area that has pretty high performance but once it gets full, writing directly to SMR area may cut the performance to 10% from the original. And the only way to see this performance degration is to first write 20+ GB as fast as possible. Of course, this all depends on your workload: if your write access is bursty with longish delays that allow the device to clean the internal cache, shorter test sequences will reflect your real world performance better. If you need to do lots of IO, you need to increase both --io_size and --runtime parameters. Note that some media (e.g. most flash devices) will get extra wear from such testing. In my opinion, if any device is poor enough not to handle this kind of testing, it should not be used to hold any valueable data in any case.

In addition, some high quality SSD devices may have even more intelligent wear leveling algorithms where internal SLC cache has enough smarts to replace data in place that is being re-written during the test if it hits the same address space (that is, test file is smaller than total SLC cache). For such devices, the file size starts to matter again. If you need your actual workload it"s best to test with file sizes that you"ll actually see in real life. Otherwise your numbers may look too good.

Note that fio will create the required temporary file on first run. It will be filled with random data to avoid getting too good numbers from devices that cheat by compressing the data before writing it to permanent storage. The temporary file will be called fio-tempfile.dat in above examples and stored in current working directory. So you should first change to directory that is mounted on the device you want to test.

If you have a good SSD and want to see even higher numbers, increase --numjobs above. That defines the concurrency for the reads and writes. The above examples all have numjobs set to 1 so the test is about single threaded process reading and writing (possibly with a queue set with iodepth). High end SSDs (e.g. Intel Optane) should get high numbers even without increasing numjobs a lot (e.g. 4 should be enough to get the highest spec numbers) but some "Enterprise" SSDs require going to 32 - 128 to get the spec numbers because the internal latency of those devices is higher but the overall throughput is insane.

mob_info