LINUX.ORG.RU

[embedded] Управление дисковым кэшем

 


0

0

Приветствую всех.
Возможно тема не очень подходит для development, но мне этот раздел как-то ближе.
Задача следующая. Есть некая embedded система, основной задачей которой является сохранение видео данных с камеры на флэш-накопителе.
Упрощенный тракт видео информации следующий:
Video source ---> V4L Driver ---> Application ---> Flash (FAT).

Video source производит 25 кадров в секунду - data rate примерно 512KB/sec.
V4L Driver сохраняет кадры в 20 внутренних буферах, т.е. может буферизироваться без малого 1 секунда видео.
Application висит в poll() на файловом дескрипторе видео устройства (/dev/video) и ждет видео данные. При появлении данных, сохраняет кадры на флэш-накопитель.
Flash - отформатирован в FAT32. Максимальная скорость записи 1.7 MB/sec (DMA). В принципе, этой скорости вполне достаточно чтобы успевать сохранять видео поток на флэш.

Проблема в том, что ядро кэширует данные при записи и может не сбрасывать кэш на носитель несколько секунд. После чего пытается сбросить сразу несколько мегабайт, приложение блокируется на пару секунд и получается frame drop.
Как бы этого избежать? Или хотябы минимизировать?

Полностью отключать дисковый кэш не хотелось бы. Хотелось бы чтобы сбрасывание происходило при накоплении в кэше не более 1MB данных. Как бы произвести тюнинг дисковой подсистемы в плане этого? Какие параметры смотреть?

Можно, конечно, в паралельном треде вызывать переодически sync(), но как-то некошерно выглядит.

Может быть предложите другие варианты решения подобной проблемы?

Спасибо.

★★★★

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

Не уверен, что fsync - это оптимальный вариант, т.к. он блокирующий. Хотелось бы, чтобы данные в кэше сбрасывались на носитель параллельно выполнению приложения. Да и fdatasync в таком случае получше будет, т.к. не обновляет атрибуты файла.

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

>linux-2.6/Documentation/ABI/testing/sysfs-class-bdi ?

Спасибо, похоже на то, что мне нужно.

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

> Да и fdatasync в таком случае получше будет, т.к. не обновляет атрибуты файла.

Тебе виднее (fdatasync описан в той же странице мана).

Я *не знаю*, будет ли нить с fsync блочить весь процесс. Такое м.б., и даже есть aio_fsync.

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

>Я *не знаю*, будет ли нить с fsync блочить весь процесс. Такое м.б., и даже есть aio_fsync.

Блочит в теории и на практике.
aio_fsync - попробую, если ничего больше не останется. Дело в том, что IMHO если я вызываю aio_fsync, то до того, как она отрапортует, что данные сброшены, я не смогу сделать write нового фрэйма, а это почти равносильно блокировке. Возможно я ошибаюсь, т.к. AIO на практике не доводилось применять.

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

>linux-2.6/Documentation/ABI/testing/sysfs-class-bdi

Кажется, это не совсем то, что нужно. Это управление write-back кэшем. Насколько я понимаю, это кэш, который находится на носителе.

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

> Кажется, это не совсем то, что нужно. Это управление write-back кэшем. Насколько я понимаю, это кэш, который находится на носителе.

Нет, это кеш в ядре.

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

>vm.dirty_background_ratio

Нету, млин, vm :( Проц - Blackfin, там нет нормального MMU.

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

>1.7Mb/s маловато, обыно больше. что за накопитель?

CompactFlash подключенный к ATA контроллеру.
Вроде флэшка хорошая и поддерживает UDMA 66, а скорость довольно низкая на запись (на чтение 4.7 MB/sec). Причем если читать через USB cardreader, то запись дает до 4MB/sec. Руки пока не дошли до драйвера ATA контроллера.

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

>vm.dirty_background_ratio
...
В предыдущем посте я тормозил по поводу vm в Blackfin.
Эти параметры действительно помогли! Frame drop исчез.
Спасибо большое за подсказку!

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