реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Отказоустойчивая запись на жёсткий диск, Какую файловую систему выбрать?
Enthusiast
сообщение Mar 10 2012, 04:29
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 25-09-09
Из: Nizhny Novgorod, Russia
Пользователь №: 52 588



Привет, уважаемые форумчане! Имеется одноплатный компьютер, с которого необходимо записывать данные на жёсткий диск, примерно 100 КБ каждые 10 мс. Получится ли использовать стандартную линуксовую файловую систему, каждые 10 мс открывая файл, дописывая новые данные в его конец и закрывая его? Какую файловую систему лучше выбрать? Или без низкоуровневой посекторной записи на жёсткий диск не обойтись? Кроме требования по скорости записи есть ещё требование по сохранности данных при аварийном отключении питания: желательно, чтобы данные не портились при этом и были доступны при восстановлении напряжения питания. Буду рад совету, пишите.

Сообщение отредактировал Enthusiast - Mar 10 2012, 04:31
Go to the top of the page
 
+Quote Post
Demeny
сообщение Mar 10 2012, 07:09
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237



Цитата(Enthusiast @ Mar 10 2012, 07:29) *
Привет, уважаемые форумчане! Имеется одноплатный компьютер, с которого необходимо записывать данные на жёсткий диск, примерно 100 КБ каждые 10 мс. Получится ли использовать стандартную линуксовую файловую систему, каждые 10 мс открывая файл, дописывая новые данные в его конец и закрывая его? Какую файловую систему лучше выбрать? Или без низкоуровневой посекторной записи на жёсткий диск не обойтись? Кроме требования по скорости записи есть ещё требование по сохранности данных при аварийном отключении питания: желательно, чтобы данные не портились при этом и были доступны при восстановлении напряжения питания. Буду рад совету, пишите.

Открывать и закрывать при каждой записи файл совсем не нужно - это никак не влияет на механизмы общения ОС Linux с жёстким диском, при закрытии файла кэши не сбрасываются на диск в обязательном порядке. Открытие и закрытие файла - исключительно логические операции, манипулирующие с выдачей и освобождением файловых дескрипторов и статистической информацией о файле (время последнего доступа и т. п.). Для сброса кэша записи на диск нужно использовать sync().
В общем и целом, думаю, что станд. линуксовая ФС типа EXT непригодна для вашей задачи. Более того, низкоуровневая запись секторов на жёсткий диск тоже вас не спасёт, ибо так или иначе вам придётся как-то организовывать эти сектора, то есть по сути с нуля изобретать свою ФС.
Для ваших целей придуманы так называемые "Power Safe Filesystem", правда, в мире QNX. Есть ли такие под Linux - мне неизвестно.
Посмотрите здесь, раздел "Power-Safe Filesystem", там описаны принципы построения таких ФС, также изложено, почему системы EXT таковыми не являются.


--------------------
Сделано в Китае. Упаковано в России.
Go to the top of the page
 
+Quote Post
sasamy
сообщение Mar 10 2012, 11:12
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(Demeny @ Mar 10 2012, 11:09) *
Для ваших целей придуманы так называемые "Power Safe Filesystem", правда, в мире QNX. EXT таковыми не являются.


Причем тут QNX ? COW и снапшоты поддерживают многие ФС. Если бы не экстравагантность разработчика Ханса Райзера (который сидит за убийство жены) - в Linux давно была бы превосходная ФС - Reiser4. Сейчас нужно ориентироваться на Brtfs - правда к ней до сих пор много претензий.
Go to the top of the page
 
+Quote Post
Enthusiast
сообщение Mar 11 2012, 15:25
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 25-09-09
Из: Nizhny Novgorod, Russia
Пользователь №: 52 588



Цитата(Demeny @ Mar 10 2012, 11:09) *
Открывать и закрывать при каждой записи файл совсем не нужно - это никак не влияет на механизмы общения ОС Linux с жёстким диском, при закрытии файла кэши не сбрасываются на диск в обязательном порядке. Открытие и закрытие файла - исключительно логические операции, манипулирующие с выдачей и освобождением файловых дескрипторов и статистической информацией о файле (время последнего доступа и т. п.). Для сброса кэша записи на диск нужно использовать sync().
В общем и целом, думаю, что станд. линуксовая ФС типа EXT непригодна для вашей задачи. Более того, низкоуровневая запись секторов на жёсткий диск тоже вас не спасёт, ибо так или иначе вам придётся как-то организовывать эти сектора, то есть по сути с нуля изобретать свою ФС.
Для ваших целей придуманы так называемые "Power Safe Filesystem", правда, в мире QNX. Есть ли такие под Linux - мне неизвестно.
Посмотрите здесь, раздел "Power-Safe Filesystem", там описаны принципы построения таких ФС, также изложено, почему системы EXT таковыми не являются.

Чем плох fflush()? Последняя запись данных может быть потеряна, главное - чтобы сохранились все предыдущие данные и файл был доступен для чтения в последствии.
Если записывать данные на жёсткий диск каждые 10 мс, то не откажет ли он от такой частой записи? Стоит ли кэшировать запись, к примеру, раз в 100 мс?
Go to the top of the page
 
+Quote Post
kurtis
сообщение Mar 12 2012, 16:29
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



Вы еще учтите, что даже если вы с программной стороны все сделали верно, то не факт что данные с буферов накопителя успели попасть в сам накопитель. Сталкивался с проблемой, когда писал софт для обновления прошивки устройства, если сделать sync() и затем сразу выключить устройство, данные часто портились, а если добавить задержку в секунду (мне временные задержки были не критичны), то запись всегда проходила без ошибок. Правда это касалось MMC карточки, но для HDD думаю что-то такое тоже есть, нужно смотреть документацию. Писал через dd, без файловой системы.
Go to the top of the page
 
+Quote Post
Enthusiast
сообщение Mar 30 2012, 15:17
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 25-09-09
Из: Nizhny Novgorod, Russia
Пользователь №: 52 588



Решил я не морочиться с низкоуровневой записью на диск и сделал запись данных в обычные двоичные файлы через fopen(), fwrite(), fflush(), fclose(). Данные записаться в двоичные файлы вполне успевают, а при пропадании и последующем восстановлении напряжения питания, на мой взгляд, все предшествующие данные из файлов должны восстановиться из журнала файловой системы ext3.
Go to the top of the page
 
+Quote Post
temiru
сообщение May 4 2016, 07:44
Сообщение #7





Группа: Участник
Сообщений: 8
Регистрация: 4-05-16
Пользователь №: 91 582



нормальное решение зачем усложнять
Go to the top of the page
 
+Quote Post
AVR
сообщение May 10 2016, 15:03
Сообщение #8


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(temiru @ May 4 2016, 10:44) *
нормальное решение зачем усложнять

Теме уже 4 года... Просто можно было настройки ядра подправить, без перекомпиляции, и оно бы само сбрасывало на диск кэши гораздо чаще чем по умолчанию.


--------------------
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 05:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01441 секунд с 7
ELECTRONIX ©2004-2016