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

Вопрос или проблема

Я хочу провести тестирование 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.

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

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

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

@Alko, @iain

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

Я бы сказал, что fio без труда создаст такие рабочие нагрузки. Заметьте, что несмотря на свое название, CrystalDiskMark фактически тестирует файловую систему на конкретном диске – она не может выполнять I/O напрямую на диск. Таким образом, в ней всегда будет присутствовать нагрузка на файловую систему (не обязательно плохо, но стоит учитывать, например, потому что сравниваемые файловые системы могут отличаться).

Пример, основанный на воспроизведении вывода на скриншоте выше, дополненного информацией из руководства 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.

Редактировать 2025: Сейчас существует открытое программное обеспечение, имитирующее crystaldiskmark, под названием kdiskmark, которое можно использовать. Оно работает аналогично моему скрипту, но имеет графический интерфейс. Обратите внимание, что так как fio не является crystaldiskmark, результаты не будут идентичны crystaldiskmark, лучший способ сравнить тесты Windows и Linux – использовать fio для выполнения тех же тестов на обоих операционных системах.

Оригинальный ответ: https://unix.stackexchange.com/revisions/480191/12

Я создал скрипт, который пытается повторить поведение crystaldiskmark 6 с помощью fio, также я добавил поддержку для более старых тестов (например, тестов 512kb). Этот ответ обновлен сейчас, задолго после того, как я изначально его создал, в скрипте есть много необходимых улучшений. Для тех, кто использовал более ранние версии, включен журнал изменений.

