Linux 内存容量饱和和小页面错误

Linux 内存容量饱和和小页面错误,linux,performance,virtual-memory,perf,page-fault,Linux,Performance,Virtual Memory,Perf,Page Fault,书中提到 目标是衡量内存容量饱和程度——进程驱动系统超出其能力(并导致分页/交换)的程度。[…]另一个可能达到类似目标的指标是进程的次要故障率,可以从/proc/PID/stat中查看 我不确定我是否理解小故障与内存饱和有什么关系 引用维基百科作为参考 如果在产生故障时页面已加载到内存中,但未在内存管理单元中标记为已加载到内存中,则称之为次要或软页面故障 我认为这本书所指的是以下操作系统行为,这些行为可能会使软页面错误随着内存压力的增加而增加。但软页面错误还有其他原因(使用mmap(MAP\u匿

书中提到

目标是衡量内存容量饱和程度——进程驱动系统超出其能力(并导致分页/交换)的程度。[…]另一个可能达到类似目标的指标是进程的次要故障率,可以从/proc/PID/stat中查看

我不确定我是否理解小故障与内存饱和有什么关系

引用维基百科作为参考

如果在产生故障时页面已加载到内存中,但未在内存管理单元中标记为已加载到内存中,则称之为次要或软页面故障

我认为这本书所指的是以下操作系统行为,这些行为可能会使软页面错误随着内存压力的增加而增加。但软页面错误还有其他原因(使用
mmap(MAP\u匿名)分配新页面)
然后再次释放它们;新页面的每一次第一次触碰都会导致一个软页面错误,尽管在迭代新的大分配时,一组连续页面的错误可以将其减少到每N个页面中的一个错误(对于一些小的N个页面)


当接近内存压力限制时,Linux(与许多其他操作系统一样)将在HW页面表中解连线一个页面,以查看是否很快发生软页面错误。如果没有,那么它实际上可能会从内存1中删除该页

但是,如果它在被逐出之前发生了软页面错误,内核只需将它连接回页面表,就可以保存硬页面错误。(以及首先写入的I/O。)


脚注1:如果脏,则将其写入磁盘,如果不是匿名的,则在交换空间或文件备份映射中写入;否则就把它扔了。内核可以启动这个磁盘I/O,同时等待看它是否再次出现故障;IDK如果Linux能做到这一点或不能做到这一点。

你所说的“取消链接”是什么意思?只需设置一个位,使故障转移到操作系统,这样它就可以知道仍然需要页面?@Noah:是的,将PTE设置为“无效”(不存在),并运行
invlpg
(可能还需要TLB分解,以使其在其他内核上无效)。在Unix中(通常情况下),
mmap
将内存逻辑映射到文件(或通过交换空间进行匿名备份),但该逻辑映射当前是否在硬件页表中“连接”取决于操作系统。“wire”是一个方便的术语,至少在某些操作系统中使用。在Linux中,内存分配通常是惰性的<默认情况下,除非使用
MAP\u POPULATE
,否则code>mmap不会连接新页面。所以准备软故障状态并不是唯一的。你们有关于“故障周围”的文档吗。我在关键字上找不到多个a?是不是像
MADV_SEQUENTIAL
+
MADV_WILLNEED
那样,即P页上的错误将为[P,P+N]创建映射?@Noah:是的,没错。当您在一页上出错时,请将周围(可用?)页连接起来
MADV_SEQUENTIAL
增加了故障的倾向,或者增加了区域的大小,但我认为默认情况下已经这样做了,尤其是对于文件备份映射。(例如,当内核注意到顺序访问模式时,使用mmap读取文件,这甚至可能发生在可执行文件或库中的代码中。)