5

采取以下代码片段:

 f = open("/mnt/remoteserver/bar/foo.bin", O_RDONNLY);
 while (true)
 {
       byteseread = read(f, buffer, 1000);
       if (bytesread > 0)
           ProcessBytes(buffer, bytesread);
       else
           break;
  }

如果上面的例子,假设远程文件 foo.bin 是 1MB 并且之前从未被客户端访问过。因此,大约需要 1000 次“读取”来获取整个文件。

此外,假设安装在客户端上的目录的服务器是通过互联网而不是本地的。到客户端的快速带宽,但延迟很长。

是否每个“读取”调用都会调用往返服务器以请求更多数据?或者客户端/服务器协议是否认识到对远程文件的后续读取通常是连续的,因此,在应用程序实际对其进行 read() 调用之前,后续块被下推。因此,后续的读取调用返回更快,因为数据是预取和缓存的。

现代网络文件系统协议(NFS、SMB/Samba 等等?)是否会进行类似的优化。是否有针对互联网进行了优化的网络文件系统协议?

我正在调查一个可能涉及通过 Internet 实施网络文件系统的个人项目。如果可以减少文件 i/o 的往返次数,我感到性能可能会更快。

4

1 回答 1

3

这将非常依赖于协议实现。一般来说,我不认为大多数客户端实现预取,但大多数精明的存储管理员使用大块大小(32+kb 参见 rsize/wsize 挂载选项),这有效地导致了同样的事情。网络文件系统通常也将通过系统缓冲区缓存进行缓存,因此您绝对不会将 read() 调用直接转换为网络 IO。

我的建议是天真地编写程序(或简单的测试用例)并通过 nfsstat 等轻松阅读网络统计信息,然后从那里进行优化。有太多变数无法以任何其他方式得到答案。

我不是专家,但据我所知,NFS4 比旧协议(nfs2、3、cifs)有更多的 WAN 优化,所以我肯定会将它纳入您的组合。也就是说,大多数远程文件系统协议并不是真正为高延迟访问而设计的,这就是为什么我们最终会使用像 S3 这样的系统。

于 2011-03-20T02:31:43.160 回答