Страницы

Поиск по вопросам

пятница, 13 декабря 2019 г.

Как протестировать скорость чтения/записи блочного устройства

#linux #shell


Всё что до сих пор видел по этой теме - hdparm -tT и dd с кучей не совсем понятных
параметров. 

Что хотелось бы видеть: зависимость скоростей чтения и записи от размера блока и
его позиции. Разумеется программа должна работать из командной строки без графической
среды.
    


Ответы

Ответ 1



iops - как раз то, что вы просите. Выдает таблицу БЛОК | СКОРОСТЬ /dev/md0, 12.00 TB, 32 threads: 512 B blocks: 466.5 IO/s, 233.3 KiB/s ( 1.9 Mbit/s) 1 KiB blocks: 453.2 IO/s, 453.2 KiB/s ( 3.7 Mbit/s) 2 KiB blocks: 445.0 IO/s, 890.1 KiB/s ( 7.3 Mbit/s) 4 KiB blocks: 465.0 IO/s, 1.8 MiB/s ( 15.2 Mbit/s) 8 KiB blocks: 441.4 IO/s, 3.4 MiB/s ( 28.9 Mbit/s) 16 KiB blocks: 444.9 IO/s, 7.0 MiB/s ( 58.3 Mbit/s) 32 KiB blocks: 433.9 IO/s, 13.6 MiB/s (113.7 Mbit/s) 64 KiB blocks: 444.8 IO/s, 27.8 MiB/s (233.2 Mbit/s) 128 KiB blocks: 465.3 IO/s, 58.2 MiB/s (487.9 Mbit/s) 256 KiB blocks: 409.0 IO/s, 102.3 MiB/s (857.8 Mbit/s) 512 KiB blocks: 212.4 IO/s, 106.2 MiB/s (890.8 Mbit/s) 1 MiB blocks: 142.3 IO/s, 142.3 MiB/s ( 1.2 Gbit/s) 2 MiB blocks: 67.1 IO/s, 134.2 MiB/s ( 1.1 Gbit/s) 4 MiB blocks: 40.9 IO/s, 163.7 MiB/s ( 1.4 Gbit/s) 8 MiB blocks: 21.5 IO/s, 171.6 MiB/s ( 1.4 Gbit/s)

Ответ 2



Команда dd позволяет замерить скорость последовательного чтения/записи. Для чтения более достоверный результат даёт прямое чтение без участия системного кэша в режиме iflag=direct: # dd if=/dev/sdb of=/dev/null bs=16M count=8 iflag=direct 8+0 записей получено 8+0 записей отправлено скопировано 134217728 байт (134 MB), 6,17806 c, 21,7 MB/c Для точности измерений при записи важно дождаться её окончания а не помещения вывода в кэш. Лучший результат даёт режим conv=fdatasync. Режим oflag=direct обычно даёт результат хуже и он дальше от возможного реального использования. ВНИМАНИЕ! Нижеприведённая команда приведёт к потере данных на устройстве /dev/sdb # dd if=/dev/zero of=/dev/sdb bs=16M count=8 conv=fdatasync 8+0 записей получено 8+0 записей отправлено скопировано 134217728 байт (134 MB), 11,7765 c, 11,4 MB/c Некоторые диски могут работать медленнее со случайными данными чем с нулями. Использовать /dev/urandom и тем более /dev/random напрямую вместо /dev/zero нельзя, так как они требуют много вычислений и тормозят процесс. Поэтому нужно сначала подготовить файл с данными (лучше на tmpfs). # dd if=/dev/urandom of=/dev/shm/random bs=16M count=8 8+0 записей получено 8+0 записей отправлено скопировано 134217728 байт (134 MB), 15,2181 c, 8,8 MB/c Как видите, если бы мы напрямую копировали /dev/urandom в /dev/sdb, мы бы получили скорость вычислений псевдослучайных чисел, а не скорость записи. Теперь проверяем с заготовленными данными. ВНИМАНИЕ! Нижеприведённая команда приведёт к потере данных на устройстве /dev/sdb # dd if=/dev/shm/random of=/dev/sdb bs=16M count=8 conv=fdatasync 8+0 записей получено 8+0 записей отправлено скопировано 134217728 байт (134 MB), 11,7722 c, 11,4 MB/c # rm /dev/shm/random Получил тот же результат. Значит скорость моего устройства не зависит от данных. Команда fio делает много разных вариантов тестов, но результаты выводятся в не очень удобном формате, хотя там очень много разных подробностей. Для получения зависимости скорости от размера блока написал следующий скрипт (diskspeed.sh), надеюсь он будет полезен: #!/bin/bash bs="512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576 2097152 4194304" testtype=randread iodepth=100 iolimit=40M timelimit=5 test=true for i in "$@" ; do case $i in bs=*|testtype=*|iodepth=*|iolimit=*|timelimit=*|dev=*) eval "$i" ;; notest|test=no|test=false) test=false esac done if [ -z "$dev" ] ; then echo "Usage: $0 dev=/dev/sd... [{bs,testtype,iodepth,iolimit,timelimit,test}=...]" exit 0 fi [ -z "$dir" ] && dir="${dev##*/}-$testtype" mkdir -p "$dir" cd $dir $test && for i in $bs ; do fio --output=$i - <&2 done egrep '^ *(READ|WRITE) *:' $bs | sort -n | sed -r 's/([0-9]+):.*aggrb=([0-9]+).*/\1 \2/' Примеры запуска скрипта с sd-картой Случайное чтение # ./diskspeed.sh dev=/dev/sdb 512 187 1024 432 2048 937 4096 1706 8192 3281 16384 5901 32768 8128 65536 9239 131072 10149 262144 11445 524288 11606 1048576 12239 2097152 16516 4194304 16355 Линейное чтение с пропусками по 4Мб: # ./diskspeed.sh dev=/dev/sdb testtype=read:4M 512 205 1024 451 2048 912 4096 1816 8192 3217 16384 5859 32768 7921 65536 9677 131072 13008 262144 14916 524288 16175 1048576 16668 2097152 17544 4194304 18123 Данные сохраняются в каталоге имя_устройства-метод_чтения, и их можно профильтровать как-нибудь ещё. PS. С записью что-то мне результаты не очень нравятся: сильно меняются при повторном запуске и намного меньше, чем dd conv=fdatasync даже с большими блоками.

Комментариев нет:

Отправить комментарий