Безопасно ли использовать запись Direct-IO и чтение страницы кэша одновременно? - PullRequest
0 голосов
/ 10 января 2020

Например, открыть файл дважды, выполнить прямую запись в io с одним fd, а чтение кэша страниц - с другим?

Как определить safe: записать некоторые данные из direct-io fd, а затем ожидайте прочитать их immediately из кеша страниц fd

1 Ответ

1 голос
/ 13 января 2020

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

В этом посте https://lwn.net/Articles/776801/ упоминается, что прямой ввод-вывод имеет семантику аннулирования:

по крайней мере с некоторыми файловыми системами выполнение чтения с прямым вводом-выводом на странице вынудит эту страницу из кэша

book перечислить 3 стратегии записи в разделе «Кэширование записи»: нет -пишите, сквозной записи, обратной записи. Прямой ввод-вывод может быть вариантом «без записи» системного вызова write().

Использование нескольких файлов для одного файла безопасно, так как данные управляются кодом FS с использованием inode. Оба fd будут указывать на один и тот же индекс.

В 2013 году в списке рассылки была нить https://lists.kernelnewbies.org/pipermail/kernelnewbies/2013-July/008660.html, а TLDR:

От точка зрения разработчика ядра: драйвер ядра гарантирует согласованность между кешированием страниц и данными, передаваемыми с помощью O_DIRECT. ...

  1. Не беспокойтесь о связности между кэшем страниц и данными, передаваемыми с помощью O_DIRECT. Ядро сделает недействительным кеш после записи O_DIRECT и flu sh кеш перед чтением O_DIRECT.
  2. Используйте мьютексы или семафоры (или любую из многочисленных опций [1]), чтобы предотвратить обычные проблемы синхронизации во время IP C с использованием общего файла.

Таким образом, хотя прямая запись удаляет записанную часть файла из кэша страниц, существует некоторая возможность состязания между писателем и читателем. Так что мьютекс или другой синтаксис c необходим, если ваш читатель хочет получить обновленные данные. Только после завершения системного вызова Direct IO write () кэш страницы будет очищен.

Иногда смешивание не рекомендуется: https://medium.com/databasss/on-disk-io-part-1-flavours-of-io-8e1ace1de017 " Не рекомендуется открывать тот же файл с помощью Direct IO и Page Cache одновременно, так как прямые операции будут выполняться с дисковым устройством, даже если данные находятся в Page Cache, что может привести к нежелательным результатам."

...