我的目录使用 tmpfs /tmp
。/tmp
在换出应用程序正在使用的任何内容之前,如何让计算机决定换出其中的文件?
/tmp
基本上,与进程使用的内存相比,内部文件应该具有更高的交换性。
看来这个答案https://unix.stackexchange.com/a/90337/56970很有意义,但是您无法更改单个目录的交换性。我虽然知道 cgroup,但我没有看到任何方法可以将 tmp 变成 cgroup?
答案1
如果一切顺利,您的内核应该决定自行“做正确的事情”。当存在内存压力时,它使用大量奇特的启发式方法来决定交换哪些内容以及保留哪些内容。这些启发式方法是由在内存管理方面拥有丰富经验的真正聪明的人精心构建的,并且已经足够好,很难改进。
内核使用类似这样的组合来决定交换什么:
- 最近内存的使用情况。
- 内存自映射后是否已被修改。因此,例如,共享库将被推出到堆内存之前,因为堆内存是脏的,需要写入交换区,而共享库映射内存可以从磁盘上的原始文件再次加载,以备再次需要时使用。 ,所以不需要写那些页面来交换。在这里您应该意识到
tmpfs
内存总是脏的(除非它是一个充满零的新页面),因为它没有任何东西支持。 - 提示来自
mprotect()
. - 可能还有更多。
简短的回答:不,您不能直接覆盖内核有关如何管理内存的决定。
答案2
cgroup 旨在控制应用程序,而不是文件系统。您想要的是 sysctl 或 mount 选项,因为它适用于整个文件系统。不幸的是,这两个功能似乎都不是针对这个问题而创建的。这可能是因为这样的问题非常独特。
要解决此问题,您可以尝试编写一个 cronjob,例如:
*/5 * * * * find /tmp -type f -exec cat {} \; >/dev/null 2>&1
这应该强制内核读取所有文件,从而强制将页面交换回内存。
也就是说,工作负载应用程序经常访问的文件基本上与我们在 cronjob 中执行的操作相同(并且仅针对其实际使用的特定文件,而不是整个挂载)。我看不出这样做有什么好处。
这里的实际目标是什么?