2016-04-28 6 views
0

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

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

+3

Ну, вы пишете на хранение какой-то, возможно (вы не сказали) HDD. Два локальных механизма хранения, о которых я могу думать (жесткие диски и твердотельные накопители), будут иметь разное время отклика, основанное на том, что еще они должны делать. 150000 * микро * секунд по-прежнему * очень короткий период времени *. –

+0

Помогло ли использование файла с отображением памяти? – Chani

+0

@Wildling * Использовал бы файл с отображением памяти? * Прочитайте [этот пост] (http://marc.info/?l=linux-kernel&m=95496636207616&w=2) из ​​Linux Torvalds. 'mmap()' is ** NOT ** какая-то магия, которая делает все быстрее. –

ответ

1

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

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

1

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

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

+0

Итак, какие у меня варианты? Помогло бы использование файла с отображением памяти? – Chani

+1

Ну, если бы я был в такой ситуации, я бы также рассмотрел возможность найти другую работу за пределами Уолл-стрит, которая не была заражена абсолютно банальными проблемами, которые сводятся к микро и наносекундам, о которых никто действительно не заботится. Просто говорю. –

+0

@ Wildling Купить более быстрый диск, желательно ssd. Не вызывайте 'fflush', или если вы это делаете, используйте асинхронный поток, так что латентность не имеет значения. – user2079303