тестирование io диска или ssd vs hdd


Наверное, перед многими вставал вопрос: стоит ли покупать SSD диск и насколько он лучше старенького HDD?

В настоящее время SSD уже достаточно обматерели: технологии их производства обкатаны, цены не очень кусаются, продолжительность жизни гарантируется производителем.

В то же время, на данный момент HDD — самая медленная часть системы, её бутылочное горлышко.

Нас привлекает в SSD последовательная  и случайная скорость записи/чтения, количество операций ввода-вывода за короткий промежуток времени.

Но в то же время нас отталкивает несколько завышенная цена за объем данных и рассказы о славной, но очень короткой их жизни.

Не буду рассказывать про принципиальные различия в устройстве HDD и SSD, а также как долго проработает SSD при различной нагрузке. Я приведу пример тестирования своего SSD и HDD с помощью dd, seeker, fio и выскажу свои мысли по поводу того, в каких условиях оптимальней и дешевле применять SSD диски.

Имеются SSD: Intel 530 180GB

hdparm -I /dev/sda

/dev/sda:

ATA device, with non-removable media
    Model Number:       INTEL SSDSC2BW180A4
    Serial Number:      BTDA328304591802GN
    Firmware Revision:  DC12
    Transport:          Serial, ATA8-AST, SATA 1.0a, SATA II Extensions, SATA Rev 2.5, SATA Rev 2.6, SATA Rev 3.0
...

и HDD:  Western Digital 500GB, 7200 rps, 2.5”

hdparm -I /dev/sdb

/dev/sdb:

ATA device, with non-removable media
    Model Number:       WDC WD5000BPKT-22PK4T0
    Serial Number:      WD-WXD1A83C9652
    Firmware Revision:  01.01A01
    Transport:          Serial, SATA 1.0a, SATA II Extensions, SATA Rev 2.5, SATA Rev 2.6

Стоит последний в 2,75 раза дешевле чем первый, имея при этом в 2,78 раза больший объем.

На SSD стоят две системы: Windows 7 и Linux Debian Testing (Jessie). По ощущениям работает все в разы быстрее, учитывая что SSD трудится не в полную мощь, т.к. у меня SATA II.

Тестировал на Linux несколькими инструментами. Набор тестировочных инструментов обоснован исключительно личными предпочтениями.

Seeker

По-идее, должен выдавать честные IOPS (количество операций ввода-вывода в секунду), но мне кажется, что он сильно приуменьшает картину для SSD, т.к. был написан исключительно для тестирования вращающихся магнитных дисков.

SSD

seeker /dev/sda
Seeker v2.0, 2007-01-15, http://www.linuxinsight.com/how_fast_is_your_disk.html
Benchmarking /dev/sda [171705MB], wait 30 seconds..............................
Results: 3294 seeks/second, 0.30 ms random access time

HDD

seeker /dev/sdb
Seeker v2.0, 2007-01-15, http://www.linuxinsight.com/how_fast_is_your_disk.html
Benchmarking /dev/sdb [476940MB], wait 30 seconds..............................
Results: 66 seeks/second, 15.14 ms random access time

DD

Банальное тестирование скорости последовательной записи/чтения.

SSD

Запись:

dd if=/dev/zero of=test bs=128k count=4k conv=fdatasync
4096+0 records in
4096+0 records out
536870912 bytes (537 MB) copied, 2.56394 s, 209 MB/s

Чтение:

dd of=/dev/null if=test bs=128k count=4k conv=fdatasync
dd: fsync failed for ‘/dev/null’: Invalid argument
4096+0 records in
4096+0 records out
536870912 bytes (537 MB) copied, 2.17264 s, 247 MB/s

HDD

Этот диск отформатирован в ntfs (да, знаю), но для работы с ним используется не ntfs-3g модуль, а ufsd от Paragon.

Запись:

dd if=/dev/zero of=test bs=128k count=4k conv=fdatasync
4096+0 records in
4096+0 records out
536870912 bytes (537 MB) copied, 5.27182 s, 102 MB/s

Чтение:

dd if=test of=/dev/null bs=128k iflag=direct
4096+0 records in
4096+0 records out
536870912 bytes (537 MB) copied, 5.0895 s, 105 MB/s

