有没有一种方法可以禁用系统(Unix)对磁盘文件的缓存?

5

我目前正在进行一项关于磁盘文件操作(可能是某种数据库管理系统)中b+树和普通平衡树性能测试的工作,使用C语言编写。预计b+树比平衡二叉搜索树更快,因为它执行的磁盘I/O操作较少。但是在进行了一些测试后,我发现系统正在对磁盘文件进行缓存,文件已完全保存在内存中(我的内存大小为32GB)!由于不会执行任何磁盘I/O操作,因此b+树绝不可能比平衡二叉搜索树更快。所以我想知道是否有一种方法可以禁用系统缓存,以便使b+树在性能上获胜?我已经尝试使用O_DIRECT|O_SYNC打开文件:

int fd = Open("sb.dat", O_DIRECT|O_SYNC|O_CREAT|O_RDWR, S_IRWXU|S_IRWXG|S_IRWXO);

但是似乎没有起作用。

这里是由getrusage()提供的一些信息。

页面回收:1359821

页面错误:9


为什么要关闭缓存进行比较呢?这样才能得到真实的结果。如果你想看看它在更多任务或更大内存负载下的表现,可以运行一些并行基准测试,或编写一个“内存消耗器”应用程序来分配并访问该内存(循环执行 - 但请确保您仍有足够的CPU容量来运行系统)。 - Mats Petersson
O_DIRECT|O_SYNC|O_CREAT|O_RDWR 仍然无法工作 :( - Clann Chen
消耗所有32GB物理内存并不容易,而且这是一个由实验室所有成员共享的服务器,这样做并不好。 - Clann Chen
1个回答

2
据我所知,即使您使用了O_DIRECT,内核仍会缓存来自磁盘的块。您可以清除内核缓存,但这仅在第一次起作用。
echo 3 > /proc/sys/vm/drop_caches

@ClannChen 在每个 I/O 之前你可以调用它。 - iabdalkader

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接