1

我使用“dd”来创建测试文件和跨 HDD 执行备份。没问题。

目前,我正在尝试使用它来测试 NFS 传输速率。起初,我改变了块大小(“bs”参数)......但这让我想到,为什么我需要改变这个参数?

我想模拟的一个典型用例是:

  • Node X 在内存中有一个大的数据结构
  • 节点 X 想要将其写入位于 NFS 挂载目录中的文件

在这种情况下,二维数组的典型 C/C++ 代码将是:

FILE *ptr = fopen("path_to_nfs_area", "w");
for (int i = 0; i < data.size(); ++i)
   fwrite(data[i], sizeof(float), width, ptr);
...

所以在这种情况下,我们正在以 32 位增量写入缓冲区(sizeof(float)) - 由于这是一个 FILE 对象,它可能也被缓冲了(也许这不是一件好事,但可能与此无关讨论)。

我很难从“bs”块中的 if->of 写入“dd”跳转到从内存中写出变量的应用程序(并用 dd 模拟)。

将“bs”的值更改为小于系统 PAGE_SIZE 是否有意义?

这是我目前的理解,所以我不明白为什么更改“dd”块大小很重要:

应用程序与 NFS/TCP 之间的交互

4

1 回答 1

1

您可能会在 superuser.com 上得到更好的答案,因为这个问题在这里有点离题。

但请考虑 nfs 共享未安装异步标志的可能性 - 在这种情况下,每次写入都需要由 nfs 服务器确认,然后才能开始下一次写入。因此,与bs=1相比,它们需要大约两倍的时间bs=2,并且它们中的每一个都将比合理的块大小慢得多。

如果在 nfs 挂载上设置了 async 标志,那么您的内核可能会将几个小写合并为一个大写,因此设置的效果bs应该可以忽略不计。

无论如何,如果您正在测试为特定应用程序设置环境,请使用该应用程序进行测试,仅此而已。性能可能取决于很多特定于应用程序的行为,以至于任何通用工具都无法重现。

于 2014-02-05T21:49:06.170 回答