![选择性清除缓存/缓冲区](https://linux22.com/image/517932/%E9%80%89%E6%8B%A9%E6%80%A7%E6%B8%85%E9%99%A4%E7%BC%93%E5%AD%98%2F%E7%BC%93%E5%86%B2%E5%8C%BA.png)
在 Linux 下,是否可以有选择地清除特定文件系统或文件系统内的文件/目录中的内容。
这可以sync; echo 3 > /proc/sys/vm/drop_caches
通过暂时卸载并重新安装来全局完成,并且对整个文件系统进行操作,但我还没有遇到更细粒度的选项。
我为什么要这样做?如果由于稍后要重复的进程的 I/O 而缓存了一堆块,然后运行一次性(或常规但不频繁)任务,导致一大块数据被缓存(但不足以推出第一批),我可能想告诉内核我不再关心第二批块,这样如果发生第三批 I/O 块,它将被取消,而不是从磁盘加载的第一批 - 因此即将重复的任务不会因一次性任务而减慢下次运行的速度。
或者,有没有办法以这样一种方式启动一个进程,告诉内核“这是一个一次性的,在它完成后不要费力去缓存它接触到的内容”。
这当然可能是我想浪费时间去微观管理一些我应该放手的事情,让内核不受干扰地继续下去……
答案1
Linux 中执行此操作的系统调用是fadvise您可以在其中建议缓存或不缓存不同的文件,还可以建议读取模式的类型(即顺序或随机)。有人在 perl 中为此编写了一个命令行包装器这里。我认为您感兴趣的两个选项是:
-dontneed
Announces the expectation that file content won't be needed in
the near future.
Under Linux 2.6.9, this is known to cause the file content to be
evicted from the buffer-cache immediately.
Note that this option first causes an fsync of the file.
-noreuse
Announces the expectation that file content won't be reused in
the near future.
答案2
为什么要这样做?您可能希望在运行期间缓存数据。运行完成后,随着新请求的到来,缓存的数据将超出内存范围。同时,它将位于未使用的内存中。
执行原始 I/O 可能会将缓冲保留在驱动器内部缓存中。这可能会导致应用程序性能下降,因为您会失去操作系统缓存和随后的速度。当我第一次开始担心相对访问速度时,它大约是 100/1,有利于内存。从那时起,缓存与 I/O 的优势一直在稳步增加。
由于磁盘映像可能会可用,因此任何安全考虑都是没有意义的。