Бенчмарк SSD на Linux: как измерить то же самое, что CrystalDiskMark в Windows

26

Я хочу сравнить ssd (возможно, с зашифрованными файловыми системами) и сравнить его с тестами, выполненными crystaldiskmark в windows.

CrystalDiskMark для Windows

Итак, как я могу измерить примерно то же самое, что и crystaldiskmark?

Для первого ряда (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параметров.

Для произвольных 512КБ, 4КБ, 4КБ (Глубина очереди = 32) скоростных тестов чтения / записи, я не знаю, как воспроизвести измерения в Linux? Так как я могу это сделать?

Для тестирования скоростей чтения что-то подобное sudo hdparm -Tt /dev/sdaне имеет смысла для меня, так как я хочу, например, тестировать что-то вроде encfsмонтирования.

редактировать

@Alko, @iain

Возможно, мне следует написать кое-что о мотивации этого вопроса: я пытаюсь сравнить мой ssd и сравнить некоторые решения для шифрования. Но это другой вопрос ( Лучший способ сравнить различные решения для шифрования в моей системе ). Во время серфинга в Интернете о ssd и бенчмаркингах я часто видел, как пользователи публикуют свои результаты CrystelDiskMark на форумах. Так что это единственная мотивация для вопроса. Я просто хочу сделать то же самое на Linux. Для моего конкретного теста см. Мой другой вопрос.

ученик
источник
Почему бы вам не использовать инструмент сравнения, который работает на обеих системах?
Алко
Нашел это, кажется очень полезным и в моем кратком тестировании на трех отдельных дисках дал очень похожие цифры для фактической метки crystaldisk ... github.com/buty4649/fio-cdm
ljwobker
2019: этот вопрос заслуживает нового старта - важная тема, но здесь он немного потерял свое внимание. «Принять и архив».
растафиле

Ответы:

22

Я бы сказал, что у fio не будет проблем с производством этих нагрузок. Обратите внимание, что, несмотря на свое название, 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. Некоторые цифры совпадают, а другие нет. Последовательное ч / б было отключено в 2 раза. Это означает, что значения для Linux составляли 50% от значений, сообщенных CDM v3.0.4 (примечание: текущая версия - 6.0.0, но старые версии все еще доступны для загрузки). Чтобы возиться с неравенством, я установил bs = 4 м вместо 1 м. Это сделало цифры ближе. Попытка 8м и 32м сделала это еще ближе. В конечном счете, как сказал Анон, его ответ неполон, и, как и @Alko, нам нужен один и тот же инструмент для обеих ОС. Также обратите внимание, что в новейшем CDM 6 используются тесты, отличные от OP. Хорошая информация Anon
Vahid Pazirandeh
2
@VahidPazirandeh Интересно, github.com/buty4649/fio-cdm/blob/master/fio-cdm имеет те же настройки 1 м, возможно, документация по cdm недостаточно хороша.
inf3rno
@ vahid-pazirandeh Не за что. Примечание: если вам нужен один и тот же инструмент в обеих ОС, обратите внимание, что есть версия fio для Windows.
Anon
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)

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

После некоторых исследований я обнаружил, что результаты теста CrystalDiskmark для той же модели диска, что и у меня, по-видимому, относительно близко соответствуют результатам этого теста FIO, по крайней мере, с первого взгляда. Поскольку у меня нет установки Windows, я не могу проверить, насколько точно они действительно находятся на одном диске.

Обратите внимание, что иногда вы можете слегка отклониться от результатов, особенно если вы выполняете какие-либо действия в фоновом режиме во время выполнения тестов, поэтому рекомендуется проводить тест два раза подряд для сравнения результатов.

Эти тесты занимают много времени. Настройки по умолчанию в скрипте в настоящее время подходят для обычного (SATA) SSD.

Рекомендуемая настройка размера для разных дисков:

  • (SATA) SSD: 1024 (по умолчанию)
  • (ЛЮБОЙ) HDD: 256
  • (High End NVME) SSD: 4096
  • (Low-Mid End NVME) SSD: 1024 (по умолчанию)

