文献杂谈RAMpage 内存检测器

Posted Jia ming

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文献杂谈RAMpage 内存检测器相关的知识,希望对你有一定的参考价值。

[1]王小强. MEMDOG:一种基于Linux的在线内存检测器[D].兰州大学,2017.
[2]H. Schirmeier, J. Neuhalfen, I. Korb, O. Spinczyk and M. Engel, “RAMpage: Graceful Degradation Management for Memory Errors in Commodity Linux Servers,” 2011 IEEE 17th Pacific Rim International Symposium on Dependable Computing, 2011, pp. 89-98, doi: 10.1109/PRDC.2011.20.

RAMpage

RAMpage 的简单理解。RAMpage 是基于x86-64的商用Linux服务器的在线内存测试架构,能够检测内存错误并隔离影响的页面。RAMpage方法不需要停机,允许用户选择内存测试频率和测试方法。内存测试程序在用户空间中运行,只有物理内存的分配和性能退化的处理由内核模块提供。

性能退化的处理的理解。在多处理器中CPU的迁移;在多内存条系统中,bank迁移;在网络链路中的路由表更新。

Linux本身所提供的内存测试方法。Linux 实现了几个相互冗余的框架,能够处理硬件错误和不断变化的系统配置:

  1. EDAC:记录ECC错误并重新测试受影响的存储单元,PCI奇偶校验错误时,可以重复受影响的I/O传输;
  2. Memory hotplugging;
  3. hwpoison:适合的内存测试器,该框架可以终止与出错页面相关联的所有进程,组织进一步分配,可以删除内存页,提供了新的分配页面方法;

内存测试方法。[6-10]

RAMpage的内存覆盖范围。RAMpage 测试框架只能对能够写入的内存(未被内核或其它应用程序使用)进行破坏性写入测试。现代类Unix系统倾向于将几乎所有的物理内存都用于缓冲区缓存和VM缓存。不能对系统中所有的物理内存进行检测:I/O设备中的DMA缓冲区是由设备驱动程序分配给外围设备配置中的特定物理地址、内核所保留的内存。

RAMpage的内核模块和用户模块。在内核模式中保留尽量少的功能(释放和分配物理内存、禁用待检测物理页的cache),用户空间实现了绝大多数功能(被测试的页面需要用户使用系统调用请求,请求和映射物理页、将好的内存返回、标记坏的内存)。用户空间组件本身并不会执行内存测试,而是设计一个灵活的内存测试插件,该插件确定要测试的物理页数量并执行特定测试。测试程序只会尽可能多地进行测试,但是不能保证其每次覆盖大量的物理内存,只会测试总物理内存中的一小部分,否则会导致系统性能的恶劣下降。

  1. 内核模块:物理页面分配、释放、隔离。
  2. 用户空间:内存测试组件进程。

在用户空间的测试组件中,循环进行测试,每次测试都会请求一组物理页面,由特定的内存测试插件进行测试。请求的页面号被传递给内核模块,该模块获得所有请求的页面。

RAMpage 处理过程。将请求的页面号列表传递给内核模块(1),该模块从内核Frame claimer中获得所请求的页面,并将成功声明的页面列表返回给测试人员(2),测试人员使用标准的mmap系统调用将成功请求的页面映射到其虚拟地址空间。测试人员将页面号列表传递给实现特定测试算法(b)的内存测试插件。测试完成后,测试人员从测试插件获得一个结果列表,该列表指示测试结果:成功检测与检测到错误©。成功测试的页面随后使用munmap系统调用解除分配,而包含检测到错误的页面被传递给内核,标记为坏的,以免进一步分配。

ioctl 是设备驱动程序中设备控制接口函数,一个字符设备驱动通常会实现设备打开、关闭、读、写等功能,在一些需要细分的情境下,如果需要扩展新的功能,通常以增设 ioctl() 命令的方式实现。

RAMpage 是由德国多特蒙德工业大学计算机科学学院的 Horst Schirmeier 所在的团队实现的 Linux 平台上的在线内存检测器,由于其检测内存的操作实现在用户空间,因此本文将 RAMpage 视为用户空间的在线内存检测器。RAMpage 作为 Linux 系统中的一个进程与 Linux 系统同时运行,它包括内核空间和用户空间两个部分。内核空间负责向操作系统申请内存,然后将申请到的内存提供给用户空间部分以进行检测。这样做的原因是内核空间部分具有比用户空间部分更高的优先级,可以获取到用户空间不能获取的内存。用户空间部分将内核空间部分获取的内存映射到自己的虚拟地址空间中,然后采用特定的内存检测算法进行检测。 值得一提的是 RAMpage 实现为一个内存检测框架,使得软件层面实现的内存检测算法可以作为一个插件轻易的整合到整个系统中。RAMpage 是一个开源软件。

