Я узнал о политике закрытия NFS, которая заставляет каждый файл сбрасываться на сервер по мере его закрытия, чтобы обеспечить согласованность между клиентами. (Видеть http://docstore.mik.ua/orelly/networking_2ndEd/nfs/ch07_04.htm.) Это приводит к значительному снижению производительности при попытке записать много маленьких файлов.
Я, разумеется, знаю об опции экспорта «async», но есть также опция монтирования клиента «nocto», которая должна отключать механизм закрытия для этого клиента. Насколько я могу судить, это должно помешать клиенту сбрасывать файл при его закрытии (а также не беспокоиться о проверке целостности кеша при его открытии). Однако это, похоже, не имеет никакого эффекта: клиент все еще сбрасывает файл на сервер при закрытии, вызывая массовое ожидание-io.
Кто-нибудь знает, почему «nocto» не дает того эффекта, на который я надеялся? Опция «async» работает, как и ожидалось, но для меня важнее, чтобы в этом случае кеш клиента был правильным, и это меня просто беспокоит.
Пример: набор бездисковых узлов имеет общий удаленный корень, который периодически обновляется с одного из узлов. Не важно, чтобы каждый файл был сброшен сразу после его закрытия, поскольку никакой другой узел не пытается записать в тот же файл. Однако более важно, чтобы в случае сбоя сервера при обновлении набора пакетов клиент знал, какие данные еще не были записаны на диск сервера, чтобы он мог повторить попытку, когда сервер снова заработает. При использовании параметра «асинхронный» этот сценарий может привести к потере данных (поскольку сервер лжет клиенту о сбросе данных на диск), в то время как отключение функции «закрыть открытие» (и использование «синхронизации» вместо «асинхронного») должно теоретически обеспечивают такое же преимущество в производительности без потенциальной потери данных (поскольку несколько файлов, записываемых в файл, будут буферизированы и сброшены на сервер вместе). Сервер и другие клиенты увидят немного устаревшее представление файловой системы (на пару секунд). Мне это кажется разумным.
Проще говоря, async выполняет буферизацию на стороне сервера, что значительно ускоряет работу. Я ожидаю, что «nocto» будет выполнять буферизацию на стороне клиента с аналогичным увеличением скорости за счет некоторого отставания в данных, появляющихся на других клиентах.
Из нфс (5) страница руководства:
Если
nocto
Если указан параметр, клиент использует нестандартную эвристику, чтобы определить, когда файлы на сервере были изменены.Используя
nocto
Параметр может повысить производительность монтирования только для чтения, но его следует использовать только в том случае, если данные на сервере изменяются только время от времени. В разделе СОВМЕСТНОСТЬ ДАННЫХ И МЕТАДАННЫХ более подробно обсуждается поведение этой опции.