linux - 网络文件系统是否预取? (或 : Do Internet File System make optimizations to reduce round trips)

标签 linux filesystems network-protocols samba nfs

采用以下代码片段:

 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/

相关文章:

c++ - Linux 中的低级 GPIO 端口(树莓派、香蕉)

python在centos上更新到2.7.13

php - Eclipse PDT - 文件系统更改或新的 Composer 自动加载路径会破坏自动加载器

linux - 在 C 中使用 Linux 中的原始套接字进行数据包嗅探

c - 停止等待协议(protocol) - 它如何处理最后一个 ACK​​ 丢弃?

创建一个不可停止的程序

linux - 一次性删除大量文件夹

filesystems - 在负载平衡服务器之间同步 Web 目录

硬盘上的连续空间 - NTFS

c - linux 内核中 skbuff.h 中的 mac 相关函数如何工作?