在线内存检测机制

在线内存检测机制是可以与操作系统同时运行的机制,它不会对其他程序使用的内存造成破坏。这些机制可以提前检测空闲内存,防止已经发生错误的空闲内存将来被使用到,这是一种主动预防错误的方式,尽量避免操作系统和应用程序受到内存错误的影响。

  1. 采用什么检测算法?

采用一种“破坏式”的内存检测算法”。首先向待检测的内存中写入数据,然后再从这块内存中将数据读出,如果读出的数据与写入的数据一致,就认为这块内存中没有发生错误,否则就认为这块内存中发生了错误。

  1. 如何不影响其它程序的运行?

在线内存检测器只检测它能够获取到的内存。一块内存被一个进程申请得到后,其他进程便不能再使用这块内存,除了内存共享的情况,在线内存检测器在申请内存时就保证了申请到的内存是不会与其他进程所共享的。

  1. 如何尽量多地检测系统中的内存?

根据论文[2]的研究成果,在一个常见的配备了32GB内存的Linux服务器上,有25GB的内存被用来作为系统的缓存,这些缓存包括磁盘缓存以及系统中的其他缓存,再加上正在被进程使用的内存,能够被检测的内存寥寥无几。如果在线内存检测器实现在用户空间,操作系统对应用程序使用内存数量的限制又是另一个障碍。如何检测系统中被缓存使用的内存?利用 Linux 的 hwpoison 子系统提供的机制可以对系统中的缓存进行抖动,将这些内存进行释放,使得后面的内存请求可以得到这些释放的页面。对于正在被其他进程使用的内存,Linux 提供的热插拔模块中的离线机制可以将其释放,使将这些内存中的数据迁移到其他内存中。对于实现在用户空间的内存检测器,如果想突破操作系统对内存申请的限制,需要内核空间代码的帮助,因为操作系统并没有对内核空间申请内存的数量做出限制,这种方式在 RAMpage 中被用到。

RAMpage 处理流程

RAMpage 是在 Linux 平台上实现的一个在线内存检测器,它的基本工作原理是周期性地对系统中所有可以检测地内存进行检测,将检测到包含错误的内存进行隔离,防止这些内存将来被使用到。


RAMpage 包括用户空间和内核空间两个部分,内核空间包括内核补丁和内核模块。用户空间部分地功能包括向内核模块申请内存,对获取的内存进行检测,以及根据检测结果选择释放内存或者将内存进行隔离。用户空间程序通过 mmap 系统调用向内核模块请求内存,即通过 mmap 将内核模块获取的内存映射到用户空间。用户空间的内存检测插件对映射的内存进行检测,之所以被称为内存检测插件,是因为 RAMpage 将内存检测算法部分实现为一个框架,在软件层面实现的内存检测算法可以作为一个插件轻易地整合到这个框架中,极大地增加了 RAMpage 的可扩展性和灵活性,如果检测插件没有发现内存错误,就通过 munmap 系统调用解除内存映射,将内存释放给内核模块,并由内核模块将内存释放给操作系统,如果发现内存错误,用户空间部分会通知内核模块对发生错误的内存进行隔离。

RAMpage 内核补丁部分的主要功能是将内核提供的“解放”正在被使用内存机制的接口暴露给内核模块,供内核模块进行使用。RAMpage 内核补丁导出的机制包括 hwpoison 子系统中的抖动机制和热插拔子系统中的内存迁移机制,分别用来释放被缓存和其他程序占用的内存,从而给内存检测器提供更多可以被检测的内存。


RAMpage 运行在 Linux 内核 3.5 之上,我们已经将其移植到了 Linux 内核 4.4 之上。


当对用户空间实现的内存检测器进行验证时,在读取内存数据时,需要先将内存检测器传递进来的虚拟地址,根据页表转换为物理地址,在读取内存数据时,需要再将该物理地址映射到内核地址空间的某个虚拟地址上,因为此时是内核负责读取数据,而对于实现在内核态的内存检测器,MEI 可以直接使用检测器传递进来的虚拟地址,因为它们都是处于内核地址空间中。

以上是关于文献杂谈RAMpage 内存检测器的主要内容,如果未能解决你的问题,请参考以下文章

Xcode结合Leaks检测内存泄露

高分求助!!!C内存泄露检测问题

Netty源码-内存泄漏检测toLeakAwareBuffer

ios instruments怎么检测内存泄露

delphi 检测内存泄露 工具都有哪些

如何在linux下检测内存泄漏