使用以下代码snippit:
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次调用“读取”来获取整个文件。
此外,假设客户端上安装目录的服务器是通过Internet而不是本地服务器。为客户端提供快速带宽,但延迟时间很长。
每次“读取”调用是否都会调用往返服务器的请求以获取更多数据?或者客户端/服务器协议是否识别出对远程文件的后续读取通常是顺序的,因此,在应用程序实际对其进行read()调用之前,会下推后续块。因此,后续的读取调用返回得更快,因为数据是预先提取和缓存的。
现代网络文件系统协议(NFS,SMB / Samba,还是其他任何协议?)进行这样的优化。是否有针对互联网调整的网络文件系统协议具有这样的优化?
我正在调查可能涉及通过互联网实施网络文件系统的个人项目。令我感到震惊的是,如果可以减少文件i / o的往返次数,性能可能会更快。
答案 0 :(得分:3)
这将取决于协议实现。一般来说,我不认为大多数客户端实现预取,但大多数精明的存储管理员使用大块大小(32 + kb请参阅rsize / wsize挂载选项),这实际上导致相同的事情。网络文件系统通常也会通过系统缓冲区缓存进行缓存,因此您绝对不会将read()调用直接转换为网络IO。
我的建议是天真地编写程序(或简单的测试用例),并通过nfsstat等方便地阅读网络统计数据,然后从那里进行优化。有太多的变量可以用其他方式得到答案。
我不是专家,但据我所知,NFS4比旧协议(nfs2,3,cifs)有更多的WAN优化,所以我肯定会把它考虑在你的混音中。也就是说,大多数远程文件系统协议并非真正设计用于高延迟访问,这就是我们最终使用像S3这样的系统的原因。