dd - 了解块大小

时间:2014-02-05 21:39:18

标签: c++ performance nfs dd

我使用“dd”创建测试文件并在HDD之间执行备份。没问题。

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

我想要模拟的典型用例是:

  • 节点X在内存中具有大型数据结构
  • 节点X想要将其写入位于NFS安装目录中的文件

在这种情况下,2D阵列的典型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-&gt;中写入“dd”,而不是从内存中写出变量的应用程序(并使用dd模拟它)。

说“bs”的值比系统PAGE_SIZE更小是没有意义的吗?

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

Interaction between app and NFS/TCP

1 个答案:

答案 0 :(得分:1)

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

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

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

无论如何,如果您正在测试为特定应用程序设置环境,请使用该应用程序进行测试,而不是其他任何内容。性能可能取决于任何通用工具无法重现的特定于应用程序的行为。