文件备份、锁定共享内存和磁盘交互

use*_*311 7 shared-memory mmap linux-kernel

Varnish 是一种 HTTP 加速器,它使用一个 ~80MB 的文件支持的 SHM 日志,该日志被 mlock() 输入到内存中。该光油文档建议存储在tmpfs上的文件,以避免不必要的磁盘访问。但是,如果整个文件被锁定到内存中,Linux 内核是否仍会写入备份文件?

我尝试使用 inotify 和 fatrace 来监视这一点,但是由于这种交互可能发生在内核内部,因此这些工具看不到文件活动。文件或文件系统显然发生了某种更新,因为使用 ls 监视后备文件显示文件时间发生变化,而 sha1sum 显示内容正在发生变化,但这实际上涉及磁盘访问还是全部发生在记忆?

基本上,我试图避免必须执行 tmpfs 解决方法,因为使用 SHM 来支持 SHM 似乎是解决可能不存在的问题的丑陋解决方法。

der*_*ert 4

Varnish 似乎使用普通的内存映射文件作为其共享内存(而不是 POSIX 等shm_open)。从源头来看

loghead = mmap(NULL, heritage.vsl_size,
    PROT_READ|PROT_WRITE,
    MAP_HASSEMAPHORE | MAP_NOSYNC | MAP_SHARED,
    heritage.vsl_fd, 0);
Run Code Online (Sandbox Code Playgroud)

在 BSD 上,MAP_NOSYNC请求内核不要将共享数据写入磁盘,除非强制(例如,释放内存)。当它也被锁定时,这种情况几乎不会发生。不幸的是,Linux 不支持MAP_NOSYNC.

因此,Linux 最终会定期将脏(已更改)页面从缓存写入磁盘。将缓存放在 tmpfs 上可以避免这种情况。使用 POSIX 或 SysV 共享内存的 Varnish 也是如此(实际上,POSIX 共享内存是在 Linux 上实现的,并在 处安装了 tmpfs /dev/shm,因此使用 tmpfs 应该没问题)。