Назад | Перейти на главную страницу

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

Я предполагаю следующие способы скопировать файл в общий ресурс 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?