Facebook'ta yazılım mühendisi olarak çalışan Romano Gushchin , Linux çekirdeği geliştirme e-posta listesinde, slab sürücüsünün bellek tahsis uygulamasına (bir bellek denetleyicisi) yönelik bir dizi yama yayınladı .
Yeni sürücü, slab muhasebesini bellek sayfaları düzeyinden çekirdek nesneleri düzeyine taşımasıyla dikkat çekiyor; bu sayede her c-grubu için ayrı slab önbellekleri tahsis etmek yerine, farklı c-grupları arasında slab sayfalarının paylaşılması mümkün oluyor.
Roman, mevcut slab bellek denetleyicisinde "çok ciddi bir kusur" olarak adlandırdığı şeyi buldu ve bu günlerde cgroup'larda düşük kullanıma yol açtı.
“Mevcut düzenin düşük döşeme kullanımına yol açmasının gerçek nedeni basittir: döşeme sayfaları yalnızca bir bellek havuzu tarafından kullanılır.
Bir cgroup tarafından yapılan belirli bir boyutta yalnızca birkaç tahsis varsa veya cgroup kaldırıldıktan sonra kalan bazı aktif nesneler varsa veya cgroup, herhangi bir çekirdek nesnesini ancak her seferinde ayıran tek bir iş parçacığı uygulaması içeriyorsa yeni bir CPU'da: tüm bu durumlarda, ortaya çıkan slab kullanımı çok düşüktür.
Kmem hesabı devre dışı bırakılırsa, çekirdek diğer tahsisler için döşeme sayfalarında boş alan kullanabilir. «
Romano Gushchin'in geçen yıl önerdiği Slab bellek denetleyicisi, Slab kullanımında verimliliği artırması , Slab için kullanılan bellek boyutunu %30-45 oranında azaltması ve çekirdeğin toplam bellek tüketimini önemli ölçüde düşürmesi nedeniyle oldukça umut vericiydi.
Ayrıca, uygulanan yamalar , Facebook'un kodu sunucularında üretim ortamında zaten kullandığını ve diğer faydaların yanı sıra ön uç web sunucuları , veritabanı önbelleklemesi ve DNS sunucuları için ~650-700 MB'tan fazla tasarruf sağladığını göstermiştir .
Hareket ettirilemeyen bellek bloklarının sayısının azaltılması, bellek parçalanması üzerinde de olumlu bir etkiye sahiptir. Yeni bellek denetleyicisi, bellek bloklarının muhasebeleştirilmesi için gereken kodu önemli ölçüde basitleştirir ve her c-grubu için dinamik olarak bellek bloğu önbellekleri oluşturma ve silme için karmaşık algoritmalara olan ihtiyacı ortadan kaldırır.
Yeni uygulamadaki tüm bellek önbellek grupları ortak bir döşeme önbellekleri seti kullanır ve döşeme önbelleklerinin ömrü artık cgroup aracılığıyla ayarlanan bellek kısıtlamalarının ömrüne bağlı değildir.
Yeni slab kontrolöründe uygulanan daha kesin kaynak muhasebesi, teorik olarak CPU'yu daha fazla yüklemelidir, ancak pratikte farklar ihmal edilebilir.
Özellikle, yeni levha denetleyicisi, farklı yük türlerini işleyen canlı Facebook sunucularında birkaç aydır kullanılıyor ve şu ana kadar önemli bir gerileme tespit edilmedi.
Yama, kullanımlarını slabın bellek denetleyicisinin dışında da bulabilen birkaç yarı bağımsız parça içerir:
- Percpu ayırmaları gibi bir sayfa boyutu olmayan diğer nesneleri saymak için gelecekte kullanılabilecek Alt Sayfa Yükleme API'si
- İşaretçilerin bir memcg'ye sayılan mem_cgroup_ptr API'si, örneğin pagecache gibi diğer nesnelerin verimli bir şekilde yeniden ilişkilendirilmesi için yeniden kullanılabilir.
Aynı zamanda, bellek tüketiminde de önemli bir azalma söz konusu : bazı sunucularda 1 GB'a kadar bellek tasarrufu sağlanabildi, ancak bu gösterge büyük ölçüde yükün niteliğine, toplam RAM boyutuna, CPU miktarına ve bellekle çalışma özelliklerine bağlıdır.
Her bellek cgroup için ayrı bir kmem_caches seti oluşturmak yerine, iki global küme kullanılır: hesaplanmayanlar için kök küme ve kök grup cgroup atamaları ve diğer tüm atamalar için ikinci küme. Bu, bireysel kmem_cache'lerin ömür boyu yönetimini basitleştirmeye izin verir.
Son olarak, yeni 19 yama seti hakkında bilgi edinmek isterseniz, bunu çekirdek posta listesinde bulabilirsiniz.