探测文件系统块大小

时间:2009-09-29 17:24:02

标签: c io disk

我首先承认这是一个类项目,因为它很明显。我们应该做读取来探测文件系统的块大小。我的问题是,这样做的时间似乎呈线性增长,没有像我期望的那样的步骤。

我按照这样的时间计时:

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

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

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

2 个答案:

答案 0 :(得分:2)

确定文件系统块大小的常用方法是向文件系统询问其块大小是什么。

#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)会试图让你绕过内核的缓冲区缓存(不保证)。

答案 1 :(得分:1)

您可能希望使用系统调用(open()read()write(),...) 直接减少FILE*内容所做缓冲的影响。 此外,您可能希望以某种方式使用同步I / O. 一种方法是使用O_SYNC标志设置打开文件 (或根据ephemient的回复O_DIRECT)。 引用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))或使用S(1)命令在文件上设置chattr属性