Возможно ли в Linux отключить кэширование файловой системы для определенных файлов?

У меня есть несколько больших файлов, и я согласен с тем, что они читаются на диске ввода-вывода. Я хочу, чтобы кэш файловой системы был свободен для других файлов. Можно ли отключить кеширование файловой системы для определенных файлов в Linux? Я хочу сделать это программно через нативный lib + java.

Вы ищете свой Java-эквивалент флага O_DIRECT для open(2) . См. http://man7.org/linux/man-pages/man2/open.2.html.

Вы можете сделать это для открытого экземпляра файла, но не постоянно для самого файла. Вы делаете это для каждого экземпляра открытого файла с помощью прямого ввода-вывода. Я не уверен, как это сделать в Java, но в C и C ++ вы передаете флаг O_DIRECT в вызов open() .

Обратите внимание, что это имеет несколько потенциально проблемных последствий, а именно:

  • Это совершенно опасно для определенных файловых систем. В частности, текущие версии BTRFS имеют серьезные проблемы с прямым вводом-выводом при записи в файл.
  • Вы не можете смешивать прямой ввод-вывод с обычным кэшированным вводом-выводом, если не используете какую-либо форму синхронизации. Кэшированные записи наверняка не будут обнаружены для прямого чтения ввода-вывода, пока вы не fsync() или fdatasync() , и прямые записи ввода-вывода могут не отображаться для кэшированных операций чтения ввода-вывода никогда .

Однако существует альтернативный метод, если вы можете допустить временное хранение данных в кэше. Вы можете использовать интерфейс POSIX fadvise (через системный вызов posix_fadvise в Linux), чтобы сообщить ядру, что вам не нужны данные из файла, когда вы закончите его читать. Используя флаг POSIX_FADV_DONTNEED , вы можете указать ядру удалить определенную область определенного файла из кэша. На самом деле вы можете сделать это, обрабатывая файл тоже (читая порцию, а затем сразу после чтения вызывая posix_fadvise для этой области файла), хотя области, для которых вы это вызываете, должны быть выровнены по размеру страницы системы. Как правило, это предпочтительный переносимый метод обработки данных, поскольку он работает на любой POSIX-совместимой системе с расширениями реального времени (что в значительной степени является любой POSIX-совместимой системой).