Benchmark ssd на Linux: Як виміряти ті ж речі, що і crystaldiskmark у Windows


26

Я хочу порівняти ssd (можливо, із зашифрованими файловими системами) і порівняти його з орієнтирами, виконаними crystaldiskmark на Windows.

CrystalDiskMark у Windows

Тож як я можу виміряти приблизно ті ж речі, що і кристалісскмарк?

Для першого ряду (Seq) я думаю, що я міг би зробити щось подібне

LC_ALL=C dd if=/dev/zero of=tempfile bs=1M count=1024 conv=fdatasync,notrunc

sudo su -c "echo 3 > /proc/sys/vm/drop_caches"
LC_ALL=C dd if=tempfile of=/dev/null bs=1M count=1024

Але я не впевнений у ddпараметрах.

Для випадкових 512KB, 4KB, 4KB (глибина черги = 32) читає / пише тести швидкості. Я не маю уявлення, як відтворити вимірювання в Linux? То як я можу це зробити?

Для тестування швидкості читання щось на кшталт sudo hdparm -Tt /dev/sda, здається, не має для мене сенсу, оскільки я хочу, наприклад, орієнтувати щось на зразок encfsкріплення.

Редагувати

@Alko, @iain

Можливо, мені слід написати щось про мотивацію щодо цього питання: я намагаюся порівняти свій ssd і порівняти деякі рішення шифрування. Але це ще одне питання ( найкращий спосіб порівняти різні рішення шифрування в моїй системі ). Під час серфінгу в Інтернеті про ssd та бенчмаркінгу я часто бачив, як користувачі публікують свої результати CrystelDiskMark на форумах. Тож це єдина мотивація питання. Я просто хочу зробити те ж саме на Linux. Для мого конкретного бенчмаркінгу див. Моє інше питання.


Чому ви не використовуєте інструмент бенчмаркінгу, який працює в обох системах?
Алько

Виявив це, здається, дуже корисним, і в моєму короткому тестуванні на трьох окремих накопичувачах були дуже схожі цифри з фактичним crystaldiskmark ... github.com/buty4649/fio-cdm
ljwobker

2019: Цей Q заслуговує на новий початок - важлива тема, але тут трохи втратили свою увагу. "Прийняти та архівувати".
Растафіл

Відповіді:


22

