采用以下代码片段:
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 次“读取”调用才能获取整个文件。
此外,假设在客户端上安装了目录的服务器是通过互联网而不是本地的。客户端的快速带宽,但延迟时间长。
是否每次“读取”调用都会调用返回服务器的往返请求更多数据?或者客户端/服务器协议(protocol)是否认识到对远程文件的后续读取通常是顺序的,因此,在应用程序实际对其进行 read() 调用之前,后续 block 被下推。因此,后续的读取调用返回速度更快,因为数据是预取和缓存的。
现代网络文件系统协议(protocol)(NFS、SMB/Samba,还有其他协议(protocol)吗?)是否会像这样进行任何优化。是否有针对互联网调整的网络文件系统协议(protocol)具有这样的优化?
我正在调查一个个人项目,该项目可能涉及在 Internet 上实现网络文件系统。我突然想到,如果可以减少文件 i/o 的往返次数,性能可能会更快。
最佳答案
这将非常依赖于协议(protocol)实现。一般来说,我不认为大多数客户端实现预取,但大多数精明的存储管理员使用大块大小(32+kb 请参阅 rsize/wsize 挂载选项),这有效地导致了同样的事情。网络文件系统通常也会通过系统缓冲区缓存进行缓存,因此您绝对不会将 read() 调用直接转换为网络 IO。
我的建议是天真地编写程序(或简单的测试用例)并通过 nfsstat 等轻松读取网络统计信息,然后从那里进行优化。变量太多,无法通过任何其他方式获得答案。
我不是专家,但据我所知,NFS4 比旧协议(protocol)(nfs2、3、cifs)有更多的 WAN 优化,因此我肯定会将其纳入您的组合。也就是说,大多数远程文件系统协议(protocol)并不是真正为高延迟访问而设计的,这就是为什么我们最终会使用像 S3 这样的系统。
关于linux - 网络文件系统是否预取? (或 : Do Internet File System make optimizations to reduce round trips),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5366373/