如何从Linux系统caching中驱逐文件?

运行性能testing时,文件系统caching命中或失败可能会显着影响testing结果。 所以一般在运行这样的testing之前使用的文件被从系统caching中逐出。 如何在Linux上做到这一点?

澄清:如果可能,解决scheme不应该需要root权限。

作为超级用户,您可以执行以下操作:

释放页面缓存:

  • echo 1> / proc / sys / vm / drop_caches

释放dentries和inode:

  • echo 2> / proc / sys / vm / drop_caches

要释放页面缓存,dentries和inode:

  • echo 3> / proc / sys / vm / drop_caches

这个操作不会“丢失”任何数据(在数据被删除之前缓存被写入到磁盘),但是为了确保所有的缓存都被清除,你应该首先同步。 例如,如果你运行所有的缓存应该被清除

sync; echo 3 > /proc/sys/vm/drop_caches 

正如我所说,只有一个超级用户(root)可以这样做。

哈,我有答案:

 #include <unistd.h> #include <fcntl.h> int main(int argc, char *argv[]) { int fd; fd = open(argv[1], O_RDONLY); fdatasync(fd); posix_fadvise(fd, 0,0,POSIX_FADV_DONTNEED); close(fd); return 0; } 

这是从http://insights.oetiker.ch/linux/fadvise.html

Eric Wong有一个命令行实用程序,可以很容易地调用posix_fadvise:

http://git.bogomips.org/cgit/pcu.git/tree/README

这就像那么简单

 $ pcu-fadvise -a dontneed filename-to-evict 

关于使用O_DIRECT:这会以另一种方式干扰结果。 内核将尝试将文件系统数据直接DMA(DMA)到你的read()缓冲区,所以它可以传递给你的应用程序,而不需要额外的拷贝。 如果没有O_DIRECT,内核会将文件数据DMA写入页面缓存,并将其从页面缓存复制到您的read()缓冲区。

这很好,如果你的应用程序真的要在生产中使用O_DIRECT。 如果使用O_DIRECT运行性能测试,然后删除O_DIRECT进行生产,则性能测试将是不切实际的。

如果你可以把测试数据放在一个单独的文件系统中,那么重新安装文件系统将会给你空的缓存。

如果使用“user”选项在/ etc / fstab中列出测试文件系统,则可以在不经超级用户