Клиент 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 Кбайт на устройство, даже если запись в файл намного меньше.