我知道:
虚拟内存分为用户空间和内核空间,并映射到物理内存。当用户进程访问文件时,内核会将文件缓存到内存中,然后再授予进程访问权限(页面缓存)。
然而
page cache的内存空间会受到内核空间的限制吗?或者除了linux中的配置之外,还有什么会限制页面缓存大小?
答案1
页缓存存储在 RAM 中。原则上可以占满整个物理内存。之所以没有,是因为内存还用于其他目的。
“匿名”(交换支持)内存分配与页面缓存的文件支持分配竞争。两者通过内存管理代码来平衡。内存管理的具体行为极其复杂。当没有可用 RAM 用于新页面分配时,Linux 将选择是否逐出旧的交换支持页面或旧的文件支持页面。可以使用配置值来调整此选择的平衡vm.swappiness
。
Linux 支持的一些体系结构缺乏虚拟地址空间(只有 32 位甚至 31 位:-)。这确实不是限制页面缓存的大小。页缓存被显式写入以支持使用临时虚拟映射。查看主要来源:https://www.kernel.org/doc/html/latest/vm/highmem.html
内存的其他用途是
不可驱逐的非缓存分配。例如内核代码。这些分配还包括使用 进行的内核内分配
kmalloc()
,这些分配(大部分?)显示为“slab”分配。还有其他类型。不可避免的内存分配的一个例子是内核网络缓冲区,它总体上会变得非常大。
“水印”内存。这是保留的,以便在压力下在内存管理方面取得进展。例如,我相信当达到水印时可能会使用这些保留,并且需要一些内存来写入旧的匿名页面进行交换,为其他东西腾出空间。通常,保留量可能是内存的 1-3%(在较大的系统上会更少)。 我的系统上的“水印”内存预留有多大? 在小型系统上,这一比例可能高达 3%,这与“透明大页面”有关。