Ingens

此论文是OSDI’16上的一篇文章,今天特意总结一下,希望对读者会有所帮助。
注:在本文中,promotion为小页合并为大页,demotion为大页拆分为小页。

相关资料

姓名 主页 谷歌学术 dblp
Youngjin Kwon Youngjin Kwon Youngjin Kwon Youngjin Kwon
Hangchen Yu Hangchen Yu Hangchen Yu Hangchen Yu
Simon Peter Simon Peter Simon Peter Simon Peter
Christopher J. Rossbach Christopher J. Rossbach Christopher J. Rossbach Christopher J. Rossbach
Emmett Witchelh Emmett Witchel Emmett Witchel Emmett Witchel

当前大页系统的问题

缺页延迟高

当一个进程在匿名内存区域缺页时,缺页处理程序将返回分配好的物理内存页面。 小页与大页共享此代码路径。 Linux在分配大页时是贪心和积极的,所以当一个应用程序在一个小页上出现缺页,如果可以的话,Linux将立即尝试升级请求并分配一个大页。

这种贪心的方法从根本上增加了缺页延迟,有两个原因:1. Linux必须将页面清零,然后再将其返回给用户。 大页比小页大512倍,因此要清理得更慢。2. 大页分配需要2 MB的物理连续内存,当内存碎片化严重时,操作系统通常必须压缩内存以产生2MB连续的内存。

为了避免这种额外的缺页延迟,Linux可以基于可配置的异步promotion速度(以MB / s为单位)异步地合并大页。

内存膨胀

大页提高了系统性能,但应用程序并不总是充分利用分配给它们的大页。 尽管未充分利用大页而创建了内部碎片,Linux仍然贪婪地分配大页。大页可能会消除TLB的miss,但是成本是使用少于一个完整大页的进程必须保留整个区域。

大页导致内存碎片化

贪婪地分配大页增加剩下的内存碎片化程度,增加的碎片化程度是缺页延迟高与内存膨胀的先决条件,所以贪婪的大页分配导致了恶性循环。

不公平的性能

假设当前几个虚拟机正在运行同样的workload,当大页资源变得稀缺的时候,Linux并没有将大页资源公平地分给这几个虚拟机,从而导致了几个虚拟机之间性能的差异。

内存节省 vs 性能

当内存节省技术KSM检测到大页中的某个小页与其他虚拟机中的某个小页相同时,KSM会选择拆分大页,从而丧失了大页的好处;但是KSM操作的对象为小页,如果不拆分大页,那么KSM节省的内存量将大大降低。

性能和内存节省之间的这种折衷是可以避免的。 KSM可以并且应该与大页管理协调合作,以同时获得性能和内存节省的优势。

设计

下图显示了本节中描述的Ingens的主要数据结构和代码路径。

时间和空间上的监控

Ingens通过引入两个有效的机制来衡量大页大小区域(空间)的利用率以及访问大页大小区域(时间)的频率,来统一和协调大页管理。 Ingens有效地收集这些信息,然后在整个内核中使用两个bitvectors进行策略决策。

  • 利用率vector

利用率bitvector记录在每个大页大小的存储器区域(对齐的2 MB区域,包含512个基页)中使用哪些小页。 利用率bitvector中设置的每个位表示相应的小页正在使用中。

  • 访问率vector

访问率vector将进程的最近访问历史记录到页面上(大页或小页)。

快速的缺页处理

promotion与demotion

  • 基于利用率的promotion(减轻内存膨胀)

当一个大页区域中小页是利用率达到一个阈值,缺页处理程序唤醒Promote-kth去将小页合并为大页。

  • 基于利用率的demotion(性能)

如果一个大页中包含一个释放的小页,Linux将立即拆分该大页。Ingens延迟了高利用率大页的拆分:当一个小页在一个大页中被释放时,Ingens会清除利用率vector中页面的位。 当利用率下降到阈值以下时,Ingens会拆分大页,并释放位元素中位清除的小页面。

主动地批量压缩内存(减少碎片化程度)

Ingens监视物理内存的碎片化状态,并主动压缩内存,以减少大页allocation的延迟。

Ingens的目标是保持内存碎片化程度在某个阈值之下,当内存碎片化程度高于该阈值时,主动内存压缩就会发生。积极的主动式压缩会导致CPU利用率高,干扰用户应用程序,Ingens将压缩内存的最大数量限制为每次压缩100 MB。 压缩会移动页面,这需要使TLB失效, Ingens不会移动频繁访问页面,以减少压缩对系统性能影响。

平衡页面共享与性能

Ingens使用访问频率信息来平衡页面共享与应用程序性能, 它决定是否应该拆除大页以使得能够共享包含在大页中的小页。 相比之下,KVM始终将内存节省优先于系统性能,Ingens实施了一种避免经常访问的大页拆除的策略。 当在大页中遇到匹配的相同小页时,如果这个大页被频繁访问,Ingens会拒绝共享,否则允许将大页拆分进行内存去重。

按比例promotion来管理大页资源

Ingens在进程和虚拟机之间监视并公平地分配大页资源,采用技术来公平分享大页资源,当一个进程或者虚拟机获得了大页,但是这些大页基本都是空闲的,那么它就会受到惩罚。 每个进程具有以任意但标准值开始的内存共享优先级(例如,10,000), Ingens按比例分配大页。 Ingens将不经常访问的页面标记为空闲存储器,并对空闲存储器施加惩罚。 一个获得很多大页但并没有使用它们的应用程序将很难获得大页资源。

总结

Ingens为操作系统和hypervisor提供原则性的,协调的透明大页支持,使挑战性的工作负载达到大页的预期收益,而不会损害当前的大页系统所服务的工作负载。 Ingens可以减少尾延迟和内存膨胀,同时提高公平性和性能。