2017-01-19 3 views
0

У нас есть система сбора данных, которая подключена к очень быстрому рейду 10TB 0 jbod.fwrite потребляет все MemFree, fflush не работает?

Мы получаем 4 буфера данных MiB со скоростью около 1,25 ГБ/с, которые записываются в последовательный файл, который был открыт с помощью fopen, 10 GiB - fallocate'd и написан с помощью fwrite. каждые 10 GiB мы fflush, тогда fallocate получает еще 10 GiB. Наконец, он закрыт после завершения захвата fclose.

Проблема заключается в том, что пока выполняется захват, мы можем видеть/proc/meminfo MemFree drop, а Cached - стрелять - то есть fflush, кажется, ничего не делает. Это продолжается до тех пор, пока в системе не будет около 200 MiB MemFree, и теперь скорость передачи данных становится чрезвычайно spikey, что приводит к сбою нашего захвата.

Мы надеялись, что шипы упадут вокруг 10 GiB, когда мы назовем fflush, но это, похоже, ничего не делает. Файл не сбрасывается, пока мы не вызываем fclose.

Любые причины такого поведения? использование setvbuf (hFile, NULL, _IONBF, 0) тоже не имеет никакого эффекта.

+0

Я не знаю, какова конкретная проблема, но вы можете просто использовать вызовы нижнего уровня 'open' и' write'. Есть ли какая-то особая причина, по которой вам нужно использовать 'fopen' и' fwrite'? Кроме того, какая польза от 'fallocate'? Пространство будет выделено при записи в файл. –

+0

AndySchweig Поведение также происходит с помощью open/write/close. (Я думаю, что идея fallocate заключалась в улучшении производительности.) – Piotr

+0

Очевидный вопрос: вы уверены, что ваш дисковый массив может записать 1,25 ГБ/сек? – duskwuff

ответ

2

Когда вы видите свою свободную память, это ваша ОС, записывающая в буферный кеш (по существу, всю доступную память). Кроме того, stdio fwrite() выполняет буферизацию самостоятельно. Из-за этого происходит некоторая дискуссия о ресурсах. Когда ваша ОС достигает верхних пределов доступной памяти, этот конфликт ресурсов вызывает более медленную запись и высокую загрузку памяти. Узкое место позволяет пропустить захват данных.

Поскольку вы управляете своим собственным буфером, можно было бы использовать write() с O_DIRECT, чтобы избежать всей этой буферизации.

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