2013-02-20 2 views
0

В настоящее время я запускаю raspbian на малине pi, в рамках которой я запускаю приложение, которое производит выборку необработанных данных с частотой 400 Гц с датчика и регистрацию его в файл. Моя проблема заключается в том, что программа зависает от 500 мс до 1 с каждые 10-15 секунд из-за того, что на SD-карту записана некоторая внутренняя запись буфера.Задержка во время записи диска при записи данных

Я попытался установить буфер 0, используя следующий код, но это, кажется, не сделали никакой разницы, и ни при использовании флеш()

std::fstream Log; 
Log.rdbuf()->pubsetbuf(0, 0); 

Я предполагаю, что эта проблема вызвано чем-то в ядре в отличие от моего приложения, но я понятия не имею, с чего начать искать. Было бы весьма полезно получить объяснение того, где моя проблема, скорее всего, ложь.

Благодаря

Matt

+0

Каков фактический объем данных, записываемых в файл в секунду? – us2012

+0

Я вижу это, как правило, из-за буферизации в ОС при записи в файлы на диске. Я использую 'flush' после каждой записи. Lookup 'stdbuf', это может стать полезным. –

+0

@Aater Я тоже об этом думал, но с потоком данных, написанных с постоянной скоростью, грязные страницы истекали непрерывно, верно? Разве это не приводит к более частым, но коротким зависаниям, а не к 1 с каждые 10? – us2012

ответ

1

Проверьте линукс pdflush: http://www.westnet.com/~gsmith/content/linux-pdflush.htm параметров настройки

Первое, что я хотел бы попробовать это делает страницы истекают раньше, например, комплект /proc/sys/vm/dirty_expire_centiseconds до 500. Если это не сработает, уменьшите /proc/sys/vm/dirty_writeback_centisecs и dirty_expire_centiseconds вместе с ним.

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

+0

Ну, изучая meminfo, я вижу, что задержка определенно происходит одновременно с «грязным» разделом. –

+0

@Matthew Итак, уменьшает ли эти две ценности помощь? (Я бы не пошел ниже 100, но 100 (1 секунда), возможно, стоит попробовать.) – us2012

+0

Изменение двух сроков истечения срока действия, похоже, не имеет никакого эффекта, которое я ожидал, учитывая, что период между задержками не совпадает ни с из двух значений. Я буду продолжать играть с другими параметрами и посмотреть, не достаю ли я где-нибудь. Кроме того, я попытался вызвать sync() после каждой записи журнала (так на 400 Гц), но накладные расходы от этого полностью убили приложение. Я начинаю думать, что запись в память может быть лучшей идеей. –

Смежные вопросы