论文部分内容阅读
内存系统一直以来是计算机系统的主要瓶颈之一,随着多核时代的来临,“内存墙(Memory Wall)”问题将更加严峻。准确的访存行为分析是进行内存系统研究的基础,而细粒度的访存行为分析(如函数、对象),则对定位程序内部访存瓶颈的来源,指导程序性能优化具有重要意义。 HMTT(Hybrid Memory Trace Toolkit)是软硬件结合的内存监测和分析系统,采用硬件侦听技术收集真实系统上的完整访存请求Trace,DDR3协议兼容,支持长时间监测而几乎不引入开销。但是基于硬件侦听的HMTT与上层应用之间存在语义鸿沟问题,其无法直接感知上层发生的语义事件。目前HMTT还是以粗粒度的进程为基本单位进行访存行为分析(区分来自不同进程的访存请求),而尚不支持进程内部更细粒度的上层语义信息,如将访存请求关联到函数、对象信息等。另外目前HMTT通常用于离线访存行为分析,尚不支持在线分析和指导优化。因此本文的主要工作是对HMTT进行完善,实现低开销的软硬件结合的细粒度函数级和对象级访存行为分析;实现HMTT的在线访存分析和反馈,并用于指导虚拟机中页面共享的优化。本文的主要工作包括如下几点: (1)本文提出了一种低开销的基于二进制插桩的软硬件结合的函数级访存行为分析方法,该方法可比纯软件工具减小开销10倍以上。使用静态二进制插桩技术,在目标函数调用指令的之前和之后分别插桩一条额外的特殊Tag访存指令,分别对应向底层HMTT发送上层函数调用(入口)、返回(出口)事件的通知,实现对HMTT的访存Trace进行函数级划分。实验结果表明,该方法的准确性高(误差在2%以下),开销低(约为61.9%)。相对地,使用Pin[86]工具获取函数调用路径的运行开销约为19倍[41]。 (2)本文提出了一种低开销的软硬件结合的细粒度对象级访存行为分析方法,并用于对程序的页表访存热点进行分析和优化,取得了约6.8%的优化效果。通过修改Linux内核,首先导出进程页表的初始化状态,后面监控所有对页表的更新操作,将页表更新信息导出,并向HMTT发送同步Tag访存。同时使用动态库重载方式,监测对象的动态内存分配和释放事件,导出对象的地址空间信息。另外通过对页表本身所在页面的访存的监测,还可实现对象级的页表访存(Page Table Walks)分析。实验结果表明,本方法能够正确识别不同对象的访存模式(误差在2%以下),导致的运行开销很低,平均约为1.6%。使用本方法对两个测试程序BFS和Canneal进行分析,能够识别出导致页表访存的关键对象,并指导程序优化,可分别达到约8.2%和5.5%的性能提升。 (3)本文提出了一种基于硬件页面访问特性统计的分类内存去重优化方法,可降低页面比较次数约31.5%。通过分析目前KVM虚拟机中KSM(Kernel SamepageMerging)的实现,发现KSM对系统全部内存页面只维护两棵全局比较树将导致较大的页面比较开销(约占KSM运行开销的44%)和大量的无效页面比较(约占总页面比较的83%)。本文提出将页面根据访问特性进行分类的优化方法,使用HMTT硬件监控所有访存请求,并在线维护页面访问特性,定期反馈给KSM软件。KSM软件根据页面访问特性对页面进行分类,将具有相似访问特性的页面聚为一类,在每个页面类别内分别维护本地的局部比较树。对每个候选页面,只需要与本地比较树中的页面节点进行比较,而来自不同类别的页面之间不再需要进行比较。实验结果表明,使用细粒度的子页面访问分布指导页面分类,平均能够降低页面的比较次数约31.5%,平均降低无效比较率约12%。