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 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.