Я предполагаю следующие способы скопировать файл в общий ресурс NFS:
Процесс 1:
Следовательно, чтение с локального жесткого диска и запись в NFS почти такие же, как чтение из NFS и запись в 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?