Возможно ли отключить кеш каталога overlayfs?

Вопрос или проблема

У меня есть процесс, который непрерывно записывает файлы в структуру каталогов, которая выглядит следующим образом:

152527
├── 1525270000000
│   ├── 01be6dc0b6e3e087.json
│   ├── 067e2490bb7ee05c.json
│   ├── 15ec3513bf7deef6.json
├── 1525270010000
│   ├── 01be6dc0b6e3e087.json
│   ├── 067e2490bb7ee05c.json
│   ├── 15ec3513bf7deef6.json
...

Каталоги записываются на серию монтировок, /mnt/fs_01, /mnt_fs_02, /mnt/fs_03, совмещенные в режиме только для чтения overlayfs для /mnt/fs_all.

Набор процессов записывает на одну монтировку за раз; тот же набор процессов читает из объединенного /mnt/fs_all. (Это приложение uWSGI.)

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

Документация по overlayfs упоминает:

Когда запрашивается ‘readdir’ в объединенном каталоге, верхний и
нижний каталоги читаются, и списки имен объединяются очевидным образом (сначала читается верхний, затем нижний – существующие записи не добавляются)
. Этот объединенный список имен кэшируется в
‘struct file’ и остается, пока файл открыт. Если
каталог открыт и читается двумя процессами одновременно, у каждого будет свой
кэш. Команда seekdir к началу
каталога (offset 0), после которой следует readdir, приведет к
сбрасыванию и перестроению кэша.

Это означает, что изменения в объединенном каталоге не появляются во время
чтения каталога. Это вряд ли будет замечено многими
программами.

К сожалению, это замечается моей программой.

Я могу реализовать предложение seekdir, но предпочел бы, если возможно, полностью отключить кэш.

Есть ли способ сделать это?

Это невозможно на данный момент.

Несколько абзацев ниже абзаца о readdir Изменения в базовых файловых системах явным образом запрещает это и предупреждает о безопасном неопределенном поведении.

Я тоже предполагал, что readdir будет полностью читать и объединять соответствующие каталоги при каждом объединенном readdir. Этого не происходит.

Инвалидация кэша с помощью seekdir(0) аннулирует только объединенный результат, но не аннулирует кэш lowerdir.

Единственный способ, который я нашел, чтобы принудительно перечитать lowerdir, – это полностью размонтировать overlayfs и снова его смонтировать. Простой mount -o remount не помогает.

.

Ответ или решение

Отключение кеша каталога в файловой системе overlayfs: возможности и ограничения

Введение
Повсеместное использование overlayfs, особенно в среде, где происходит непрерывная запись и чтение данных из каталогов, нередко поднимает вопрос о возможностях и ограничениях этой файловой системы. В контексте вашего описания, задача заключается в обеспечении корректного отображения новых каталогов, которые создаются в одной из подлежащих файловых систем, но не всегда отображаются в объединенном каталоге /mnt/fs_all. Давайте разберем, можно ли отключить кеширование директорий в overlayfs и, если нет, какие существуют обходные пути.

Технический анализ проблемы
overlayfs представляет собой объединяющую файловую систему, которая позволяет объединять содержимое нескольких каталогов в один. При выполнении операции readdir, overlayfs кэширует список имен каталогов из верхнего и нижнего уровней в структуре ‘struct file’. Эта структура остается неизменной до тех пор, пока файл остается открытым. Таким образом, изменения в каталогах, сделанные после открытия файла, не отображаются в кэшированном списке имен.

Ограничения overlayfs
Как следует из официальной документации kernel.org, текущая реализация overlayfs не поддерживает полное отключение кеширования каталогов. Это накладывает определенные ограничения на приложения, работающие с большими объемами данных и требующие актуальной информации о структуре каталога. Документация также указывает, что вызов функции seekdir(0) не обновляет кэш нижнего уровня, а лишь делает сброс кэша объединенного результата.

Пути решения

  1. Реализация seekdir: Один из возможных вариантов решения — использовать функцию seekdir для сброса и пересоздания кэша. Однако это не удаляет уже сохраненные записи из нижнего уровня.

  2. Переустановка монтирования: Полное размонтирование overlayfs и его повторное монтирование — это верный способ заставить систему перечитать каталоги с нижнего уровня. Хотя этот метод может быть затратным по ресурсам и времени, он обеспечивает актуальность отображаемой информации.

Заключение
В настоящее время отключение кеша каталогов в overlayfs не представляется возможным средствами стандартных конфигураций. Однако применение описанных выше способов позволит преодолеть некоторые ограничения. Рекомендуется мониторинг и, при необходимости, установка более гибкой файловой системы, если употребление подобных методов становится критичным для производительности.

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

Оцените материал
Добавить комментарий

Капча загружается...