High End NVME обычно имеет скорость чтения ~ 2 ГБ / с (Intel Optane и Samsung 960 EVO являются примерами; но в последнем случае я бы рекомендовал 2048 вместо этого из-за более медленных скоростей 4 КБ.), Low-Mid End может иметь где-то между Скорость чтения ~ 500-1800МБ / с.

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

Конечно, идеальный метод для решения этой ситуации - запуск последовательных тестов и тестов по 512 Кб отдельно от тестов по 4 Кб (поэтому выполните последовательные тесты и тесты по 512 Кб с чем-то вроде, скажем, 512 м, а затем выполните тесты по 4 Кб на 32 м)

Более поздние модели жестких дисков более высокого класса и могут получить гораздо лучшие результаты, чем это.

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

Cestarian
источник
Вы проверили, как ваш скрипт ведет себя с fio в Windows?
Anon
1
(Примечание для читателей, кроме Cestarian: если вы создаете новый инструмент, использующий fio, тогда, если это вообще возможно, не --output-format=jsonанализируйте вывод fio, читаемый человеком, - используйте и анализируйте JSON. Вывод Fio, читаемый человеком, не предназначен для машин и он не стабилен между версиями fio. Смотрите это видео на YouTube о том, как проверка результатов работы fio привела к нежелательному результату )
Anon
Спасибо, я буду иметь это в виду, к сожалению, у меня больше нет установки Windows, поэтому я не могу это проверить ... но я решил посмотреть результаты CrystalDiskmark для моего SSD, и кажется, что моя память была неправильной, так как результаты складываются в конце концов в то, что я получаю на fio. Это было недоразумение с моей стороны, которое заставило меня думать, что результаты были медленнее: / Я исправлю это. В скором времени я также обновлю этот ответ, чтобы использовать вывод json для защиты будущего и, возможно, версию с графическим интерфейсом (я начал над ней работать, но gtkdialog плохо документирован, а zenity ограничен, поэтому мне сложно)
Cestarian
1
@Cestarian, отличный скрипт, но не работает "из коробки" на CentOS7. Мне пришлось немного его изменить .
Игорь
1
@Igor Интересно, да, я сделал это на Манджаро, и я не очень разбираюсь в bash :) Я упомянул твою модифицированную версию в ответе на случай, если у кого-то еще возникнут проблемы.
Cestarian
5

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

Я лично iozoneмного использовал при тестировании и стресс-тестировании устройств от персональных компьютеров до корпоративных систем хранения. Он имеет автоматический режим, который делает все, но вы можете настроить его под свои нужды.

bayindirh
источник
5
Как воспроизвести с этим измерения Crystalmark в деталях?
ученик
2
Я сделаю все возможное, чтобы написать инструкцию, но мне нужен список тестов, которые проводит Crystal Disk Mark. Существуют ли другие тесты, которые запускает программа, кроме тех, которые видны на скриншоте.
Bayindirh
1
Только те, что на скриншоте.
trr
1

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

Такие параметры, как размер блока и глубина очереди, являются параметрами для управления низкоуровневыми параметрами ввода / вывода интерфейса ATA, на котором находится SSD.

Это все хорошо, когда вы просто выполняете какой-то базовый тест на жестком диске, например, в большом файле в простой многораздельной файловой системе.

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

Я думаю, что было бы полезно понять, что именно вы пытаетесь измерить, потому что здесь есть два фактора - скорость ввода-вывода на сыром диске, которую вы можете проверить, синхронизируя различные команды DD (приведите примеры, если это то, что вы хотите) / без / encfs, иначе процесс будет ограничен ЦП шифрованием, а вы пытаетесь проверить относительную пропускную способность алгоритма шифрования. В этом случае параметры для глубины очереди и т. Д. Не особенно актуальны.

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

Эта ссылка, по-видимому, является хорошим руководством по тестированию скорости диска с использованием синхронизированных DD-команд, включая необходимый охват «победы над буферами / кешем» и так далее. Скорее всего, это предоставит вам необходимую информацию. Решите, что вас больше интересует, производительность диска или производительность шифрования, одно из двух будет узким местом, и настройка без узкого места ничего не даст.

Iain
источник