Я пишу небольшое приложение, которое пишет изображения в формате JPEG с постоянной скоростью на SD-карте.
Я выбираю файловую систему EXT3, но такое же поведение наблюдается с файловой системой EXT2.
Мой цикл записи выглядит так:
get_image()
fwrite()
fsync()
Или вот так:
get_image()
fopen()
fwrite()
fsync()
fclose()
Я также отображаю некоторую статистику по времени и вижу, что моя программа иногда блокируется на несколько секунд.
Средняя скорость все еще хороша, потому что, если я сохраню входящие изображения в FIFO, то после такой остановки я напишу много изображений в короткий промежуток времени. Знаете ли вы, это проблема с ОС или это связано с самой SD-картой?
Как я могу приблизиться к реальному времени? Мне не нужно сильное в реальном времени, но недолгая остановка на несколько секунд.
Некоторая точность:
Да, fsync необходимо выполнять после каждого файла, потому что я хочу, чтобы изображение находилось на диске, а не в каком-либо буфере пользователя или ядра. Без fsyncing у меня намного лучше,
но все равно недопустимый ларек. Я не думаю, что это проблема буфера, так как первый сбой происходит после того, как было записано 50 Мбайт. И, согласно man-странице, fsync здесь именно для того, чтобы гарантировать, что данные не буферизируются.
Точность относительно средней скорости записи:
Я пишу со скоростью, устойчивой к карте, которую я использую. Если я собираю входящее изображение в ожидании завершения fsync, то после этой задержки скорость передачи записи увеличится, и я быстро вернусь к средней скорости.
Средняя скорость передачи составляет около 1,4 МБайт / с .
Система представляет собой современный ноутбук под управлением Ubuntu 8.04 со стоковым Kee (2.6.24.19)