Подтвердить что ты не робот

После того, сколько секунд буферы записи в файловой системе обычно краснеют?

Прежде чем перезаписывать данные в файле, я хотел бы быть уверенным, что старые данные хранятся на диске. Это потенциально очень большой файл (несколько GB), поэтому необходимы обновления на месте. Обычно записи будут иметь размер 2 МБ или больше (мой план состоит в том, чтобы использовать размер блока 4 КБ).

Вместо (или в дополнение к) вызова fsync() я хотел бы сохранить (не перезаписывать) старые данные на диске, пока файловая система не напишет новые данные. Основными причинами, по которым я не хочу полагаться на fsync(), является: большинство жестких дисков относятся к вам о выполнении fsync.

Итак, что я ищу, это типичная максимальная задержка для файловой системы, операционной системы (например, Windows), жесткого диска, пока данные не будут записаны на диск, без использования fsync или подобных методов. Я хотел бы иметь реальные числа, если это возможно. Я не ищу совета для использования fsync.

Я знаю, что нет 100% надежного способа сделать это, но я хотел бы лучше понять, как работают операционные системы и файловые системы в этом отношении.

То, что я нашел до сих пор: 30 секунд является/по умолчанию для /proc/sys/vm/dirty _expire_centiseconds. Затем " грязные страницы сбрасываются (записываются) на диск... (когда) прошло слишком много времени, так как страница осталась грязной" ( но там я не мог найти время по умолчанию). Поэтому для Linux 40 секунд, похоже, находятся в безопасности. Но верно ли это для всех файловых систем/дисков? Как насчет Windows, Android и т.д.? Я хотел бы получить ответ, который относится ко всем распространенным операционным системам/файловой системе/дискам, включая Windows, Android, обычные жесткие диски, твердотельные диски и т.д.

4b9b3361

Ответ 1

Позвольте мне переформулировать эту проблему только в слегка-нехарактерных терминах: вы пытаетесь контролировать поведение физического устройства, которое его драйвер в операционной системе не может контролировать. То, что вы пытаетесь сделать, кажется невозможным, если то, что вы хотите, является реальной гарантией, а не довольно хорошей догадкой. Если все, что вам нужно, это довольно хорошее предположение, прекрасно, но остерегайтесь этого и документируйте соответственно.

Возможно, вы сможете решить это с помощью правильного драйвера устройства. Например, протокол SCSI имеет бит Force Unit Access (FUA) в своих командах READ и WRITE, который указывает устройству обходить любой внутренний кеш. Даже если данные изначально были написаны буферизированными, чтение небуферизованных должно быть в состоянии проверить, что оно на самом деле там.

Ответ 2

Единственный способ надежно удостовериться, что данные синхронизированы, - использовать механизм синхронизации конкретной ОС и, согласно PostgreSQL Diability.

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

Нет, нет действительно портативных решений, но можно (но сложно) написать переносные оболочки и развернуть надежное решение.

Ответ 3

Прежде всего, спасибо за информацию о том, что жесткие диски содержат информацию о сбросе данных, что было ново для меня.

Теперь к вашей проблеме: вы хотите быть уверенным, что все записанные вами данные были записаны на диск (самый низкий уровень). Вы говорите, что нужно контролировать две части: время, когда ОС записывает на жесткий диск, и время, когда жесткий диск записывает на диск.

Ваше единственное решение - использовать таймер с нечеткой логикой, чтобы оценить, когда будут записаны данные.

По-моему, это неправильный путь. У вас есть контроль над тем, когда ОС записывает на жесткий диск, поэтому используйте возможность и контролируйте его! Тогда только ваш жесткий диск - это ваша проблема. Эта проблема не может быть решена надежно. Я думаю, вы должны сказать пользователю/администратору, что он должен позаботиться о выборе правильного жесткого диска. Конечно, было бы неплохо реализовать дополнительный таймер, который вы предложили.
Я считаю, вам решать начать ряд тестов с помощью разных жестких дисков и инструмента Brad Fitzgerald, чтобы получить хорошую оценку того, когда на жестких дисках будут записаны все данные. Но, конечно, если жесткий диск хочет лгать, вы никогда не сможете быть уверены, что данные действительно были записаны на диск.

Ответ 4

Есть много кешей, которые участвуют в предоставлении пользователям гибкой системы.

Существует кеш-память процессора, кеш памяти ядра/файловой системы, кеш памяти на диске и т.д. Что вы спрашиваете, сколько времени требуется, чтобы очистить все кеши?

Или, еще один способ взглянуть на это, что произойдет, если дисковод пойдет не так? Вся промывка не гарантирует успешную операцию чтения или записи.

Дисководы в конечном итоге ухудшаются. Решение, которое вы ищете, - это то, как вы можете использовать резервную систему cpu/disk drive, чтобы система оставалась в состоянии сбоя компонента и продолжает работать.

Вы можете повысить вероятность того, что система будет продолжать работать с помощью аппаратного обеспечения, такого как RAID-массивы и другие конфигурации высокой доступности.

Насколько я понял, решение программного обеспечения, я думаю, верят в то, что OS будет делать оптимальную вещь. Большинство из них очищают буферы обычным способом.

Ответ 5

Это старый вопрос, но он все еще актуален в 2019 году. Для Windows ответ, по-видимому, "по крайней мере, через каждую секунду", основанный на этом:

Чтобы обеспечить правильное количество сброса, диспетчер кэша каждую секунду порождает процесс, называемый ленивым писателем. Ленивый процесс записи ставит в очередь одну восьмую из страниц, которые не были недавно сброшены, чтобы быть записанными на диск. Он постоянно пересматривает объем данных, сбрасываемых для оптимальной производительности системы, и, если требуется записать больше данных, он ставит в очередь больше данных.

Чтобы было ясно, вышесказанное говорит, что ленивый писатель порождается через каждую секунду, что не то же самое, что записывать данные каждую секунду, но это лучшее, что я могу найти до сих пор в своем собственном поиске ответа на аналогичный вопрос (в моем случае, у меня есть приложения для Android, которые лениво записывают данные обратно на диск, и я заметил некоторую потерю данных при использовании интервала в 3 секунды, поэтому я собираюсь уменьшить его до 1 секунды и посмотреть, если это помогает... это может ухудшить производительность, но потеря данных убивает производительность намного больше, если учесть время, необходимое для ее восстановления).