Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
W kernelu jest mechanizm KSM (Kernel Samepage Merging). To takie ustrojstwo, którego zadaniem jest deduplikacja danych w pamięci RAM, np. przy korzystaniu z maszyn wirtualnych QEMU/KVM, i w efekcie można niby zredukować dość mocno ilość wykorzystywanej pamięci operacyjnej.
Czy ktoś może orientuje się jak dokładnie wyliczyć ile system w danym czasie zaoszczędził pamięci?
Przykładowo, w katalogu /sys/kernel/mm/ksm/ są takie pliki (z prawej strony są ich zmieniające się w czasie wartości):
pages_shared 168067 pages_sharing 299539 pages_unshared 482783 pages_volatile 23884
W dokumentacji kernela piszą, że:
pages_shared - how many shared pages are being used
pages_sharing - how many more sites are sharing them i.e. how much saved
pages_unshared - how many pages unique but repeatedly checked for merging
pages_volatile - how many pages changing too fast to be placed in a tree
I tu jest właśnie problem, bo z tego co ustaliłem to generalnie dwie teorie interpretacji tych danych — chodzi głównie o pages_shared i pages_sharing, bo ich nazwy są bardzo podobne, a ten wyżej widoczny opis jakoś nie do końca jest zrozumiały.
Pierwsza teoria mówi, że ilość zaoszczędzonych danych jest określona w pages_sharing (wartość w stronach pamięci, czyli *4096), czyli byłoby to jakieś 1170 MiB. Druga teoria mówi, że od pages_sharing trza odjąć pages_shared i wtedy uzyskuje się faktyczną wartość RAM zaoszczędzoną przez system (też pomnożone przez 4096), czyli jakieś 513 MiB.
To jak to jest w końcu? xD
Ostatnio edytowany przez morfik (2020-10-10 10:48:02)
Offline
Ok metodą prób i błędów wyliczyłem i wyszło, że pierwsza teoria jest prawdziwa, tj. nic się nie odejmuje, a wartość wskazana przez pages_sharing daje zaoszczędzoną ilość pamięci, zatem około 1,2 GiB. Trochę to mało w porównaniu do hostowania 50 wndowsów z 1G RAM na 16 G RAM. xD
Offline
Mysle, że to się sprawdza w przypadku operacji na ustrukturyzowanych blokach. Jakieś bazy danych, backup z deduplikacja itp.
Pamieć OSu będzie zawsze inaczej poszatkowana (bez odpowiedniej optymalizacji)
Offline
Z tego co piszą, to działa na poziomie stron pamięci czyli np. 4 KiB. Więc jak dwie strony będą takie same, to je połączy. Ja sobie stworzyłem maszynę wirtualną z ubuntu i drugą taką samą via clone. No i tylko ~1 GiB RAM udało się odzyskać w stosunku do ~4 GiB RAM zajmowanego przez obie maszyny (przydział po 2 GiB). Myślałem może, że ta druga maszyna będzie zajmować ze 100 MiB. I jeszcze procesor zjada 5-10%. Także słabo. xD
Ostatnio edytowany przez morfik (2020-10-14 09:42:41)
Offline
4KiB to nie jest dużo ale wystarczy aby 1 bit był inny i blok jest już unikatowy w ramach KSM'a. Duży wpływ na to może może mieć domyślnie włączony ASLR przez co mapa pamięci dwóch identycznych systemów będzie różna.
Możesz spróbować wyłączyć to na poziomie sysctl
kernel.randomize_va_space = 0
Myślę, ze ~25% odzysk pamięci to nie jest zły wynik, chociaż jest szansa, że spora część tego miejsca to 0^4096 czy jak się to tam wylicza :D
Ale rozumiem zawód, spodziewałeś się czegoś a'la AuFS w Docker ale dla pamięci RAM
Offline
W takim razie dalej podtrzymuje moją teorię, że to jest Ficner bardziej dla aplikacji typu bazy danych trzymanych w pamięci.
Możesz w nich zoptymalizować rozmiar bloków danych do rozmiary idealnego dla bloku pamięci i wtedy mieć korzysci
Offline
Naskrobałem trochę tekstu na temat tego całego KSM i wykorzystania go na linux do optymalizacji zużycia RAM ale wygląda na to, że coś im ten mechanizm nie wyszedł albo linux jest z nim słabo kompatybilny. xD
Offline