Romano Gushchin(Facebook 軟體工程師)在 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 個新補丁,可以在核心郵件列表中找到它。