У нас есть система сбора данных, которая подключена к очень быстрому рейду 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) тоже не имеет никакого эффекта.
Я не знаю, какова конкретная проблема, но вы можете просто использовать вызовы нижнего уровня 'open' и' write'. Есть ли какая-то особая причина, по которой вам нужно использовать 'fopen' и' fwrite'? Кроме того, какая польза от 'fallocate'? Пространство будет выделено при записи в файл. –
AndySchweig Поведение также происходит с помощью open/write/close. (Я думаю, что идея fallocate заключалась в улучшении производительности.) – Piotr
Очевидный вопрос: вы уверены, что ваш дисковый массив может записать 1,25 ГБ/сек? – duskwuff