joehf / xen_aet_support Goto Github PK
View Code? Open in Web Editor NEWLicense: Other
License: Other
master分支上将页面置位之后,下一次虚拟机对该页面的访问将会陷入,陷入之后我们需要修复置位错误,同时把该页加入待置位页面集合,以便在未来的某个时机再将这个页面置位,现在的实现中是在下一次vmexit的时候置位,但是对于一个已经正常运行的虚拟机来说vmexit不会那么多,极有可能下一次vmexit是我们置位的另外一个页面发生了page fault
举个例子,比如初始情况下我们置位了L1、L2页面,当第一次访问L1时陷入,修复之后将L1加入待置位集合,下一次访问L2导致page fault从而vmexit,这个时候做两件事情给L1重新置位,修复L2错误。
L1页面从修复到下一次置位之间的cache hit将极有可能是L1的页内连续访问,如果下一次置位的时机真的就是L2的陷入,那么cache hit极有可能是L1页面的页内连续访问,也有可能是非L1、非L2页面的页内连续访问,如果把cache hit数乘以一个概率那么将是1/512
在vmexit处增加一个计时器,经过特定时间扫描当前shadow page table的l4页表,将所有512个entry标记
shadow page fault发生的虚拟地址va涉及到的影子页表包括sl4e_,sl3e_,sl2e_,sl1e_
sl4e_指向512个包含sl3e_的三级页表,置位所有511个三级页表除sl3e_
sl3e_指向512个包含sl2e_的二级页表,置位所有511个二级页表除sl2e_
sl2e_指向512个包含sl1e_的一级页表,采样置位所有511个一级页表除sl1e_
之前的实现都是在page fault完成对特定的页面置位,但是在page fault有一个缺点是没有办法对当前发生page fault的页面置位,这样置位难免都会存在一个滞后性。
现在有个想法是我们只需要在page fault记录有哪些页面需要跟踪,置位我们可以每隔一定时间对这些记录下来的页面统一置位,可以在虚拟机发生vmexit的时候加入一个定时器,每隔一定时间便对采样的页面集合标记置位。
将标记位从0xfff8000000000400ULL修改为0x0008000000000400ULL产生bug,虚拟机异常退出
fake benchmark现在的实现是每个页先顺序写一遍,再顺序读一遍,对于100MB的数组,一共25600个page,所以重用时候的内存访问间隔大致应该是25600,现在实验测得42000左右
RT
要做到随机采样有两种方式:一是在进程创建页表的时候就把所有页表项保存下来,这样在需要采样的时候就直接在这项页表项中做随机选取即可;二是在需要采样的时候遍历页表,选择我们需要的页表项,可以在上级页表就加入随机选择,只选取我们感兴趣的。
老师们的意见特别是汪老师的意思是遍历页表,这个方式也是可行的,不过我觉得这样做的时间复杂度较高,并且实现的复杂度也相对较高。我打算先实现第一种随机采样方式,对先有代码的改动最小。之前认为存储代价为页的个数,其实并不需要这么多,我们考虑保存最后一级页表也就是pte页表项的那个页,在64位系统下,一个这样的页可以保存512个pte,而我们只需要保存这个保存512个pte的页的页框号就能够找到这512个页表项。假设对于一个有4个g内存的计算机,总共有4*1024*1024/4 = 1024*1024 个页,那我们只需要保存1024*1024/512 = 2048这样多的保存pte页表项的页框号,假设保存的信息占据32byte,则只需要2048*32 = 64KB,存储压力是很小的。现在需要找一个好的随机算法能够在2048个保存512个pte页表项的页中随机采样一定采样比例的页面进行置位。
加入随机采样之后,我们只需要每隔一定时间采样适当比例的页面进行置位,从置位到截获是第一次访问,在那之后我们还需要继续置位监控它的第二次访问。这期间的内存访问数作为重用距离。在这次访问之后这个页面就无需再置位了。
从标记置位到再次使用时候发生page fault的间隔时间作为重用时间,记录PTE对应的机器页框号重用时间,并在发生重用的时候更新重用时间分布
多尝试几种访问的模式
当guest发生shadowpagefault时根据发生pagefault的地址va
va->sl4e->sl3e->sl2e->sl1e->page
sl2e指向包含sl1e的512个页表项PTE
对除了sl1e的剩下511个PTE采样标记
优点:
实现简单,已基本完成置位及修复的过程
缺点:
每次shadowpagefault都遍历512个PTE有一定开销,会存在重复
没有办法做到周期性的一次采样
把页面失效作为页面的重用间隔,引入热页集过滤降低开销,相当于计算了冷页的失效率曲线。
先全采样,也就是将所有pte置位,采集到的页面先放入热页集,修复置位,暂不监控,当热页集满后pop出pte之后再置位,恢复监控,再次截获到的时候计算重用时间。最后计算aet时相当于计算出了冷页的失效率曲线。
观察benchmark的page fault数目,运行时间,以及计算出的失效率曲线和taco论文的结果做比较。
读一下pmu计数器的值(dtlb_miss)
RT
现在这种采样方式还不完善,对于在一个页面里面的连续访问不能截获,需要借助相邻页面的访问来截获,还是需要调试寄存器在这个页面访问之后立刻置位
RT
重用时间已经符合预期,根据fake benchmark
RT
RT
1、mem_access - l3 miss假设为是小距离的数
2、算出的miss curve有台阶
3、用tlb去算页面的重用(非mem_access)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.