FIO

fio — продвинутый инструмент для тестирования дисковой производительности.

Кстати, он нам поможет замерить кол-во IOPS — операций в секунду, что очень критично для задач со случайной записью/чтением, а таких множество.

Для его работы неплохо бы составить тестовый сценарий в ini файле-конфигурации, что я и сделал. Конфиг прокомментирован, надеюсь понятно. Дополнительную информацию о параметрах запуска и конфигурационных опциях можно посмотреть в man fio.

[random-read]
# Random read and write
rw=randread
# Use direct operations
direct=1
# Disable buffers
buffered=0
# Run time in seconds
runtime=60
# Test hard drive
filename=test
# Block size, used default value
bs=4096
# Number of parallel threads
numjobs=1

Для тестирования будем использовать уже созданный dd файл test, размером 512МБ.

Для большей точности в конфиге будем менять параметр rw для тестирования записи на randwrite.

Команда запуска очень простая:

fio config.ini

HDD

Чтение:

random-read: (g=0): rw=randread, bs=4K-4K/4K-4K/4K-4K, ioengine=sync, iodepth=1
fio-2.1.11
Starting 1 process
Jobs: 1 (f=1): [r(1)] [100.0% done] [611KB/0KB/0KB /s] [152/0/0 iops] [eta 00m:00s]
random-read: (groupid=0, jobs=1): err= 0: pid=4348: Mon Sep  1 12:59:26 2014
  read : io=34380KB, bw=586742B/s, iops=143, runt= 60001msec
    clat (usec): min=175, max=75656, avg=6957.26, stdev=2928.76
     lat (usec): min=176, max=75657, avg=6958.66, stdev=2928.78
    clat percentiles (usec):
     |  1.00th=[ 1592],  5.00th=[ 2544], 10.00th=[ 3280], 20.00th=[ 4384],
     | 30.00th=[ 5280], 40.00th=[ 6112], 50.00th=[ 6944], 60.00th=[ 7776],
     | 70.00th=[ 8640], 80.00th=[ 9536], 90.00th=[10560], 95.00th=[11328],
     | 99.00th=[12480], 99.50th=[13120], 99.90th=[19328], 99.95th=[22656],
     | 99.99th=[75264]
    bw (KB  /s): min=  451, max=  653, per=100.00%, avg=573.14, stdev=31.90
    lat (usec) : 250=0.51%, 500=0.19%, 750=0.10%
    lat (msec) : 2=1.30%, 4=14.07%, 10=69.75%, 20=14.01%, 50=0.05%
    lat (msec) : 100=0.02%
  cpu          : usr=0.49%, sys=1.52%, ctx=8666, majf=0, minf=26
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued    : total=r=8595/w=0/d=0, short=r=0/w=0/d=0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
   READ: io=34380KB, aggrb=572KB/s, minb=572KB/s, maxb=572KB/s, mint=60001msec, maxt=60001msec

Disk stats (read/write):
  sdb: ios=8594/11, merge=0/0, ticks=58920/128, in_queue=58984, util=98.10%

Запись:

random-read: (g=0): rw=randwrite, bs=4K-4K/4K-4K/4K-4K, ioengine=sync, iodepth=1
fio-2.1.11
Starting 1 process
Jobs: 1 (f=1): [w(1)] [100.0% done] [0KB/1426KB/0KB /s] [0/356/0 iops] [eta 00m:00s]
random-read: (groupid=0, jobs=1): err= 0: pid=4467: Mon Sep  1 13:04:15 2014
  write: io=84332KB, bw=1405.5KB/s, iops=351, runt= 60003msec
    clat (usec): min=160, max=574381, avg=2822.38, stdev=4654.38
     lat (usec): min=160, max=574382, avg=2824.40, stdev=4654.37
    clat percentiles (usec):
     |  1.00th=[  282],  5.00th=[  462], 10.00th=[  668], 20.00th=[ 1020],
     | 30.00th=[ 1288], 40.00th=[ 1800], 50.00th=[ 2608], 60.00th=[ 2896],
     | 70.00th=[ 3344], 80.00th=[ 4320], 90.00th=[ 5088], 95.00th=[ 5856],
     | 99.00th=[10176], 99.50th=[14144], 99.90th=[25984], 99.95th=[29056],
     | 99.99th=[63744]
    bw (KB  /s): min=  322, max= 2353, per=100.00%, avg=1410.47, stdev=174.93
    lat (usec) : 250=0.16%, 500=5.42%, 750=9.87%, 1000=3.21%
    lat (msec) : 2=23.64%, 4=33.15%, 10=23.48%, 20=0.75%, 50=0.31%
    lat (msec) : 100=0.01%, 250=0.01%, 750=0.01%
  cpu          : usr=1.11%, sys=3.85%, ctx=21591, majf=0, minf=27
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued    : total=r=0/w=21083/d=0, short=r=0/w=0/d=0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
  WRITE: io=84332KB, aggrb=1405KB/s, minb=1405KB/s, maxb=1405KB/s, mint=60003msec, maxt=60003msec

