Bursty пишет на SD / USB, останавливая мои критичные ко времени приложения на встроенном Linux

Я работаю над проектом по встроенному Linux, который подключает ARM9 к чипу аппаратного видеокодера и записывает видео на SD-карту или USB-накопитель. Архитектура программного обеспечения включает драйвер ядра, который считывает данные в пул буферов, и приложение пользователя, которое записывает данные в файл на смонтированном съемном устройстве.

Я обнаружил, что выше определенной скорости передачи данных (около 750 Кбайт / с) я начинаю видеть, как приложение для записи видео пользователя останавливается примерно на полсекунды, примерно каждые 5 секунд. Этого достаточно, чтобы драйвер ядра исчерпал буферы - и даже если бы я мог увеличить количество буферов, видеоданные должны быть синхронизированы (в идеале в пределах 40 мс) с другими вещами, которые происходят в режиме реального времени. Между этими 5-секундными «скачками задержки» записи завершаются в течение 40 мс (что касается приложения - я ценю, что они буферизируются ОС)

Я думаю, что это отставание связано с тем, как Linux записывает данные на диск - я отмечаю, что pdflush предназначен для пробуждения каждые 5 секунд, я понимаю, что это будет то, что делает запись. Как только остановка завершена, приложение пользователя может быстро обслуживать и записывать резервные буферы (которые не переполняются).

Я думаю, что устройство, на которое я пишу, имеет разумную предельную пропускную способность: копирование 15 МБ файла из памяти fs и ожидание завершения синхронизации (и индикатор USB-флешки перестает мигать) дали мне скорость записи около 2,7 МБ / с.

Я ищу два вида подсказок:

Как я могу предотвратить прерывистую запись от остановки моего приложения - возможно, приоритетов процессов, исправлений в реальном времени или настройки кода файловой системы для непрерывной, а не прерывистой записи?

Как я могу сообщить своим приложениям о том, что происходит с файловой системой с точки зрения невыполнения записи и пропускной способности карты / флешки? У меня есть возможность изменять битрейт видео в аппаратном кодеке на лету, что было бы намного лучше, чем отбрасывание кадров или наложение искусственного ограничения на максимально допустимый битрейт.

Немного больше информации: это 200MHz ARM9, в настоящее время работающий на ядре Montavista 2.6.10.

Обновления:

Монтирование файловой системы SYNC приводит к слишком низкой пропускной способности.Съемный носитель отформатирован в FAT / FAT32 и должен быть предназначен для того, чтобы носитель можно было подключить к любому ПК с Windows и прочитать.Регулярный вызов sync () или fsync (), скажем, каждая секунда вызывает регулярные задержки и недопустимо низкую пропускную способностьЯ использую write () и open (O_WRONLY | O_CREAT | O_TRUNC), а не fopen () и т. Д.Я не могу сразу найти что-нибудь в Интернете об упомянутых «файловых системах Linux реального времени». Ссылки?

Я надеюсь это имеет смысл. Первый вопрос по встроенному Linux на stackoverflow? :)

Ответы на вопрос(10)

Ваш ответ на вопрос