pet*_*erh 2 linux cache virtual-memory
我有一个包含许多磁盘绑定服务的大型系统。使用块缓存它们可以更好地工作。
除此之外,还有一些备份进程正在运行。
我知道他们应该如何使用块缓存:他们绝对不应该。
备份是通过使用buffer
命令将块设备复制到另一个块设备来进行的。需要任何缓存的可能性几乎为零。
但是,如果备份运行,就会使普通服务变得更糟。给它一个低的值ionice
并没有太大帮助 - 问题不在于它的 IO 优先级,而在于它用不需要的数据覆盖了块缓存。
我可以以某种方式设置此buffer
命令以完全不使用块缓存吗?
如果重要的话,它会将 lvm 卷复制到另一个卷。
我已经找到了nocache
完成该任务的工具。
一般来说,这在 Linux 中是不可能的:没有这样的选项、标志或任何可以为进程设置的东西。
但是,posix_fadvise(...)
当需要连续读/写操作时,该调用可用于通知块/缓冲区高速缓存子系统。APOSIX_FADV_DONTNEED
向内核提供“额外信息”,它不应该缓存它们,因为它不会在不久的将来被重新读取。
nocache
posix_fadvise(...)
通过环境变量注入的共享库拦截所有重要的文件操作LD_PRELOAD
。
正如其名称所示,这只是一个建议;然而,我的实验显示了巨大的性能改进(实际上,其他重要任务可以与后台备份并行运行,而最终用户不会出现明显的性能下降)。