Facebook 软件工程师Romano Gushchin在 Linux 内核开发邮件列表中提交了一组针对 slab 驱动程序内存分配应用程序(内存控制器)的补丁。
新驱动程序最显著的特点是将 slab 统计从内存页级别转移到内核对象级别,从而可以在不同的 c 组之间共享 slab 页,而不是为每个 c 组分配单独的 slab 缓存。
Roman在现有的平板内存控制器中发现了他所谓的“非常严重的缺陷”,这导致cgroup如今的利用率较低。
现有设计导致平板数据利用率低的真正原因很简单:平板页面仅由内存池使用。
如果cgroup仅分配了一定大小的少量分配,或者在删除cgroup之后还有一些活动对象,或者cgroup包含一个几乎没有分配任何内核对象的线程应用程序,但是每次在新的CPU上:在所有这些情况下,最终的板利用率都非常低。
如果禁用kmem记帐,则内核可以将slab页面上的可用空间用于其他分配。 «
去年 Romano Gushchin提出的 Slab 内存控制器非常有前景,因为它能够提高Slab 的使用效率,将 Slab使用的内存大小减少30-45%,并显著降低核心的总内存消耗。
此外,已实施的补丁表明,Facebook 已在其服务器上的生产环境中使用该代码,并为前端 Web 服务器、数据库缓存和 DNS 服务器节省了约 650-700MB 以上的空间,以及其他好处。
减少不可移动的内存块数量也有助于减少内存碎片。新的内存控制器显著简化了内存块的处理代码,并消除了为每个c组动态创建和删除内存块缓存的复杂算法。
在新的实现中,所有用于内存的cgroup都使用一组通用的平板缓存,并且平板缓存的寿命不再与通过cgroup设置的内存约束的寿命挂钩。
从理论上讲,在新的平板控制器中实现的更精确的资源核算应在CPU上增加更多的负载,但实际上差异可以忽略不计。
具体来说,新的板式控制器已经在处理不同类型负载的 Facebook 实时服务器上使用了几个月,到目前为止还没有发现任何明显的退化。
该补丁包含几个半独立的部分,它们也可以在slab的内存控制器之外找到它们的用途:
- Subpage Load API,将来可用于计算不是页面大小的其他对象,例如percpu分配
- 可以将mem_cgroup_ptr API(其中的指针计为memcg)重新使用,以有效地重定义其他对象(例如页面缓存)。
与此同时,内存消耗量显著降低:在某些主机上,最多可以节省 1 GB 的内存,但这一指标很大程度上取决于负载的性质、 RAM 的总大小、CPU 的数量以及内存使用特性。
不是为每个内存cgroup创建单独的kmem_caches集,而是使用两个全局集:用于未分配和根组cgroup分配的根集,以及用于所有其他分配的第二组。 这样可以简化单个kmem_caches的生命周期管理。
最后,如果您有兴趣了解这 19 个新补丁,可以在内核邮件列表中找到它。