Disk stats (read/write):
  sdb: ios=0/21089, merge=0/0, ticks=0/58452, in_queue=58296, util=94.98%

Как видно из теста, получили 143 iops для чтения и 351 для записи.

См. значение iops.

SDD

Чтение:

random-read: (g=0): rw=randread, bs=4K-4K/4K-4K/4K-4K, ioengine=sync, iodepth=1
fio-2.1.11
Starting 1 process
Jobs: 1 (f=1): [r(1)] [100.0% done] [6909KB/0KB/0KB /s] [1727/0/0 iops] [eta 00m:00s]
random-read: (groupid=0, jobs=1): err= 0: pid=4593: Mon Sep  1 13:08:48 2014
  read : io=458044KB, bw=7633.1KB/s, iops=1908, runt= 60001msec
    clat (usec): min=137, max=26285, avg=502.11, stdev=608.70
     lat (usec): min=137, max=26286, avg=503.33, stdev=608.72
    clat percentiles (usec):
     |  1.00th=[  270],  5.00th=[  314], 10.00th=[  330], 20.00th=[  366],
     | 30.00th=[  394], 40.00th=[  418], 50.00th=[  442], 60.00th=[  462],
     | 70.00th=[  490], 80.00th=[  516], 90.00th=[  572], 95.00th=[  628],
     | 99.00th=[ 1528], 99.50th=[ 5088], 99.90th=[ 9536], 99.95th=[10048],
     | 99.99th=[13376]
    bw (KB  /s): min= 6688, max= 9512, per=100.00%, avg=7640.46, stdev=684.85
    lat (usec) : 250=0.46%, 500=74.49%, 750=22.06%, 1000=0.97%
    lat (msec) : 2=1.21%, 4=0.25%, 10=0.51%, 20=0.06%, 50=0.01%
  cpu          : usr=5.25%, sys=20.36%, ctx=116403, majf=0, minf=27
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued    : total=r=114511/w=0/d=0, short=r=0/w=0/d=0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
   READ: io=458044KB, aggrb=7633KB/s, minb=7633KB/s, maxb=7633KB/s, mint=60001msec, maxt=60001msec

Disk stats (read/write):
    dm-0: ios=114103/325, merge=0/0, ticks=46964/764, in_queue=47740, util=78.64%, aggrios=114511/352, aggrmerge=0/12, aggrticks=25124/560, aggrin_queue=25280, aggrutil=41.24%
  sda: ios=114511/352, merge=0/12, ticks=25124/560, in_queue=25280, util=41.24%

Запись:

