LINUX.ORG.RU
ФорумAdmin

Как оценить скорость параллельного чтения файлов?


0

0
Задача: нужно оценить среднюю скорость параллельного чтения n числа файлов. Какие есть в Линуксе для этого средства? Нашёл море benchmark'ов, но они все навороченные и не дают то, что мне нужно.

Могу написать такой тест на bash'e, но боюсь накладные расходы на запуск n (мне интересен n до 1024) копий cp будут слишком большие.

На C в multithreading я не силён, может кто накатает программу?

measure_parallel_file_reading

Параметры запуска

arg1 - путь куда пишем файлы (/tmp/test)

arg2 - размер файлов в байтах

arg3 - параллелизм

Программа создаёт все файлы (по очереди), sync, sleep 3 секунды, создаём arg3 потоков, в каждом засекаем время, читаем файл, после завершения последнего thread'a выдаём результат:

min скорость чтения файла, max, average в MB/sec

★★★★★
как ты собираешься читать паралельно файлы с одного винчестера?
vilfred ☆☆
()
А смысл?

Размер файлов? Все файлы разные? Упрется в IO диска или еще хуже в seek, время позиционирования головки диска.

sdio ★★★★★
()
Ответ на: комментарий от sdio
Как я уже сказал, размер файлов задаётся, все файлы одинакового размера.

> Упрется в IO диска или еще хуже в seek, время позиционирования головки диска.

Я это знаю, мне просто _нужно_ измерить скорость - давайте не будем теоретизировать? Файлы могут лежать на RAID0 или на NAS'e.

birdie ★★★★★
() автор топика
Ответ на: комментарий от sdio
Перфекционист не думает, что 

function read()
{
    echo `time cat "$1" > /dev/null 2>&1 | grep real` ... 
    о потом ещё выдирать время из вывода time
}

... будет быстро работать

Я тут 100 копий grep'a запускал - это просто жуть сколько времени уходит.
birdie ★★★★★
() автор топика
Ответ на: комментарий от birdie
> echo `time cat "$1" > /dev/null 2>&1 | grep real` ...

Если ты всегда так пишешь, то у тебя проблемы с ...
sdio ★★★★★
()
Ответ на: комментарий от birdie
$ cat read1.sh
#! /bin/sh
#
kill -STOP $$
time cat $1 > /dev/null
exit
----------------------------
$ cat run_test.sh

#! /bin/sh
#
# $1 -- кол-во файлов (процессов)
# $2 -- размер
#
for num in `seq 1 $1`; do
   create_file -имя file.$num -размер $2
   ./read1.sh file.$num &
done

sync
sleep 3
killall -CONT read1.sh
exit
---------------------------------
Запуск:
$ ./run_test 1000 10000000 2>results.txt
$ Теперь спокойно обрабатываем results.txt
sdio ★★★★★
()
Ответ на: комментарий от sdio
Не очень хорошая идея (куча копий bash'a запускается, и в каждой ещё cat), опробую. Но на C всё равно лучше!

birdie ★★★★★
() автор топика
Не вникал в суть, но по логике нужно создать до фига файлов, запустить до хера читающих их (в /dev/null) процессов "dd", сразу после старта посылая им SIGSTOP, а потом всем скопом отдать SIGCONT, подождать и выдать SIGQUIT, dd к примеру сам скажет сколько и на какой скорость прочитал - суммируй и всё путём.
Gharik
()
Ответ на: комментарий от Gharik
> сразу после старта посылая им SIGSTOP

Не представляю это себе возможным. Придётся писать программу а-ля

start -signal SIGSTOP dd arguments

Посылка SIGCONT тысячам, к примеру, процессам dd сигнала SIGCONT тоже не мгновенно произойдёт.

Короче, народ, кто тут умеет программировать на C?

birdie ★★★★★
() автор топика
Ответ на: комментарий от birdie
А вообще, в bonnie++ есть хороший параметр "-c", что значит "concurrency".

Ещё есть перловый tiobench - там число потоков, размеры файла и блока на поток (короче дохера всего) задаются явно, разве что крестиком вышивать не умеет.

Gharik
()
Ответ на: комментарий от Gharik
Про перл прогнал, на нём только морда, реальную работу делает сишний бинарь.
Gharik
()
Ответ на: комментарий от Gharik
bonnie не позволяет сделать то, что я хочу, и не выводит нужной мне информации.

tiobench работает с файлами случайного размера.

birdie ★★★★★
() автор топика
Ответ на: комментарий от birdie
>tiobench работает с файлами случайного размера.

А что написано в man tiobench ?

--size SizeInMB
    The total size in MBytes of the files may use together. If this
    option  is not given, tiobench tries to be smart and figure out
    a size making sense.

sdio ★★★★★
()
Ответ на: комментарий от birdie
Насчёт tiobench'a я был неправ - он вообще не работает:

tiobench.pl --dir /tmp --threads 64 --block 10485760 --nofrag --size 640
Run #1: ./tiotest -t 64 -f 10 -r 62 -b 10485760 -d /mnt/Use of uninitialized value in division (/) at ./tiobench.pl line 163.
Use of uninitialized value in division (/) at ./tiobench.pl line 163.
Illegal division by zero at ./tiobench.pl line 163.
birdie ★★★★★
() автор топика
Ответ на: комментарий от birdie
Я запустил tiobench и самописный тест (см. выше) и получил "абсолютно" одинаковые результаты.
sdio ★★★★★
()
что может быть проще iometer, и зачем изобретать велосипед, я не понял
ivlad ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.