/proc/meminfo
我的笔记本电脑通常在free -w -h
大约 8GB 的 RAM 中使用大约 256MB 的内存(算作“缓冲区”)运行。
我对内存使用感兴趣。有时我会因为使用太多而陷入麻烦。我并不担心~256MB“缓冲区”的使用,但我很好奇。
我已经弄清楚哪些软件使用了它,并且该用法似乎(几乎完全?)不必要 8-)。我安装了两个 ext4 文件系统,每个文件系统的日志大小为 128MB。 ~256MB“缓冲区”使用基本上是来自 ext4 日志的所有缓存写入。
我认为没有必要缓存每个文件系统的整个日志文件。 (大多数时候,只有少量的期刊会有“实时数据”!我没有使用data=journalled
)。我对这种特定的不必要的“缓冲区”用法感兴趣。我知道可能还有其他用途,其中一些可能更必要。例如,据我所知,缓存日志的部分可能很有用做当前保存实时数据。
当我进行调查时,我注意到在较小的系统上“缓冲区”占物理 RAM 的 30%!
我的问题是,当请求内存时,Linux 如何确保丢弃大量这些不必要的“缓冲区”任何其他用途,包括页面缓存?请引用您的信念所依据的证据。
我对历史差异并不特别感兴趣,只对“当前”系统的行为感兴趣。如果您有兴趣,我的笔记本电脑当前运行的是 Fedora 28,内核版本 4.18.16-200.fc28.x86_64。 (或者较小的系统正在运行 Debian 9,内核版本 4.9.0-8-marvell)。
Linux页面缓存的相关细节
与“缓冲区”的行为相比,Cached
我对页面缓存的概念更熟悉。/proc/meminfo
free -w -h
我最近重新阅读了这个主题:Linux 内核中使用哪些页面替换算法来进行操作系统文件缓存?
对未缓存文件页的访问,例如复制未缓存文件时的读取和写入,会缓存在“非活动”LRU 列表中。当从页面缓存回收内存时,内核更喜欢从最近最少使用的“非活动”页面开始。它更喜欢这些而不是“活动”页面,“活动”页面是被访问过多次的页面,即使它们可能更旧。
特别要注意的是,这允许您运行任意大的文件副本,而无需交换所有正在运行的程序。正在运行的程序的所有重要内存页面都位于“活动”列表中,因为重要页面将被多次访问。
这是 Linux 内存管理复杂性的初步近似。我在这里使用了一些模糊的词,比如“喜欢”,因为我不是这些复杂性的专家。
理想情况下,我希望在回收任何页面缓存之前首先回收任何不必要的“缓冲区”。 (如果您将“缓冲区”算作页面缓存的一部分,您应该理解我希望在任何缓存的常规文件之前回收任何不必要的“缓冲区”)。
所以我很好奇。是否会在任何“非活动”页面缓存之前回收不必要的“缓冲区”?或者我只能说它们往往在“活动”页面缓存之前被回收?还是在我们与页面缓存进行比较之前必须解释更多细节?
答案1
这通常会发生,但不是因为有明确的偏好,而是因为他们的访问计数通常很低。内存子系统将进程地址空间中的磁盘块、物理内存和虚拟地址相互映射,缓冲区或高速缓存页与进程分配之间的唯一区别在于是否存在进程映射。
每当出现内存压力时,系统都会逐出上次访问时间最长的内存页,从磁盘上具有最新副本的内存页开始,然后移至存在磁盘映射并且可以写入的内存页,最后它开始通过分配交换空间来创建新的磁盘映射。
在这个系统中,在内存变得紧张之前提前创建交换映射是有益的。当系统空闲时,它可以将一些一段时间内未访问的页面复制到磁盘,但也将它们保留在内存中。
不过,这基本上与磁盘块的缓存页面相同,除了可能导致从进程访问该页面并重置逐出计时器的映射之外。如果进程正在睡眠并且没有工作可做,则删除此页面而不是主动使用的缓存页面通常是更好的选择。
许多缓存仅被访问一次或两次,因此它们在大多数情况下都是被逐出的良好候选者,而不需要特殊状态。