Включает ли сеть копирование файла в общий ресурс NFS?

Я предполагаю следующие способы копирования файла с общей папки NFS:

Процесс 1:

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

Следовательно, чтение с локального жесткого диска и запись в NFS практически идентичны чтению из NFS и записи в NFS.

На первом этапе, если кеш уже существует, чтение может быть очень быстрым.

Процесс 2:

  • Клиент отправляет запрос на инициирование операции копирования данных на сервер NFS вместе с местом, откуда он должен прочитать и куда он должен записать (кажется, что это не так).
  • Сервер делает все остальное, операции чтения-записи, используя свою собственную память.

Следовательно, сеть не участвует. И, следовательно, может иметь лучшую производительность (если нет задержки в конце сети), но это, вероятно, не так.

Пожалуйста, поправьте меня в любой момент, если я ошибаюсь.

Кроме того, задействует ли память при каждой операции, я имею в виду, когда она отправляет данные по сети, данные сначала отправляются в память (буфер данных) с диска, а затем из памяти (буфер данных) в буфер данных (на другой стороне сеть), но не из буфера данных на диск на другой стороне сети, верно?

2 ответа

Решение

В NFSv4.2 есть операция разгрузки-копирования, которая может выполнять копирование с сервера на сервер без передачи данных через клиента. Современные ядра Linux (> 3,13?) Поддерживают это. Я не знаю о других серверах.

ОБНОВИТЬ

В Linux версии 4.7 серверная копия не поддерживается серверами linux https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/fs/nfsd/nfs4xdr.c?id=refs/tags/v4.7-rc6#n1797

"copy a file" операция не является базовой операцией файловой системы, такой как read, write, open, closeи подобные операции. Смотрите эту страницу для хорошего объяснения операций, которые файловая система должна поддерживать.

И это все файловые системы - будь то ext4, btrfs, или же nfsv4,

Обратите внимание, что нет способа узнать, почему процесс открывает файл A, открывает файл B, читает из файла A, затем записывает в файл B. Таким образом, в общем случае нет способа "замкнуть накоротко" и оптимизировать копирование файла так, что данные не должны пересекать сеть дважды в случае, когда файл A и файл B находятся в файловых системах NFS, даже если они совместно используются с одного и того же сервера NFS.

Многие операционные системы предоставляют системные вызовы, такие какsendfile()которые эффективно копируют данные, устраняя необходимость копировать данные в пространство пользователя и из него, и теоретически это может быть сделано на уровне файловой системы для копирования файлов, но даже в этом случае должны быть ограничения, аналогичные ограничениям на rename() операция - такая гипотетическая copyfile() Вероятно, операция должна быть ограничена замыканием только тех копий в пределах одной файловой системы. В противном случае будет сложный беспорядок - что делать, если файл A и файл B находятся на одном и том же NFS-сервере, клиент хочет скопировать данные с одного на другой, но файл A находится в файловой системе ext4, а файл B включен другая файловая система XFS?

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