В файловой системе XFS команда ls (системный вызов getdents) обращается к диску или существует ли кешированная структура каталога в памяти?

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

Просто для теста я создал и смонтировал одну и ту же файловую систему XFS на двух хостах с использованием общего устройства (pmem). Хост A создал файл в своем смонтированном каталоге и выполнил команду sync, чтобы xfs_db смог увидеть информацию о новом иноде. Однако этот новый файл не виден на Хосте B, пока Хост B не выполнит umount файловой системы. Я хотел бы знать, почему так происходит.

Я заметил, что системный вызов ls (getdents) в конечном итоге вызывает функцию xfs_readdir(), которая использует формат XFS на диске для получения информации об иноде. Однако обращается ли этот процесс к диску, или часть метаданных для xfs_inode кэшируется в памяти при монтировании файловой системы?

.

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

В XFS файловой системе процесс обращения к команде ls и системному вызову getdents, по сути, взаимодействует с файловой системой на уровне чтения каталога с использованием функции xfs_readdir(). Этот процесс может использовать как кэшированные данные в памяти, так и обращаться напрямую к диску. Чтобы понять, как это происходит, рассмотрим данное поведение более детально.

Теория

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

Пример

В вашем сценарии, когда вы создали файл на Host A и использовали команду sync, изменения были записаны на диск. Тем не менее, это не сделало файл сразу видимым на Host B без процедуры размонтирования и повторного монтирования файловой системы. Это происходит потому, что Host B использует свои собственные кэшированные данные о файловой системе, а не те обновленные данные, записанные на диске Host A.

Применение

Кэширование метаданных в памяти объясняет, почему Host B не видит изменения, пока не выполнит umount. Хосты, использующие одну и ту же файловую систему, но не обновляющие кэшированные данные через монтирование, остаются в несогласованном состоянии относительно изменений на диске. В многопользовательских системах или системах с общей файловой системой, таких как ваша, необходимо выполнение действий, синхронизирующих кэш, чтобы все узлы имели консистентное состояние. В данном контексте XFS, фактически, использует кэш, но для достижения актуальности данных требуется управление и контроль кэширования.

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

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

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