在NTFS上读取文件时如何清除C中的驱动器缓存

时间:2013-03-05 11:59:22

标签: c linux caching benchmarking ntfs

我在Linux操作系统上使用C进行驱动器基准测试,我在NTFS文件系统上遇到了问题。下面是一些编写许多新文件的代码:

for ( int i = 0; i < 100; ++i )
{
    fd = open(nextfile, O_WRONLY | O_DIRECT | O_SYNC | O_CREAT );
    write(fd, buff, size);
    fsync(fd);
    close(fd);
}

并且工作正常,但是当我想要读取所有创建的文件时,fsync函数似乎不起作用。下面是一些读取所有文件的代码:

for ( int i = 0; i < 100; ++i )
{
    fd = open(nextfile, O_RDONLY | O_DIRECT | O_SYNC);
    read(fd, buff, size);
    fsync(fd);
    close(fd);
}

在测试我的旧pendrive时,我的写入时间为4MB / s,读取时为267MB / s,这显然不正确,但在测试ext4文件系统时,读取时间是正确的。我该怎么办?

2 个答案:

答案 0 :(得分:1)

在执行读取测试之前卸载文件系统是确保不缓存任何内容的常用方法。读取例程中的fsync()大多没有意义(但可能导致文件访问时间戳刷新,具体取决于挂载选项)。我假设提供的代码只是一个草图,但我希望你的实际代码是测试open和read的返回值。

答案 1 :(得分:1)

问题可以通过在写循环后添加以下代码来解决。

int fd;
char* data = "3";

sync();
fd = open("/proc/sys/vm/drop_caches", O_WRONLY);
write(fd, data, sizeof(char));
close(fd);