Вопрос или проблема
Просто для теста я создал и смонтировал одну и ту же файловую систему 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
, либо специализированные сетевые файловые системы, если это критично для вашей инфраструктуры.