Скрипт зависит от fio и df. Если у вас нет или вы не хотите устанавливать df, скрипт все равно должен работать. Скрипт совместим с dash (если вы хотите использовать dash, измените #!/bin/bash на #!/bin/dash), но обратите внимание, что с dash нет поддержки автозаполнения с помощью команды read (поэтому вам придется вводить путь, куда вы хотите протестировать, буква за буквой, если используете dash).

Это полный скрипт:

#!/bin/bash
#############################################################################################################
#Changelog                                                                                                  #
#############################################################################################################
#Добавлены приглашения для ввода пользователем данных для настройки скрипта вместо использования жестко закодированных настроек.
#Добавлено много проверки на ошибки
#Скрипт теперь опционально совместим с dash (именно поэтому в конце каждого echo -e стоит команда sed, dash любил выводить часть -e, когда я тестировал.)
#Значительно улучена совместимость между дистрибутивами
#Особая благодарность всем, кто внес свой вклад здесь: https://gist.github.com/i3v/99f8ef6c757a5b8e9046b8a47f3a9d5b
#Также особая благодарность BAGELreflex на github за это: https://gist.github.com/BAGELreflex/c04e7a25d64e989cbd9376a9134b8f6d это значительно повлияло на улучшение версии.
#Добавлены оптимизации для тестов 512к и 4к (теперь они используют QSIZE вместо SIZE, это делает эти тесты намного быстрее и не сильно влияет на точность, при условии, что SIZE настроен на ваш диск.)
#Добавлена опция не использовать устаревшие тесты (512k и Q1T1 Seq R/W тесты) для экономии времени при тестировании.
#Убедился, что скрипт может запускаться нормально даже без установки df. Некоторая информация может отсутствовать, но в худшем случае просто будет выглядеть неаккуратно.
#Добавлена опция сохранения результатов, которая имитирует сохраненные результаты из crystaldiskmark; форматирование немного странное, но оно работает. Отлично для сравнения результатов между операционными системами.
#Перенастроены результаты, чтобы использовать Мегабайты вместо MebiBytes (это то, что использует crystaldiskmark, так что результаты должны теперь быть немного ближе).
#Результаты последовательного чтения/записи (512к, q1t1 seq и q32t1 seq) теперь появятся, как только они будут завершены, и их можно будет просмотреть, пока выполняются тесты 4k.
#Примечание: опция устаревших тестов по умолчанию стоит "нет", если ничего не выбрано, сохранение результатов по умолчанию - "да". Легко изменить, если это не нравится.
#Наблюдение: при тестировании я заметил, что результаты чтения в основном согласуются с результатами crystaldiskmark на Windows, однако что-то не так с результатами записи.
#Извините за неаккуратный код :)
#############################################################################################################
#Запросы ввода пользователя и проверка ошибок                                                               #
*************************************************************************************************************
if [ -f /usr/bin/fio ]; then #Проверка зависимости
    :
else
    echo -e "\033[1;31mОшибка: Этот скрипт требует установки fio, пожалуйста, убедитесь, что он установлен." | sed 's:-e::g'
    exit
fi

if [ -f /usr/bin/df ]; then #Проверка зависимости
    nodf=0
else
    nodf=1
    echo -e "\033[1;31mПредупреждение: df не установлен, этот скрипт использует df для отображения определенной информации, часть информации может отсутствовать." | sed 's:-e::g'
fi

if [ "$(ps -ocmd= | tail -1)" = "bash" ]; then
    echo "Какой диск вы хотите протестировать? (По умолчанию: $HOME на /dev/$(df $HOME | grep /dev | cut -d/ -f3 | cut -d' ' -f1) )"
    echo -e "\033[0;33mТолько пути к директориям (например, /home/user/) допустимы в качестве целей.\033[0;00m"
    read -e TARGET
else # для dash автозаполнения нет.
    echo "Какой диск вы хотите протестировать? (По умолчанию: $HOME на /dev/$(df $HOME | grep /dev | cut -d/ -f3 | cut -d' ' -f1) )"
    echo -e "\033[0;33mТолько пути к директориям (например, /home/user/) допустимы в качестве целей. Используйте bash, если вы хотите автозаполнение.\033[0;00m" | sed 's:-e::g'
    read TARGET
fi

echo "
Сколько раз выполнить тест? (По умолчанию: 5)"
read LOOPS

echo "Какой объем должен быть у каждого теста в Миб? (По умолчанию: 1024)"
echo -e "\033[0;33mПринимаются только кратные 32!\033[0;00m" | sed 's:-e::g'

read SIZE

echo "Хотите ли вы записывать только нули в ваши тестовые файлы, чтобы имитировать тесты dd? (По умолчанию: 0)"
echo -e "\033[0;33mВключение этой настройки может значительно изменить ваши результаты, не рекомендуется, если вы не знаете, что делаете.\033[0;00м" | sed 's:-e::g'
read WRITEZERO

echo "Хотите ли вы включить устаревшие тесты (512kb и Q1T1 Последовательное чтение/запись)? [Y/N]"
read LEGACY

if [ -z $TARGET ]; then
    TARGET=$HOME
elif [ -d $TARGET ]; then
    :
else
    echo -e "\033[1;31mОшибка: $TARGET не является допустимым путем."
    exit
fi

if [ -z $LOOPS ]; then
    LOOPS=5
elif [ "$LOOPS" -eq "$LOOPS" ] 2>/dev/null; then
    :
else
  echo -e "\033[1;31mОшибка: $LOOPS не является допустимым числом, используйте число, чтобы указать, сколько раз повторять тесты." | sed 's:-e::g'
  exit
fi

if [ -z $SIZE ]; then
    SIZE=1024
elif [ "$SIZE" -eq "$SIZE" ] 2>/dev/null && ! (( $SIZE % 32 )) 2>/dev/null;then
    :
else
    echo -e "\033[1;31mОшибка: Размер теста должен быть целым числом, кратным 32. Пожалуйста, используйте кратное 32 значение для настройки размера (Оптимальные настройки: 1024, 2048, 4096, 8192, 16384)."
    exit
fi

...

rm "$TARGET/.fiomark.txt" "$TARGET/.fiomark-512k.txt" "$TARGET/.fiomark-4k.txt" 2>/dev/null
rm "$TARGET/.fiomark.tmp" "$TARGET/.fiomark-512k.tmp" "$TARGET/.fiomark-4k.tmp" 2>/dev/null

Это выведет результаты такого формата:

Запуск теста на: /dev/nvme0n1, KINGSTON RBUSNS8154P3256GJ (238GB), пожалуйста, подождите...

Результаты:

Последовательное чтение: 1337MB/s [   5 IOPS]
Последовательная запись: 266MB/s [   1 IOPS]

512KB Чтение: 512MB/s [   1000 IOPS]
512KB Запись: 273MB/s [   533 IOPS]

Последовательное Q32T1 Чтение: 1394MB/s [   170 IOPS]
Последовательная Q32T1 Запись: 265MB/s [   32 IOPS]

4KB Q8T8 Чтение: 487MB/s [   121835 IOPS]
4KB Q8T8 Запись: 284MB/s [   71085 IOPS]

4KB Q32T1 Чтение: 390MB/s [   97523 IOPS]
4KB Q32T1 Запись: 315MB/s [   78769 IOPS]

4KB Чтение: 28MB/s [   7135 IOPS]
4KB Запись: 126MB/s [   31507 IOPS]

Хотите ли вы сохранить эти результаты? [Y/N]

(Результаты отмечены цветом при выполнении в терминале.)

Если вы выберете сохранить результаты, оно выведет имитацию того же файла сохранения, который создает crystaldiskmark, когда вы сохраняете его результаты.

Вот изображение, сравнивающее эти файлы с 3 тестами того же диска, 1 с crystaldiskmark и 2 со скриптом:
Сравнительное изображение тестирования

Когда вы запускаете скрипт, он попросит вас настроить его (опции включают: Каталог назначения, Петли, Размер, Запись нулей и Устаревшие тесты), каждая настройка имеет значение по умолчанию, если вы ничего не вводите. Чтобы протестировать конкретный жесткий диск, вам нужно сначала смонтировать его, а затем ввести полный путь к каталогу на этом жестком диске в запросе о том, какой диск вы хотите протестировать. Пока скрипт запущен, он создает скрытые временные файлы в каталоге назначения, которые он удаляет после завершения работы. Даже если вы отмените процесс, когда он будет запущен с помощью CTRL+C, он все равно должен удалить файлы.

Результаты теста отображаются в два этапа, Последовательный и 4КБ, сначала выполняются тесты последовательного чтения/записи, затем когда они завершены, они отображаются, пока выполняются тесты 4КБ. Если вы отмените процесс до завершения тестов, любые частичные результаты будут отображены при выходе.

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

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

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

  • (SATA) SSD: 1024(по умолчанию)
  • (ЛЮБОЙ) HDD: 256
  • (High End NVME) SSD: 4096
  • (Низко-Средний M.2/NVME) SSD: 2048

Высококлассный NVME обычно имеет примерно ~2GB/s скорости чтения (Intel Optane и Samsung 960 EVO – примеры; но в последнем случае я бы рекомендовал 2048 из-за более медленной скорости 4K), Низко-средний может иметь от ~500-1800MB/s скорости чтения.

В новой версии скрипта тесты 4KB и 512KB будут значительно быстрее, так как они больше не используют фактический полный размер, который задает пользователь. (Crystaldiskmark также скупится на размер для тестов 4KB, иначе они бы всегда занимали вечность).

Известные проблемы:

  • В пути, используемом для выбора диска для тестирования, не может быть пробелов.
  • Эти ntfs-3g тесты выглядят довольно подозрительно, если вы спросите меня.

И вот, собственно, всё. Наслаждайтесь!

Попробуйте KDiskMark, очень похожую на CrystalDiskmark.

Приложение написано на C++ с использованием Qt и не имеет зависимостей от KDE.

Скриншот KDiskMark

Использование

Для начала, после выбора папки (и, возможно, других параметров), нажмите All.

Установка

Flathub

flatpak install flathub io.github.jonmagon.kdiskmark

Ubuntu PPA

sudo add-apt-repository ppa:jonmagon/kdiskmark
sudo apt update
sudo apt install kdiskmark

Базирующиеся на Arch дистрибутивы

KDiskMark включен в официальный community репозиторий. Вы можете установить его, как любой другой пакет:

sudo pacman -Syu kdiskmark

Разработческую версию можно установить из AUR пакета kdiskmark-git.

git clone https://aur.archlinux.org/kdiskmark-git.git
cd kdiskmark-git
makepkg -si

Fedora

KDiskMark включен в официальный репозиторий Fedora. Вы можете установить его, как любой другой пакет:

sudo dnf install kdiskmark

openSUSE Tumbleweed

sudo zypper install kdiskmark

Вы можете использовать iozone и bonnie. Они могут выполнять то, что делает crystal disk mark, и даже больше.

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

Попробуйте NetCoreStorageSpeedTest.

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

Консольное приложение (Linux, Windows и MacOS – .NET Core 3) и кроссплатформенная библиотека классов (C#, .NET Standard 2) для измерения скоростей чтения/записи дисков/устройств хранения.

Проект также поддерживает Android, как указано на странице проекта GitHub.

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

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

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

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

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

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

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

.

Ответ или решение

Для проведения тестирования производительности SSD на Linux, аналогичного CrystalDiskMark на Windows, необходимо использовать утилиту fio. CrystalDiskMark измеряет производительность дисков в разных режимах (последовательное чтение и запись, случайное чтение и запись с различными размерами блока и глубинами очереди), и fio предоставляет широкие возможности для настройки подобного профиля нагрузок.

Теория

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

Пример

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

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

Этот набор параметров охватывает основные виды тестов, проводимых CrystalDiskMark, включая последовательное и случайное чтение/запись с использованием блоков различных размеров. Утилита fio позволяет гибко настроить параметры тестирования, что позволяет учесть специализированные требования, такие как использование зашифрованных файловых систем.

Применение

Для начала тестирования установите fio, если он еще не установлен:

sudo apt install fio  # для дистрибутивов на базе Debian/Ubuntu
sudo dnf install fio  # для Fedora
sudo pacman -S fio    # для Arch Linux

Команда выше создаст набор временных файлов в указанной директории /mnt/fs, чтобы прочитать и записать данные в соответствии с заданными параметрами. Не забудьте удалить временные файлы после завершения теста.

Также стоит рассмотреть альтернативные инструменты, такие как KDiskMark и Iozone, которые предоставляют GUI и автонастройку, что может быть более удобным для пользователей без глубоких знаний командной строки. Они также доступны в репозиториях многих дистрибутивов Linux.

Заключение
fio предоставляет мощный и гибкий способ тестирования производительности накопителей на Linux, аналогично CrystalDiskMark на Windows. Благодаря возможности настройки и использования различных профилей нагрузки, fio идеально подходит для бенчмаркинга как обычных, так и зашифрованных файловых систем, что делает его универсальным инструментом для IT-специалистов.

Оцените материал
Добавить комментарий

Капча загружается...