random-read: (g=0): rw=randwrite, bs=4K-4K/4K-4K/4K-4K, ioengine=sync, iodepth=1
fio-2.1.11
Starting 1 process
Jobs: 1 (f=1): [w(1)] [100.0% done] [0KB/7544KB/0KB /s] [0/1886/0 iops] [eta 00m:00s]
random-read: (groupid=0, jobs=1): err= 0: pid=4608: Mon Sep  1 13:11:42 2014
  write: io=449364KB, bw=7489.2KB/s, iops=1872, runt= 60002msec
    clat (usec): min=139, max=16564, avg=514.02, stdev=467.37
     lat (usec): min=139, max=16565, avg=515.64, stdev=467.42
    clat percentiles (usec):
     |  1.00th=[  239],  5.00th=[  306], 10.00th=[  326], 20.00th=[  354],
     | 30.00th=[  390], 40.00th=[  414], 50.00th=[  430], 60.00th=[  442],
     | 70.00th=[  458], 80.00th=[  502], 90.00th=[  620], 95.00th=[ 1064],
     | 99.00th=[ 2160], 99.50th=[ 2288], 99.90th=[ 5472], 99.95th=[10176],
     | 99.99th=[13632]
    bw (KB  /s): min= 3544, max= 8928, per=100.00%, avg=7495.72, stdev=738.53
    lat (usec) : 250=1.54%, 500=78.34%, 750=11.73%, 1000=2.67%
    lat (msec) : 2=3.99%, 4=1.60%, 10=0.07%, 20=0.06%
  cpu          : usr=5.17%, sys=13.33%, ctx=116077, majf=0, minf=27
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued    : total=r=0/w=112341/d=0, short=r=0/w=0/d=0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
  WRITE: io=449364KB, aggrb=7489KB/s, minb=7489KB/s, maxb=7489KB/s, mint=60002msec, maxt=60002msec

Disk stats (read/write):
    dm-0: ios=0/113971, merge=0/0, ticks=0/62128, in_queue=62136, util=78.80%, aggrios=0/113839, aggrmerge=0/309, aggrticks=0/40024, aggrin_queue=39768, aggrutil=61.34%
  sda: ios=0/113839, merge=0/309, ticks=0/40024, in_queue=39768, util=61.34%

Итого около 1900 iops на чтениие и запись, что на порядок больше, чем у HDD.

Fio выводит много полезной информации для анализа производительности, но т.к. эта статья не про fio, то углубляться в анализ не буду.

Что остается в сухом остатке? Мы видим, что SSD на голову превосходит HDD для типичных серверных и десктопных нагрузок и SSD просто необходимо использовать для высоконагруженных систем, постоянно обращающихся к дисковой подсистеме.

Например для баз данных, веб серверов, сборочных платформ (компиляция, линковка), рендеринг (3D, видео), обработка фото, музыки и пр.

SSD также стоит использовать как корневой раздел для домашней операционной системы, устанавливать туда игры и программы.

Современные SSD достаточно долговечны, чтоб бояться много писать в них. Моему диску уже год и он вполне хорошо себя чуствует. Вот вывод SMART по нему:

smartctl -A /dev/sda
smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.14-2-amd64] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF READ SMART DATA SECTION ===
SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  5 Reallocated_Sector_Ct   0x0032   100   100   000    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       1604 (57 112 0)
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       484
170 Unknown_Attribute       0x0033   100   100   010    Pre-fail  Always       -       0
171 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       0
172 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       0
174 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       15
183 Runtime_Bad_Block       0x0032   100   100   000    Old_age   Always       -       2
184 End-to-End_Error        0x0033   100   100   090    Pre-fail  Always       -       0
187 Reported_Uncorrect      0x0032   100   100   000    Old_age   Always       -       0
190 Airflow_Temperature_Cel 0x0032   040   051   000    Old_age   Always       -       40 (Min/Max 18/51)
192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       15
199 UDMA_CRC_Error_Count    0x0032   100   100   000    Old_age   Always       -       0
225 Unknown_SSD_Attribute   0x0032   100   100   000    Old_age   Always       -       37817
226 Unknown_SSD_Attribute   0x0032   100   100   000    Old_age   Always       -       65535
227 Unknown_SSD_Attribute   0x0032   100   100   000    Old_age   Always       -       36
228 Power-off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       65535
232 Available_Reservd_Space 0x0033   100   100   010    Pre-fail  Always       -       0
233 Media_Wearout_Indicator 0x0032   100   100   000    Old_age   Always       -       0
241 Total_LBAs_Written      0x0032   100   100   000    Old_age   Always       -       37817
242 Total_LBAs_Read         0x0032   100   100   000    Old_age   Always       -       20951
249 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       5983
comments powered by Disqus