Romano Gushchin (inżynier oprogramowania w Facebooku) zgłosił zbiór poprawek do aplikacji przydzielającej pamięć sterownika slab (kontroler pamięci) na liście mailingowej poświęconej rozwojowi jądra Linux.
Nowy sterownik wyróżnia się przeniesieniem rozliczania bloków z poziomu stron pamięci na poziom obiektów jądra, dzięki czemu możliwe jest współdzielenie stron bloków pomiędzy różnymi grupami c, zamiast przydzielania oddzielnych pamięci podręcznych bloków dla każdej grupy c.
Roman znalazł coś, co nazywa „bardzo poważną wadą” w istniejącym kontrolerze pamięci typu slab, która prowadzi obecnie do niskiego wykorzystania w cgroups.
„Prawdziwy powód, dla którego istniejący projekt prowadzi do niskiego wykorzystania płyty, jest prosty: strony płyty są używane wyłącznie przez pulę pamięci.
Jeśli istnieje tylko kilka alokacji określonego rozmiaru utworzonych przez grupę cgroup lub jeśli po usunięciu grupy cgroup pozostało kilka aktywnych obiektów, lub jeśli grupa cgroup zawiera pojedynczą aplikację wielowątkową, która ledwo przydziela jakiekolwiek obiekty jądra, ale za każdym razem jest włączona nowy procesor: we wszystkich tych przypadkach wynikające z tego wykorzystanie płyty jest bardzo niskie.
Jeśli rozliczanie kmem jest wyłączone, jądro może wykorzystywać wolne miejsce na stronach płyty do innych przydziałów. «
Kontroler pamięci Slab zaproponowany w zeszłym roku przez Romano Gushchina okazał się bardzo obiecujący, gdyż pozwalał na zwiększenie efektywności wykorzystania pamięci Slab, zmniejszał rozmiar pamięci wykorzystywanej przez Slab o 30–45% i znacząco zmniejszał całkowite zużycie pamięci przez rdzeń.
Co więcej, wdrożone poprawki wskazują , że Facebook już wykorzystuje ten kod w środowisku produkcyjnym na swoich serwerach, oszczędzając około 650–700 MB+ na serwerach front-end , buforowaniu baz danych i serwerach DNS, a to tylko niektóre z korzyści.
Zmniejszenie liczby nieruchomych bloków ma również pozytywny wpływ na fragmentację pamięci. Nowy kontroler pamięci znacznie upraszcza kod odpowiedzialny za rozliczanie bloków i eliminuje potrzebę stosowania złożonych algorytmów dynamicznego tworzenia i usuwania pamięci podręcznej bloków dla każdej grupy c.
Wszystkie grupy cgroup pamięci w nowej implementacji używają wspólnego zestawu pamięci podręcznych slab, a żywotność pamięci podręcznych slab nie jest już związana z czasem życia ograniczeń pamięci ustawionych przez cgroup.
Bardziej precyzyjne rozliczanie zasobów zaimplementowane w nowym kontrolerze slabowym powinno teoretycznie bardziej obciążać procesor, ale w praktyce różnice okazały się nieistotne.
W szczególności nowy kontroler płyt był używany od kilku miesięcy na aktywnych serwerach Facebooka obsługujących różne typy obciążeń i do tej pory nie wykryto żadnych znaczących regresji.
Łatka zawiera kilka częściowo niezależnych części, które mogą również znaleźć zastosowanie poza kontrolerem pamięci płyty:
- Subpage Load API, które można wykorzystać w przyszłości do zliczania innych obiektów, które nie mają rozmiaru strony, np. Alokacje percpu
- Interfejs API mem_cgroup_ptr, w którym liczone wskaźniki do memcg, może być ponownie wykorzystany do wydajnego ponownego rodzicielstwa innych obiektów, np. Pagecache.
Jednocześnie zauważono znaczący spadek zużycia pamięci : na niektórych hostach udało się zaoszczędzić nawet 1 GB pamięci, ale wskaźnik ten w dużej mierze zależy od charakteru obciążenia, całkowitego rozmiaru pamięci RAM, mocy procesora i charakterystyki pracy z pamięcią.
Zamiast tworzenia oddzielnego zestawu kmem_cache dla każdej grupy cgroup pamięci, używane są dwa zestawy globalne: zestaw główny dla przypisań nieuwzględnionych i przypisania cgroup grupy głównej oraz drugi zestaw dla wszystkich innych przypisań. Pozwala to na uproszczenie zarządzania okresem życia poszczególnych kmem_cache.
A na koniec, jeśli chcesz dowiedzieć się więcej o nowym zestawie 19 poprawek, znajdziesz je na liście mailingowej poświęconej jądru.