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