【问题标题】:Probing for filesystem block size探测文件系统块大小
【发布时间】:2010-12-02 09:48:59
【问题描述】:

我首先要承认这是一个课堂项目,因为它非常明显。我们应该进行读取以探测文件系统的块大小。我的问题是执行此操作所需的时间似乎呈线性增加,没有像我预期的那样采取任何步骤。

我是这样安排阅读时间的:

double startTime = getticks();
read = fread(x, 1, toRead, fp);
double endTime = getticks();

getticks 使用 rdtsc 指令的地方。恐怕有缓存/预取导致读取在 fread 期间不需要时间。我尝试在每次执行我的程序之间创建一个随机文件,但这并不能缓解我的问题。

准确测量从磁盘读取所用时间的最佳方法是什么?我很确定我的块大小是 4096,但是我怎样才能获得支持它的数据呢?

【问题讨论】:

  • 你想要一些东西来给出块大小,或者关于改进你的实验以从时间猜测块大小的建议吗?
  • 我想我正在寻找实验帮助。我无法让 C 用 I/O 做我想做的事。
  • 查看 fcntl(.., F_NOCACHE, ..) 以完全禁用缓存。

标签: c io disk


【解决方案1】:

确定文件系统块大小的常用方法是询问文件系统它的块大小是多少。

#include <sys/statvfs.h>
#include <stdio.h>
int main() {
    struct statvfs fs_stat;
    statvfs(".", &fs_stat);
    printf("%lu\n", fs_stat.f_bsize);
}

但如果你真的想要,open(…,…|O_DIRECT)posix_fadvise(…,…,…,POSIX_FADV_DONTNEED) 会尝试让你绕过内核的缓冲区缓存(不保证)。

【讨论】:

  • 谢谢,我需要生成一个图表,我可以指向指示块边界的东西。如果它对我有用,我会尝试并接受它。
【解决方案2】:

您可能想要使用系统调用(open()read()write()、...) 直接减少由FILE* 东西完成的缓冲的影响。 此外,您可能希望以某种方式使用同步 I/O。 一种方法是打开带有O_SYNC 标志的文件 (或 O_DIRECT 根据 ehemient 的回复)。 引用 Linux open(2) 手册页:

   O_SYNC The file is opened for synchronous I/O.  Any  write(2)s  on  the
          resulting  file  descriptor will block the calling process until
          the data has been physically written to the underlying hardware.
          But see NOTES below.

另一个选项是使用-o sync 挂载文件系统(请参阅mount(8))或使用chattr(1) 命令在文件上设置S 属性。

【讨论】:

    猜你喜欢
    • 2013-12-05
    • 2023-03-29
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 2019-01-25
    相关资源
    最近更新 更多