网络文件系统是不是预取? (或者:互联网文件系统是不是进行优化以减少往返)

Posted

技术标签:

【中文标题】网络文件系统是不是预取? (或者:互联网文件系统是不是进行优化以减少往返)【英文标题】:Do network file systems pre-fetch ? (Or: Do Internet File System make optimizations to reduce round trips)网络文件系统是否预取? (或者:互联网文件系统是否进行优化以减少往返) 【发布时间】:2011-03-20 02:25:37 【问题描述】:

获取以下代码片段:

 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 的往返次数,我感到性能可能会更快。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

谢谢。我希望对此的讨论可以更大,但我同意你的建议开始:“天真地编写你的程序”。然后我会测量性能并稍后进行优化。 是的,很不幸。确实没有很多关于文件系统性能的好信息,尤其是当您进入网络文件系统时。

以上是关于网络文件系统是不是预取? (或者:互联网文件系统是不是进行优化以减少往返)的主要内容,如果未能解决你的问题,请参考以下文章

尽管浏览器预取/缓存,如何判断文件是不是真的被下载和保存?

Linux学习 ---- 系统网络配置

如何验证我的硬件预取器是不是已禁用

NFS(网络文件系统)

计算机网络—— 应用层(45):域名系统DNS文件传送协议FTP

GlusterFS 分布式文件系统