Включает ли сеть копирование файла в общий ресурс 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?