Наверное, перед многими вставал вопрос: стоит ли покупать 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