Почему fflush () занимает переменное количество времени, сбрасывая один и тот же фрагмент данных

У меня есть файловый дескриптор, в который я всегда пишу два числа. Обратите внимание, что я всегда вызываю rewind () перед записью чего-либо в файл, что означает, что я всегда пишу в первую строку. По сути, думайте об этом как о поддержании «текущего состояния» внутри файла. Я также вызываю fflush () после записи в него. Я столкнулся с пиками задержки в своем приложении, и когда я проверил, я обнаружил, что fflush () обычно занимает около 2-3 микросекунд (да, у меня быстрый злой сервер), но в другое время (после 6-7 «нормальной записи циклы промывки «) Я вижу, что затраченное время увеличивается в тысячи раз (15000+ микросекунд)

Можете ли вы сказать мне, что я должен проверить в этом сценарии? Как я могу исправить / отладить эту проблему?

0

Решение

Это зависит от того, что еще происходит с диском. Первое узкое место — когда ваши данные ставятся в очередь для записи, поэтому это будет зависеть от того, что еще ОС (или другой источник данных) делает с диском.
В связи с этим может возникнуть задержка получения эксклюзивного контроля над шиной данных.
Если это магнитный накопитель, а не твердотельный накопитель, то есть время, необходимое для того, чтобы физическая головка записи переместилась на правильную дорожку и сектор для выполнения записи. Обратите внимание, что, поскольку это физическое действие, оно занимает гораздо больше времени.

Короче говоря, если вы не глубоко погружены в ОС, то нет никакой гарантии, когда именно произойдет запрошенное низкоуровневое действие.

1

Другие решения

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

Это очень абстрактный взгляд на происходящее. На самом деле, настоящая ОС, вероятно, не вернется из fflush() пока данные не будут записаны в журнал.

1

По вопросам рекламы [email protected]