LINUX.ORG.RU

Как правильно померить поток данных??


0

0

Вот тут надо написать демона который из shared memori данные сохраняет в файл каждые N секунд. Вроде всё тривиально open()

write()

fsync() nanosleep()

и опять на write. Если пора заканчивать работу то close().Хочется чтобы данные точно были на носителе, поэтому и вызываю fsync().Написал я демона, но только совсем смешной поток получаю, при записи данных на файловую систему. dd выдает поток в:

dd if=/dev/zero of=/mnt/mmcblock0/test count=100 bs=1024

100+0 records in

100+0 records out

102400 bytes transferred in 0.018828 seconds (5 438 698 bytes/sec)

моя же прога при тех же условиях работы count=100 bs=1024 выдает 65 282 bytes/sec

Посмотрев на strace dd видно что fsync() не вызывается не разу а время окончания операции копирования отмечается после close() над дискриптором файла куда копировали. Тоесть, данные сидят в кеше файловой ситемы, а dd показывает ,с какой скоростью он туда их запихивает.

Возник вопрос а честно ли вобще мерить поток данных на вайловую систему утилитой dd. А если нет то тогда чем??

anonymous
Ответ на: комментарий от no1sm

2no1sm:

> Обещает, что all I/O to the file system should be done synchronously.

"Синхронный" не означает "не засоряя кэш". Синхронное монтирование всего лишь гарантирует, что после выхода из write'а данные будут на диске.

Die-Hard ★★★★★
()

anonymous (*) (12.04.2005 13:31:05):

> ..честно ли вобще мерить поток данных на вайловую систему утилитой dd.

Нет.

> А если нет то тогда чем??

Единственный известный мне способ, позволяющий под Линуксом хоть как-то оценить производительность файловой системы, состоит в отмонтировании директории после копирования:

time sh -c "dd if=/dev/zero of=/mnt/null.txt count=1000000 bs=1M; umount /mnt"

Я пробовал использовать O_DIRECT, в результате программа писАла чудовищно медленно. Тут была на эту тему дискуссия с полгода назад:

http://www.linux.org.ru/view-message.jsp?msgid=707517

Die-Hard ★★★★★
()

еще нужно кэш в самом диске отключить (hdparm или atactl). Кстати вообще, если упса нет, то кэш на дике обязательно нужно отключать.

dilmah ★★★★★
()

>dd if=/dev/zero of=/mnt/mmcblock0/test count=100 bs=1024

>100+0 records in

>100+0 records out

>102400 bytes transferred in 0.018828 seconds (5 438 698 bytes/sec)

тебе было бы неплохо до и после вызвать df дабы понять что ты занимаешся полной ерундой.

после такой dd файл /mnt/mmcblock0/test навряд ли займёт 1килобайт дискового пространства(по крайней мере на ext2,3).

cvv ★★★★★
()
Ответ на: комментарий от dilmah

2dilmah:

>еще нужно кэш в самом диске отключить (hdparm или atactl).

А я думал, что ATA диски не имеют кэша... Какие опции hdparm за него отвечают? Мой man hdparm про кэш молчит.

> Кстати вообще, если упса нет, то кэш на дике обязательно нужно отключать.

Кстати, по умолчанию в SCSI дисках кэш отключен.

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

я ж линуксом года 2 уже не пользуюсь.. В NetBSD:

dkctl wdN setcache r

> А я думал, что ATA диски не имеют кэша...

ну на чтение то точно есть. не знаю. Мне dkctl wdN getcache пишет что enabled и read и write cache.

dilmah ★★★★★
()
Ответ на: комментарий от cvv

cvv wrote:
>
> > dd if=/dev/zero of=/mnt/mmcblock0/test count=100 bs=1024
>
> после такой dd файл /mnt/mmcblock0/test навряд ли займёт
> 1килобайт дискового пространства(по крайней мере на ext2,3).

это как это? намекаете на sparse файлы? нет, будет честно
записано 100K. vfs и ext2 не знает (и не проверяет), что
там нули. только в случае truncate.

idle ★★★★★
()
Ответ на: комментарий от no1sm

> ну ладно перепутал, sync. Обещает, что all I/O to the
> file system should be done synchronously.

или просто делать open(O_SYNC). что, кстати, имеет
смысл, если после каждого write() идет fsync(), как
у автора вопроса.

кроме того, если вызывать fsync() напрямую, следует
помнить про fdatasync() - быстрее.

idle ★★★★★
()
Ответ на: комментарий от idle

Всем спасибо за советы. Сделал открытие файла с флагом O_ASYNC и на больших записываемых блоках с bs>=10240 получаю вполне нормальную скорость 500-600 Кб/с.

anonymous
()
Ответ на: комментарий от idle

>> > dd if=/dev/zero of=/mnt/mmcblock0/test count=100 bs=1024 >> >> после такой dd файл /mnt/mmcblock0/test навряд ли займёт >> 1килобайт дискового пространства(по крайней мере на ext2,3).

>это как это? намекаете на sparse файлы? нет, будет честно >записано 100K. vfs и ext2 не знает (и не проверяет), что >там нули. только в случае truncate.

кажись меня память подвела. В етом случае действительно sparse на ext2 кажись не поддерживается. А вообще поддерживается но при других обстоятельствах

cvv ★★★★★
()
Ответ на: комментарий от anonymous

> Сделал открытие файла с флагом O_ASYNC

надеюсь, описка у вас здесь, а не в коде :)

O_ASYNC и O_SYNC - немножко разные флаги :)

idle ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.