2016-07-19 2 views
2

В моем командном C-приложении для Windows используется функция fwrite() для непрерывной передачи полученных данных в файлы объемом 1 ГБ на накопителе SSD. Данные поступают с карты PCIe в кусках около 16 Кбайт, что является количеством данных, которое я использую при вызове функции fwrite().fwrite() падение производительности

В этих условиях каждый FWRITE() вызов обычно занимает менее 100 мкс (измеренный с помощью счетчика производительности Windows) но есть выпадающие принимая 2 или более секунд, чтобы завершить, вызывая переполнение буфера в PCIe карты. В чем причина этих спорадических падений? Есть ли что-нибудь, что я могу сделать, чтобы предотвратить их?

Обновление # 1: часть проблемы, по-видимому, вызвана дисководом SSD. При сбросе на обычный механический жесткий диск выбросы составляют порядка 100 мсек (вместо 1000 мс).

Обновление # 2: кажется, что замедление fwrite() происходит после записи первых 1,5 ГБ данных. При сбрасывании файлов на 1 ГБ замедление происходит в середине второго файла. При использовании файлов объемом 512 МБ это происходит после третьего файла. При использовании файлов с 256 МБ это после 6-го файла.

+2

Как часто вы видите эти выбросы? Это всегда одно или другое, никаких промежуточных значений? –

+0

Звучит как эффект буферизации для меня. Попробуйте добавить 'fflush()' после каждого 'fwrite()'. Если вышли из строя, то быстрый вызов 'fwrite()' просто записывается в буфер в памяти, а длинные 'fwrite()' звонки записывают весь буфер на ваш диск. –

+0

Чтобы быть уверенным, правильно ли вы открыли файл в двоичном режиме ('" wb "')? IO в текстовом режиме может проявлять странное поведение. – ElderBug

ответ

1

Кража something:

Флэш-память использует цикл стирания-записи. Стирание по существу устанавливает память всем 1s. Написание устанавливает биты в 0, и можно записать разные данные, если существующие 1s изменены на 0. Flash-файл может использовать эту функцию, поскольку он позволяет выполнять операции без длительного и электрически дорогого цикла стирания .

С SSD вы, вероятно, не используете флеш-файловую систему. Я предполагаю, что периодически вам нужно приостановить запись, в то время как контроллер SSD освобождает место, стирая некоторые сектора.

+0

Кажется, что SSD является частью проблемы. При сбрасывании файла на обычный жесткий диск я все еще вижу выбросы в диапазоне 100 мс, но нигде рядом с 1000 мс, которые у меня есть с SSD. – geschema