Я б сказав, що фіо не матиме проблем із створенням цих навантажень. Зауважте, що незважаючи на свою назву, CrystalDiskMark насправді є орієнтиром файлової системи на певному диску - він не може робити введення-виведення сировиною на диску один. Як така, у ній завжди буде накладена файлова система (не обов'язково погана річ, але щось слід пам’ятати, наприклад, тому що файлові системи, що порівнюються, можуть бути не однаковими).

Приклад, заснований на реплікації виводу на скріншоті вище, доповненому інформацією з посібника CrystalDiskMark (це не є повним, але має дати загальне уявлення):

fio --loops=5 --size=1000m --filename=/mnt/fs/fiotest.tmp --stonewall --ioengine=libaio --direct=1 \
  --name=Seqread --bs=1m --rw=read \
  --name=Seqwrite --bs=1m --rw=write \
  --name=512Kread --bs=512k --rw=randread \
  --name=512Kwrite --bs=512k --rw=randwrite \
  --name=4kQD32read --bs=4k --iodepth=32 --rw=randread \
  --name=4kQD32write --bs=4k --iodepth=32 --rw=randwrite
rm -f /mnt/fs/fiotest.tmp 

Будьте уважні - цей приклад назавжди знищує дані в /mnt/fs/fiotest.tmp!

Список параметрів fio можна побачити на http://fio.readthedocs.io/en/latest/fio_doc.html .


3
Я спробував fio в Ubuntu 16.04 та CrystalDiskMark в Windows 7. Деякі номери збігаються, а інші - ні. Послідовна r / w була вимкнена з коефіцієнтом 2. Значення, значення Linux були на 50% від тих, про які повідомляє CDM v3.0.4 (зауважте: поточна версія 6.0.0, але для завантаження ще доступні старі версії). Для вирішення w / невідповідності я встановив bs = 4m замість 1m. Це зблизило цифри. Спроба 8 м і 32 м зробила це ще ближче. Зрештою, як Анон сказав, що його відповідь не є повною і як @Alko, нам потрібен однаковий інструмент для обох ОС. Також зауважте, що новітні CDM 6 використовують інші тести, ніж ОП. Приємна інформація Anon
Vahid Pazirandeh

2
@VahidPazirandeh Цікаво, github.com/buty4649/fio-cdm/blob/master/fio-cdm має однакові налаштування 1м, можливо, документація на cdm недостатньо хороша.
inf3rno

@ vahid-pazirandeh Запрошуємо вас. Примітка: якщо ви хочете використовувати один і той же інструмент на обох ОС, зверніть увагу, що є версія і fio для Windows.
Анон

8

Я створив сценарій, який намагається повторити поведінку crystaldiskmark з fio. Сценарій робить усі тести, доступні в різних версіях crystaldiskmark аж до crystaldiskmark 6, включаючи тести 512K та 4KQ8T8.

Сценарій залежить від fio та df . Якщо ви не хочете встановлювати df, видаліть рядки з 19 по 21 (сценарій більше не відображатиме те, який диск перевіряється) або спробуйте модифіковану версію від коментатора . (Може також вирішити інші можливі питання)

#!/bin/bash

LOOPS=5 #How many times to run each test
SIZE=1024 #Size of each test, multiples of 32 recommended for Q32 tests to give the most accurate results.
WRITEZERO=0 #Set whether to write zeroes or randoms to testfile (random is the default for both fio and crystaldiskmark); dd benchmarks typically only write zeroes which is why there can be a speed difference.

QSIZE=$(($SIZE / 32)) #Size of Q32Seq tests
SIZE+=m
QSIZE+=m

if [ -z $1 ]; then
    TARGET=$HOME
    echo "Defaulting to $TARGET for testing"
else
    TARGET="$1"
    echo "Testing in $TARGET"
fi

DRIVE=$(df $TARGET | grep /dev | cut -d/ -f3 | cut -d" " -f1 | rev | cut -c 2- | rev)
DRIVEMODEL=$(cat /sys/block/$DRIVE/device/model)
DRIVESIZE=$(($(cat /sys/block/$DRIVE/size)*512/1024/1024/1024))GB

echo "Configuration: Size:$SIZE Loops:$LOOPS Write Only Zeroes:$WRITEZERO
Running Benchmark on: /dev/$DRIVE, $DRIVEMODEL ($DRIVESIZE), please wait...
"

fio --loops=$LOOPS --size=$SIZE --filename=$TARGET/.fiomark.tmp --stonewall --ioengine=libaio --direct=1 --zero_buffers=$WRITEZERO --output-format=json \
  --name=Bufread --loops=1 --bs=$SIZE --iodepth=1 --numjobs=1 --rw=readwrite \
  --name=Seqread --bs=$SIZE --iodepth=1 --numjobs=1 --rw=read \
  --name=Seqwrite --bs=$SIZE --iodepth=1 --numjobs=1 --rw=write \
  --name=512kread --bs=512k --iodepth=1 --numjobs=1 --rw=read \
  --name=512kwrite --bs=512k --iodepth=1 --numjobs=1 --rw=write \
  --name=SeqQ32T1read --bs=$QSIZE --iodepth=32 --numjobs=1 --rw=read \
  --name=SeqQ32T1write --bs=$QSIZE --iodepth=32 --numjobs=1 --rw=write \
  --name=4kread --bs=4k --iodepth=1 --numjobs=1 --rw=randread \
  --name=4kwrite --bs=4k --iodepth=1 --numjobs=1 --rw=randwrite \
  --name=4kQ32T1read --bs=4k --iodepth=32 --numjobs=1 --rw=randread \
  --name=4kQ32T1write --bs=4k --iodepth=32 --numjobs=1 --rw=randwrite \
  --name=4kQ8T8read --bs=4k --iodepth=8 --numjobs=8 --rw=randread \
  --name=4kQ8T8write --bs=4k --iodepth=8 --numjobs=8 --rw=randwrite > $TARGET/.fiomark.txt

SEQR="$(($(cat $TARGET/.fiomark.txt | grep -A15 '"name" : "Seqread"' | grep bw_bytes | cut -d: -f2 | sed s:,::g)/1024/1024))MB/s IOPS=$(cat $TARGET/.fiomark.txt | grep -A15 '"name" : "Seqread"' | grep -m1 iops | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
SEQW="$(($(cat $TARGET/.fiomark.txt | grep -A80 '"name" : "Seqwrite"' | grep bw_bytes | sed '2!d' | cut -d: -f2 | sed s:,::g)/1024/1024))MB/s IOPS=$(cat $TARGET/.fiomark.txt | grep -A80 '"name" : "Seqwrite"' | grep iops | sed '7!d' | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
F12KR="$(($(cat $TARGET/.fiomark.txt | grep -A15 '"name" : "512kread"' | grep bw_bytes | cut -d: -f2 | sed s:,::g)/1024/1024))MB/s IOPS=$(cat $TARGET/.fiomark.txt | grep -A15 '"name" : "512kread"' | grep -m1 iops | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
F12KW="$(($(cat $TARGET/.fiomark.txt | grep -A80 '"name" : "512kwrite"' | grep bw_bytes | sed '2!d' | cut -d: -f2 | sed s:,::g)/1024/1024))MB/s IOPS=$(cat $TARGET/.fiomark.txt | grep -A80 '"name" : "512kwrite"' | grep iops | sed '7!d' | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
SEQ32R="$(($(cat $TARGET/.fiomark.txt | grep -A15 '"name" : "SeqQ32T1read"' | grep bw_bytes | cut -d: -f2 | sed s:,::g)/1024/1024))MB/s IOPS=$(cat $TARGET/.fiomark.txt | grep -A15 '"name" : "SeqQ32T1read"' | grep -m1 iops | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
SEQ32W="$(($(cat $TARGET/.fiomark.txt | grep -A80 '"name" : "SeqQ32T1write"' | grep bw_bytes | sed '2!d' | cut -d: -f2 | sed s:,::g)/1024/1024))MB/s IOPS=$(cat $TARGET/.fiomark.txt | grep -A80 '"name" : "SeqQ32T1write"' | grep iops | sed '7!d' | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
FKR="$(($(cat $TARGET/.fiomark.txt | grep -A15 '"name" : "4kread"' | grep bw_bytes | cut -d: -f2 | sed s:,::g)/1024/1024))MB/s IOPS=$(cat $TARGET/.fiomark.txt | grep -A15 '"name" : "4kread"' | grep -m1 iops | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
FKW="$(($(cat $TARGET/.fiomark.txt | grep -A80 '"name" : "4kwrite"' | grep bw_bytes | sed '2!d' | cut -d: -f2 | sed s:,::g)/1024/1024))MB/s IOPS=$(cat $TARGET/.fiomark.txt | grep -A80 '"name" : "4kwrite"' | grep iops | sed '7!d' | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
FK32R="$(($(cat $TARGET/.fiomark.txt | grep -A15 '"name" : "4kQ32T1read"' | grep bw_bytes | cut -d: -f2 | sed s:,::g)/1024/1024))MB/s IOPS=$(cat $TARGET/.fiomark.txt | grep -A15 '"name" : "4kQ32T1read"' | grep -m1 iops | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
FK32W="$(($(cat $TARGET/.fiomark.txt | grep -A80 '"name" : "4kQ32T1write"' | grep bw_bytes | sed '2!d' | cut -d: -f2 | sed s:,::g)/1024/1024))MB/s IOPS=$(cat $TARGET/.fiomark.txt | grep -A80 '"name" : "4kQ32T1write"' | grep iops | sed '7!d' | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
FK8R="$(($(cat $TARGET/.fiomark.txt | grep -A15 '"name" : "4kQ8T8read"' | grep bw_bytes | sed 's/        "bw_bytes" : //g' | sed 's:,::g' | awk '{ SUM += $1} END { print SUM }')/1024/1024))MB/s IOPS=$(cat $TARGET/.fiomark.txt | grep -A15 '"name" : "4kQ8T8read"' | grep iops | sed 's/        "iops" : //g' | sed 's:,::g' | awk '{ SUM += $1} END { print SUM }' | cut -d. -f1)"
FK8W="$(($(cat $TARGET/.fiomark.txt | grep -A80 '"name" : "4kQ8T8write"' | grep bw_bytes | sed 's/        "bw_bytes" : //g' | sed 's:,::g' | awk '{ SUM += $1} END { print SUM }')/1024/1024))MB/s IOPS=$(cat $TARGET/.fiomark.txt | grep -A80 '"name" : "4kQ8T8write"' | grep '"iops" '| sed 's/        "iops" : //g' | sed 's:,::g' | awk '{ SUM += $1} END { print SUM }' | cut -d. -f1)"

echo -e "
Results from /dev/$DRIVE, $DRIVEMODEL ($DRIVESIZE):  
\033[0;33m
Sequential Read: $SEQR
Sequential Write: $SEQW
\033[0;32m
512KB Read: $F12KR
512KB Write: $F12KW
\033[1;36m
Sequential Q32T1 Read: $SEQ32R
Sequential Q32T1 Write: $SEQ32W
\033[0;36m
4KB Read: $FKR
4KB Write: $FKW
\033[1;33m
4KB Q32T1 Read: $FK32R
4KB Q32T1 Write: $FK32W
\033[1;35m
4KB Q8T8 Read: $FK8R
4KB Q8T8 Write: $FK8W
"

rm $TARGET/.fiomark.txt $TARGET/.fiomark.tmp

Який дасть такі результати:

Results from /dev/sdb, Corsair Force GT (111GB):  

Sequential Read: 533MB/s IOPS=0
Sequential Write: 125MB/s IOPS=0

512KB Read: 457MB/s IOPS=914
512KB Write: 133MB/s IOPS=267

Sequential Q32T1 Read: 534MB/s IOPS=16
Sequential Q32T1 Write: 134MB/s IOPS=4

4KB Read: 32MB/s IOPS=8224
4KB Write: 150MB/s IOPS=38460

4KB Q32T1 Read: 195MB/s IOPS=49951
4KB Q32T1 Write: 121MB/s IOPS=31148

4KB Q8T8 Read: 129MB/s IOPS=33149
4KB Q8T8 Write: 132MB/s IOPS=33796

(Результати кольорові, щоб видалити кольорове кодування, видаліть усі екземпляри \033[x;xxm(де x - це число) з команди echo в нижній частині сценарію.)

Сценарій при запуску без аргументів перевірить швидкість домашнього диска / розділу. Ви також можете ввести шлях до каталогу на іншому жорсткому диску, якщо ви хочете перевірити це. Під час запуску скрипту створюються приховані тимчасові файли в цільовому каталозі, які він очищає після завершення роботи (.fiomark.tmp та .fiomark.txt)

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

Після деяких досліджень я виявив, що показник кристалічного маркування результатів на тій же моделі приводу, як і я, здається, порівняно тісно відповідає результатам цього показника fio, принаймні на перший погляд. Оскільки у мене немає установки Windows, я не можу перевірити, наскільки вони дійсно близькі на певному диску.

Зауважте, що іноді ви можете отримати трохи результати, особливо якщо ви робите щось у фоновому режимі під час запуску тестів, тому для порівняння результатів доцільно проводити тест двічі поспіль.

Ці випробування потребують тривалого часу для запуску. Налаштування за замовчуванням у сценарії зараз підходять для звичайного SSD-диска (SATA).

Рекомендовані параметри SIZE для різних дисків:

  • (SATA) SSD: 1024 (за замовчуванням)
  • (БУДЬ-ЯК) HDD: 256
  • (High End NVME) SSD: 4096
  • (SSD з низьким середнім кінцем): 1024 (за замовчуванням)

NVME High End має зазвичай близько 2 Гб / с швидкість зчитування (приклади Intel Optane та Samsung 960 EVO - приклади; але в останньому випадку я рекомендував би замість цього 2048 завдяки меншій швидкості 4 кб.) ~ 500-1800 Мб / с швидкості зчитування.

Основна причина, за якою слід відрегулювати ці розміри, полягає в тому, як довго тестування триватимуть в іншому випадку, наприклад, для старих / слабких жорстких дисків, ви можете мати низькі швидкості зчитування 4,4 Мб / с 4 кб. Ви намагаєтесь чекати 5 циклів об’ємом 1 Гб із такою швидкістю, інші тести на 4 Кбіт зазвичай мають швидкість приблизно 1 Мб / с. У нас їх 6. Кожна з 5 циклів, ви чекаєте, коли 30 ГБ даних будуть передані з такою швидкістю? Або ви хочете знизити це на 7,5 Гб даних (на 256 Мб / с - це 2-3 години тесту)

Звичайно, ідеальним методом для вирішення такої ситуації було б запустити послідовні & 512k тести окремо від тестів 4k (тому запустіть послідовні та 512k тести чимось на зразок 512m, а потім виконати тести 4k на 32м)

Більш сучасні HDD-моделі мають більш високий кінець і можуть отримати набагато кращі результати, ніж це.

І там у вас є. Насолоджуйтесь!


Ви перевірили, як ваш сценарій поводиться з fio в Windows?
Anon

1
(Примітка для читачів, окрім цестарійців: якщо ви створюєте новий інструмент, який використовує fio, тоді, якщо це можливо, не скребте читаний людиною вихід фіо - використовуйте --output-format=jsonта аналізуйте JSON. Людський читабельний вихід Fio не призначений для машин і не є стабільним між версіями fio. Перегляньте це відео на YouTube про випадок, коли вискоблювання людської продукції фіо призвело до небажаного результату )
Anon

Дякую, я маю це на увазі, на жаль, у мене більше немає інсталяції Windows, тому я не можу перевірити це ... але я вирішив знайти результати кристалічного знака для мого ssd, і, здається, моя пам'ять була неправильною, оскільки Результати додають до того, що я все-таки потрапляю на фіо. З моєї сторони було непорозуміння, яке змусило мене думати, що результати повільніші: / Я виправлю це. Невдовзі я також оновлю цю відповідь, щоб використовувати вихід json для майбутньої ізоляції, і, можливо, версію GUI (я почав працювати над цим, але gtkdialog погано задокументований, а зенність обмежена, тому мені важко)
Cestarian

1
@Cestarian, чудовий сценарій, але не працює "поза коробкою" на CentOS7. Мені довелося трохи його модифікувати .
Ігор

1
@Igor Цікаво, так, я зробив це на манджаро, і я не дуже досвідчений в галузі баш :) Я відповів на вашу модифіковану версію у відповіді на всякий випадок, якщо у когось іншого є проблеми.
Cestarian

5

Ви можете використовувати iozoneі bonnie. Вони можуть робити те, що може зробити позначка на кришталевому диску та багато іншого.

Я особисто iozoneбагато використовував під час тестування пристроїв із персональних комп'ютерів до корпоративних систем зберігання. У ньому є автоматичний режим, який робить все, але ви можете налаштувати його під свої потреби.


5
Як детально відтворити вимірювання кристалічної позначки?
студент

2
Я спробую зробити все можливе, як написати хауто, але мені потрібен перелік тестів, які проводить марка Crystal Disk Mark. Чи є якісь інші тести, які програмне забезпечення працює поруч з видимими на скріншоті.
bayindirh

1
Тільки ті, які є на скріншоті.
trr

1

Я не впевнений, що різні глибші тести мають будь-який сенс, коли детально розглядаєте, що ви робите.

Параметри, такі як розмір блоку та глибина черги, - це параметри для керування низькорівневими вхідними / вихідними параметрами інтерфейсу ATA, на якому сидить SSD.

Це все добре і добре, коли ви просто виконуєте якийсь базовий тест на накопичувачі досить безпосередньо, як і для великого файлу в простої файлової системи, що розділяється.

Після того, як ви починаєте говорити про тестування enfs, ці параметри більше не застосовуються до вашої файлової системи, файлова система - це лише інтерфейс у щось інше, що врешті-решт повертається у файлову систему, яка спирається на диск.

Думаю, було б корисно зрозуміти, що саме ви намагаєтеся виміряти, оскільки тут грають два фактори - швидкість вводу-виводу дискового диска, яку ви можете перевірити, розмістивши різні команди DD (можна навести приклади, якщо це те, що ви хочу) / без / encfs, або процес буде обмежений процесором шифруванням, і ви намагаєтеся перевірити відносну пропускну здатність алгоритму шифрування. У цьому випадку параметри глибини черги тощо не особливо актуальні.

В обох аспектах команда з тимчасовою DD надасть вам основну статистику пропускної здатності, яку ви шукаєте, але ви повинні врахувати, що ви маєте намір виміряти, і відповідні параметри для цього.

Здається, це посилання дає хороший посібник для тестування швидкості диска з використанням приурочених команд DD, включаючи необхідне висвітлення про «перемогу в буферах / кешах» тощо. Ймовірно, це забезпечить необхідну інформацію. Вирішіть, хто вас більше зацікавить у виконанні тхо, диска чи шифрування, одне з двох буде вузьким місцем, а налаштування негіркого місця не принесе користі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.