Утилита проверки скорости дисков в Linux (как в CrystalDiskMark)
Добавлено: 17 сен 2022, 00:28
Вспомнив сегодня старый пост на тему возможности проверки скорости всяких разных дисков - на коленке при помощи bash родилась утилитка которая собирает данные с
В качестве дефолтных значений писать будем в файл
В итоге получилось вот что:
В результате выполнения, по мере прогона тестов будет отрисовывать замеры в следующем виде
для запуска потребуется только наличие в системе пакета
Тестовый файл (fiotest.tmp) скрипт за собой не удаляет, т.к. не очень охота вписывать
fio
и воспроизводит результаты по аналогии с виндовой софтиной CrystalDiskMark
Собственно задача состояла в том чтобы вывести результаты тестов однопоточного чтения и записи в следующих режимах:
- Последовательные c размером блока в 1мб и глубиной очереди 8
- Последовательные c размером блока в 1мб и глубиной очереди 1
- Случайные c размером блока в 4кб и глубиной очереди 32
- Случайные c размером блока в 4кб и глубиной очереди 1
В качестве дефолтных значений писать будем в файл
./fiotest.tmp
в той же директории откуда был вызван скрипт, с размером 1000мб и 5 проходов (типа как в оригинале)В итоге получилось вот что:
Код: Выделить всё
#!/bin/bash
TESTFILE_PATH='./fiotest.tmp'
TESTFILE_SIZE='1000m'
TEST_LOOPS='5'
sync; sleep 3;
SEQ1MQ8T1R=$(fio --loops=$TEST_LOOPS --size=$TESTFILE_SIZE --filename=$TESTFILE_PATH --ioengine=libaio --direct=1 --name=SeqReadQ8 --bs=1m --iodepth=8 --rw=read | grep 'READ:' | awk '{print substr($3, 2, length($3)-3)}')
sync; sleep 3;
SEQ1MQ8T1W=$(fio --loops=$TEST_LOOPS --size=$TESTFILE_SIZE --filename=$TESTFILE_PATH --ioengine=libaio --direct=1 --name=SeqWriteQ8 --bs=1m --iodepth=8 --rw=write | grep 'WRITE:' | awk '{print substr($3, 2, length($3)-3)}')
echo " +----------------------------------------+"
printf " | %12s | %10s | %10s |\n" "Mode" "Read" "Write"
echo " +----------------------------------------+"
printf " | %12s | %10s | %10s |\n" "SEQ1MQ8T1" "$SEQ1MQ8T1R" "$SEQ1MQ8T1W"
echo " +----------------------------------------+"
sync; sleep 3;
SEQ1MQ1T1R=$(fio --loops=$TEST_LOOPS --size=$TESTFILE_SIZE --filename=$TESTFILE_PATH --ioengine=libaio --direct=1 --name=SeqReadQ1 --bs=1m --iodepth=1 --rw=read | grep 'READ:' | awk '{print substr($3, 2, length($3)-3)}')
sync; sleep 3;
SEQ1MQ1T1W=$(fio --loops=$TEST_LOOPS --size=$TESTFILE_SIZE --filename=$TESTFILE_PATH --ioengine=libaio --direct=1 --name=SeqWriteQ1 --bs=1m --iodepth=1 --rw=write | grep 'WRITE:' | awk '{print substr($3, 2, length($3)-3)}')
printf " | %12s | %10s | %10s |\n" "SEQ1MQ1T1" "$SEQ1MQ1T1R" "$SEQ1MQ1T1W"
echo " +----------------------------------------+"
sync; sleep 3;
RND4KQ32T1R=$(fio --loops=$TEST_LOOPS --size=$TESTFILE_SIZE --filename=$TESTFILE_PATH --ioengine=libaio --direct=1 --name=RandReadQ32 --bs=4k --iodepth=32 --rw=randread | grep 'READ:'| awk '{print substr($3, 2, length($3)-3)}')
sync; sleep 3;
RND4KQ32T1W=$(fio --loops=$TEST_LOOPS --size=$TESTFILE_SIZE --filename=$TESTFILE_PATH --ioengine=libaio --direct=1 --name=RandWriteQ32 --bs=4k --iodepth=32 --rw=randwrite | grep 'WRITE:'| awk '{print substr($3, 2, length($3)-3)}')
printf " | %12s | %10s | %10s |\n" "RND4KQ32T1" "$RND4KQ32T1R" "$RND4KQ32T1W"
echo " +----------------------------------------+"
sync; sleep 3;
RND4KQ1T1R=$(fio --loops=$TEST_LOOPS --size=$TESTFILE_SIZE --filename=$TESTFILE_PATH --ioengine=libaio --direct=1 --name=RandReadQ1 --bs=4k --iodepth=1 --rw=randread | grep 'READ:'| awk '{print substr($3, 2, length($3)-3)}')
sync; sleep 3;
RND4KQ1T1W=$(fio --loops=$TEST_LOOPS --size=$TESTFILE_SIZE --filename=$TESTFILE_PATH --ioengine=libaio --direct=1 --name=RandWriteQ1 --bs=4k --iodepth=1 --rw=randwrite | grep 'WRITE:'| awk '{print substr($3, 2, length($3)-3)}')
printf " | %12s | %10s | %10s |\n" "RND4KQ1T1" "$RND4KQ1T1R" "$RND4KQ1T1W"
echo " +----------------------------------------+"
fio
, если нет - то apt install fio
. (Впрочем аналогично и в других дистрибутивах мимо deb)Тестовый файл (fiotest.tmp) скрипт за собой не удаляет, т.к. не очень охота вписывать
rm -f
в тело. Грохните по финалу его самостоятельно