如何关闭单个进程的块缓存?

pet*_*erh 2 linux cache virtual-memory

我有一个包含许多磁盘绑定服务的大型系统。使用块缓存它们可以更好地工作。

除此之外,还有一些备份进程正在运行。

我知道他们应该如何使用块缓存:他们绝对不应该。

备份是通过使用buffer命令将块设备复制到另一个块设备来进行的。需要任何缓存的可能性几乎为零。

但是,如果备份运行,就会使普通服务变得更糟。给它一个低的值ionice并没有太大帮助 - 问题不在于它的 IO 优先级,而在于它用不需要的数据覆盖了块缓存。

我可以以某种方式设置此buffer命令以完全不使用块缓存吗?

如果重要的话,它会将 lvm 卷复制到另一个卷。

pet*_*erh 5

我已经找到了nocache完成该任务的工具。

一般来说,这在 Linux 中是不可能的:没有这样的选项、标志或任何可以为进程设置的东西

但是,posix_fadvise(...)当需要连续读/写操作时,该调用可用于通知块/缓冲区高速缓存子系统。APOSIX_FADV_DONTNEED向内核提供“额外信息”,它不应该缓存它们,因为它不会在不久的将来被重新读取。

nocacheposix_fadvise(...)通过环境变量注入的共享库拦截所有重要的文件操作LD_PRELOAD

正如其名称所示,这只是一个建议;然而,我的实验显示了巨大的性能改进(实际上,其他重要任务可以与后台备份并行运行,而最终用户不会出现明显的性能下降)。