Balonowanie pamięci w systemie operacyjnym

13

Niektóre hiperwizory optymalizują użycie pamięci za pomocą metody nazywanej balonowaniem (przynajmniej tak ją nazywa KVM), ta metoda deduplikuje pamięć między maszynami wirtualnymi i ustawia wspólne strony na tylko do odczytu z kopiowaniem przy zapisie.
Jest to swego rodzaju przeciwieństwo wywołania wideł.

Czy można wdrożyć procesy na poziomie systemu operacyjnego (myślałem głównie o duplikacji pamięci podczas przeglądania z Chromium z wieloma kartami w tej samej witrynie), czy zostało już zaimplementowane?

Didi Kohen
źródło

Odpowiedzi:

14

W rzeczywistości to, co opisałeś, myli balonowanie i „łączenie tej samej strony”. Spróbuję rozwinąć tę kwestię, aby rozróżnienie było widoczne.

Balonowanie pamięci

Jest to sztuczka, aby upewnić się, że część pamięci przydzielonej maszynie wirtualnej gościa pozostaje użyteczna dla innego gościa lub samego hosta (pamięci podręczne itp.). Odbywa się to w następujący sposób:

Jądro gościa jest wstrzykiwane ze sterownikiem, który monitoruje użycie pamięci gościa i „kradnie” część nieużywanej pamięci (przydzielając ją sobie w przestrzeni pamięci gościa, dzięki czemu nic na tym gościu nie może dotknąć tego zakresu).

Następnie informuje jądro hosta, że ​​w rzeczywistości może usunąć te strony pamięci z rdzenia, że ​​nie będą one używane w gościu (dopóki gość nie doświadczy presji pamięci, w którym momencie balon się opróżni i użyje te zakresy ponownie).

Ostatecznie jądro może przydzielić dokładnie tę samą pamięć innemu gościowi i sprawić, że całe użycie pamięci będzie bardziej wydajne, jeśli goście będą pracować z dużą ilością wolnej pamięci.

Scalanie tej samej strony

Ta technika identyfikuje identyczne strony pamięci, które z jakiegoś powodu nie są już oznaczone jako „quasi-tylko do odczytu” przy kopiowaniu przy zapisie, i oznacza je jako takie.

Teraz na poziomie systemu operacyjnego zapotrzebowanie na tego rodzaju sztuczki jest ograniczone. Po prostu, większość czasu, gdy masz identyczne strony pamięci, są one już tylko do odczytu (czasami nawet bez CoW), ponieważ są to głównie kod aplikacji, biblioteki itp. Są one natywnie otwierane za pomocą mapy pamięci, a zatem jądro może zachować tylko jedna ich kopia w rdzeniu (jeśli w ogóle istnieje, może również całkowicie wydrukować stronę i umożliwić jej stronicowanie ze sklepu podstawowego w razie potrzeby).

Na zwirtualizowanym poziomie systemu operacyjnego ta sama zasada jest właściwie stosowana w każdym podsystemie gościa. Jednak jądro hosta nie ma pojęcia, czy dwóch gości uruchamia w większości ten sam kod, a zatem współużytkuje tę samą pamięć - goście nie komunikują się, aby to skoordynować.

Dlatego czasami może skanować cały system w poszukiwaniu identycznych stron pamięci - przez większość czasu będą one identyczne w systemie operacyjnym gościa, a nie w każdym z nich - jądro gościa wykonuje przyzwoitą pracę, utrzymując czystość pamięci w swoim zasięgu. Zatem w typowym środowisku VM, w którym jedno jądro hosta obsługuje ponad 50 gości, oszczędności pamięci mogą być dość znaczne.

Oba naraz

Balonowanie i scalanie na tej samej stronie mogą współistnieć bardzo dobrze, osiągając dość znaczną pamięć zbyt dużą dla identycznych systemów.


Aby odpowiedzieć na twoje pytanie - funkcja łączenia stron może i czasami jest włączona na poziomie systemu operacyjnego. Ma to związek z interpretowaniem stron, które mogą być identyczne bez tego samego pliku kopii zapasowej.

W twoim przykładzie Chromium - same pliki binarne są już deduplikowane poprzez mapę startową tylko do odczytu - dzielą dokładnie tę samą przestrzeń pamięci. Pamięci podręczne stron (zawartość kart) są zwykle również współużytkowane przez procesy (tylko do odczytu kopiowanie przy zapisie) ze względu na sposób zarządzania pamięcią podręczną dysku - ten sam plik na dysku można otworzyć jednocześnie między różnymi procesami na maszynie wirtualnej -optymalny sens.

Korzyść byłaby najbardziej widoczna w przypadku stanu współdzielenia różnych silników Javascript - ale nie jestem pewien, czy są one przydzielane w dokładnie takim samym układzie pamięci, zapewniając, że cała strona pamięci jest identyczna.

W systemach mobilnych jest inaczej. Na przykład Android intensywnie wykorzystuje KSM do deduplikacji identycznego kodu między różnymi aplikacjami.

W obu przypadkach możesz włączyć go samodzielnie w systemie Linux (Kernel SamePage Scalanie). Sterownik eksportuje różne statystyki, które po przeczytaniu tej odpowiedzi powinny być w stanie zinterpretować i podjąć własną decyzję, czy pasuje ona do twojego celu.

https://www.kernel.org/doc/Documentation/vm/ksm.txt

qdot
źródło
3
Scalanie tej samej strony jest również określane jako „pamięć transcendentna”, w zależności od hiperwizora (i jego wieku).
Tim Post
Dziękuję, widzę, że KSM wymaga, aby aplikacja była tego świadoma, a po (szybkim) wyszukiwaniu Chromium nie obsługuje go obecnie. Zdaję sobie sprawę, że pliki binarne są deduplikacji, ale jestem przede wszystkim odnosząc się do wyjścia JIT i surowych skrypty umieszczone ciężkie obciążenie mojej pamięci RAM ...
Surowe skrypty w Chromium są również deduplikowane - lądują w pamięci podręcznej dysku, podobnie jak w przypadku wszystkich innych obiektów internetowych, a pamięć podręczna dysku jest mapowana, a nie czytana.
qdot
Surowe skrypty są odwzorowywane, ale nawet popularne skrypty (takie jak jQuery i Angular.js) są replikowane w pamięci podręcznej i nie są ze sobą dopasowane, ponieważ często używa się sieci CDN i dokładnych replik plików skryptów na różnych serwerach witryny.
To prawdopodobnie powinno skończyć się na czacie, ale chciałbym zobaczyć twoje statystyki z KSM Linuksa.
qdot