是否涉及networking在NFS共享内复制文件?

我假设有以下方法来复制一个NFS共享文件:

过程1:

  • 客户端请求从NFS共享复制数据(如果不存在高速caching),并将数据块asynchronous复制到NFS客户端的内存中,然后将其asynchronous发送到NFS文件pipe理器以复制到新位置。
  • NFS文件pipe理器在内存中asynchronous接收数据块并将其写入新位置。
  • 在这个过程中,尽pipe在读取和写入的过程中存在networking,但是由于asynchronous读写,一个整体读写操作的延迟将与整个数据的读写操作的延迟相同。

因此,从本地硬盘读取数据并写入NFS几乎与从NFS读取并写入NFS相同。

在第一步中,如果caching已经存在,那么读取可以很快。

过程2:

  • 客户端向NFS服务器发送启动数据复制操作的请求,以及从哪里读取以及写入的位置(看起来不是这样)。
  • 服务器完成剩下的工作,使用它自己的内存进行读写操作。

因此,没有涉及networking。 因此,可以有更好的性能(除非在networking端没有延迟),但可能不是这样。

如果我错了,请在任何时候纠正我的错误。

另外,内存是否涉及到每一个操作,我的意思是当它通过networking发送数据时,数据首先从磁盘发送到内存(数据缓冲区),然后从内存(数据缓冲区)到数据缓冲区(在另一端networking),但不是从数据缓冲区到networking另一端的磁盘吧?

    NFSv4.2确实有一个卸载 – 复制操作,可以通过客户端进行服务器到服务器的复制,而不用代理数据。 现代的Linux内核(> 3.13?)支持。 我不知道其他服务器。

    UPDATE

    通过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"操作不是readwriteopenclose等类似操作的基本文件系统操作。 请参阅此页面,以获得文件系统必须支持的操作的完整说明 。

    这就是所有的文件系统 – 无论是ext4btrfs还是nfsv4

    请注意,没有办法知道为什么进程打开文件A,打开文件B,从文件A读取,然后写入文件B.因此,通常没有办法“短路”并优化文件的复制即使文件A和文件B都在NFS文件系统上,即使数据是从同一个NFS服务器共享的,数据也不必跨过networking两次。

    许多操作系统确实提供了诸如sendfile()这样的系统调用,它们通过消除将数据复制到用户空间和从用户空间复制数据来有效地复制数据,理论上可以在文件系统级别上进行复制文件,但是甚至那么就必须有类似于rename()操作的限制 – 这种假设的copyfile()操作可能不得不被限制为仅在单个文件系统内短路这些拷贝。 否则会造成一个复杂的混乱 – 如果文件A和文件B在同一个NFS服务器上,客户端要从一个拷贝到另一个,但是文件A在ext4文件系统上并且文件B在另一个XFS文件系统?