Клиент NFS собирает запросы на запись, даже когда приложение открывает файл с O_DSYNC

Я запускаю приложение, которое открывает файл в монтировании NFS с O_DSYNC вариант. Приложение тогда пишет 6500 1000 байт данных в файл в цикле.

Я контролировал поведение клиента и заметил, что он отправляет записи в базовую файловую систему партиями по 4096 и 8192 байта.

Согласно man open, Операции записи в файл, открытый с O_DSYNC завершится в соответствии с требованиями завершения целостности синхронизированных данных ввода / вывода. Далее говорится, что

O_DSYNC provides synchronized I/O data integrity completion, meaning write operations will flush data to the underlying hardware, but will only flush metadata updates that are required to allow a subsequent read operation to complete successfully. 

Я предположил, что с O_DSYNC, write() Вызов не вернется, пока базовая файловая система не успешно записала данные. Это не то, что здесь происходит. NFS-клиент кеширует записи и сбрасывает их кратно 4k. Почему это так?

Обратите внимание, что я использую экземпляр Amazon EC2 под управлением Linux версии 4.9 с размером страницы 4096.

1 ответ

Запись на устройство может быть кратна размеру блока хранения: 512 байт для старых дисков или 4096 для многих новых дисков. Поскольку файлы не выровнены по дисковым блокам, это может вызвать чтение-изменение-запись двух дисковых блоков, что приведет к записи 8 Кбайт на устройство, даже если запись в файл намного меньше.

Другие вопросы по тегам