文件支持、锁定共享内存和磁盘交互

文件支持、锁定共享内存和磁盘交互

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

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

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

答案1

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

loghead = mmap(NULL, heritage.vsl_size,
    PROT_READ|PROT_WRITE,
    MAP_HASSEMAPHORE | MAP_NOSYNC | MAP_SHARED,
    heritage.vsl_fd, 0);

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

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

相关内容