图片无法显示,请右键点击新窗口打开图片

BiscuitOS 内存管理之分页大专题订阅入口

目录
  • 初识 CLEAR REFS 机制

  • CLEAR REFS 通识知识

    • 文件映射与匿名映射

    • 软脏页 Soft Dirty

    • HiWater-RSS: 峰值 RSS

    • CLEAR REFS 源码分析

  • CLEAR REFS 机制实践

  • CLEAR REFS 机制使用

    • 检测进程里共享库的冷热情况

    • 检测进程指定匿名映射区域的冷热情况

    • 检测进程指定文件映射区域的冷热情况

    • 检测进程指定区域的脏页情况

图片无法显示,请右键点击新窗口打开图片


CLEAR REFS 通识知识

图片无法显示,请右键点击新窗口打开图片

在 Linux 内核里,硬件通过置位页表的 Access 标志位来描述该物理区域被访问过,所谓的访问就是对虚拟内存的读和写操作. 另外在有的架构页表提供了 Soft Dirty 标志位,当对物理区域执行写操作之后,那么硬件会将该标志位置位. 有了这两个标志位,那么可以知道某块物理区域是否被访问过,或者某块物理区域是否被写过,但仅有这个数据还不够,因为只获得这些数据,就类似于获得静态的数据,也就是某个物理区域最终有没有被访问过。但现实对内存访问监听时,更希望获得某块物理区域访问的频率,这样就可以知道哪些物理区域是冷页,以及哪些区域是热页, 有了这些数据之后可以进行更高效的内存管理,例如将冷页交换到 SWAP Space,或者进行压缩.

图片无法显示,请右键点击新窗口打开图片

CLEAR REFS 机制提供了对指定进程所有虚拟内存区域对应的 Access 标志位Soft-Dirty 标志位物理页 PG_referenced 标志、以及进程的 hiwater_rss. 当清除指定的标志之后,然后经过一段时间之后通过其他接口查看这些标志位是否置位,那么就可以获得某段时间某个标志位置位情况,最后在循环往复就可以知道某块虚拟区域的冷热情况. 通常 CLEAR REFS 机制会与 SMAPS 机制获取某段区域的冷热情况,也可以配合 PAGEMAP 机制获得指定 4K/2M 虚拟内存的冷热情况,另外也可以配合 “/proc/pid/status” 获得进程的 RSS 峰值.

# 清除进程所有虚拟区域的 Access/PG_reference
# DEFINE: CLEAR_REFS_ALL 1
echo 1 > /proc/PID/clear_refs

# 清除进程所有匿名映射区域的 Access/PG_reference
# DEFINE: CLEAR_REFS_ANON 2
echo 2 > /proc/PID/clear_refs

# 清除进程所有文件映射区域的 Access/PG_reference
# DEFINE: CLEAR_REFS_MAPPED 3
echo 3 > /proc/PID/clear_refs

# 清除进程所有软脏页标志
# DEFINE: CLEAR_REFS_SOFT_DIRTY 4
echo 4 > /proc/PID/clear_refs

# 重置进程的 Hiwater_rss
# DEFINE: CLEAR_REFS_MM_HIWATER_RSS 5
echo 5 > /proc/PID/clear_refs

文件映射和匿名映射

图片无法显示,请右键点击新窗口打开图片

在 Linux 用户空间,虚拟内存可以通过两种映射方式与物理内存建立映射关系,第一种是 File-Mapping 文件映射,其可以将文件内容映射到用户空间,虚拟内存和磁盘文件中间通过 Page CACHE 进行数据中转,因此可以像普通虚拟内存一样访问文件; 另外一种是 Anonymous-Mapping 匿名映射, 用于将用户空间虚拟内存映射到物理内存上,以满足进程对内存的需求,例如堆(Heap)内存、堆栈(Stack)内存、以及 MMAP 内存等。

图片无法显示,请右键点击新窗口打开图片

图片无法显示,请右键点击新窗口打开图片

BiscuitOS 内存管理之分页大专题订阅入口

图片无法显示,请右键点击新窗口打开图片