网络文件系统是不是预取? (或者:互联网文件系统是不是进行优化以减少往返)
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 这样的系统的原因。
【讨论】:
谢谢。我希望对此的讨论可以更大,但我同意你的建议开始:“天真地编写你的程序”。然后我会测量性能并稍后进行优化。 是的,很不幸。确实没有很多关于文件系统性能的好信息,尤其是当您进入网络文件系统时。以上是关于网络文件系统是不是预取? (或者:互联网文件系统是不是进行优化以减少往返)的主要内容,如果未能解决你的问题,请参考以下文章