W pamięci systemowej… konkretnie różnica między „tmpfs”, „shm” i „hugepages…”

16

Ostatnio byłem ciekawy różnych systemów plików opartych na pamięci jądra Linux.

Note:Jeśli o mnie chodzi, poniższe pytania należy uznać za mniej lub bardziej opcjonalne w porównaniu z lepszym zrozumieniem tego zawartego w tytule. Pytam ich poniżej, ponieważ uważam, że udzielenie odpowiedzi może lepiej pomóc mi zrozumieć różnice, ale ponieważ moje rozumienie jest wprawdzie ograniczone, wynika z tego, że inni mogą wiedzieć lepiej. Jestem gotowy przyjąć każdą odpowiedź, która wzbogaci moje rozumienie różnic między trzema systemami plików wymienionymi w tytule.

Ostatecznie myślę, że chciałbym zamontować użyteczny system plików z hugepages,pewnymi lekkimi badaniami (i jeszcze mniejszym majsterkowaniem) przekonało mnie, że rewritable hugepage mountopcja a nie jest możliwa. Czy się mylę? Jaka jest tutaj mechanika?

Również w odniesieniu do hugepages:

     uname -a
3.13.3-1-MANJARO \
#1 SMP PREEMPT \
x86_64 GNU/Linux

    tail -n8 /proc/meminfo
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:     8223772 kB
DirectMap2M:    16924672 kB
DirectMap1G:     2097152 kB

(Oto pełne wersje tekstowe / proc / meminfo i / proc / cpuinfo )

Co się dzieje powyżej? Czy już przydzielam hugepages?Czy istnieje różnica między DirectMapstronami pamięci ahugepages?

Aktualizacja Po kawałku sugerować od @Gilles dodałem jeszcze 4 linie wyżej i wydaje się, musi istnieć różnica, chociaż nigdy nie słyszał DirectMapprzed wyciągnięciem że taildzisiaj ... może DMIczy coś?

Jeszcze tylko trochę ...

Jeśli próba się nie powiedzie hugepages, i przy założeniu, że kopie zapasowe plików obrazów zostaną zapisane na dysku twardym, jakie ryzyko wiąże się z montażem pętli tmpfs?Czy mój system plików jest swappednajgorszym scenariuszem? Rozumiem, że tmpfsjest zamontowana pamięć podręczna systemu plików - czy mój zamontowany plik pętli może zostać odcięty od pamięci? Czy mogę podjąć działania łagodzące, aby tego uniknąć?

Wreszcie - co właściwie jest shm,? Czym różni się od lub zawierać albo hugepagesalbotmpfs?

mikeserv
źródło
1
Co z poprzednimi wierszami, /proc/meminfoktóre zawierają HugePage(lub czy Twoja wersja jądra ich nie ma)? Na jakiej architekturze to jest (x86_64, jak sądzę)?
Gilles „SO- przestań być zły”
Dodam je. Martwiłem się, że to będzie za długie.
mikeserv
@Gilles - powyżej link do zwykłego tekstu. Mam nadzieję, że to w porządku. Dzięki, że pytasz - w pierwszej kolejności powinienem był to uwzględnić - nie wiem, jak to przeoczyłem.
mikeserv

Odpowiedzi:

13

Nie ma różnicy między tmpfs i shm. tmpfs to nowa nazwa shm. shm oznacza SHaredMemory.

Zobacz: Linux tmpfs .

Głównym powodem, dla którego tmpfs jest dziś używany, jest ten komentarz w moim / etc / fstab na moim pudełku gentoo. BTW Chromium nie buduje się z brakującą linią:

# glibc 2.2 and above expects tmpfs to be mounted at /dev/shm for 
# POSIX shared memory (shm_open, shm_unlink). 
shm                     /dev/shm        tmpfs           nodev,nosuid,noexec     0 0 

który wyszedł z dokumentacji jądra Linuksa

Cytowanie:

tmpfs ma następujące zastosowania:

1) Zawsze istnieje wewnętrzne mocowanie jądra, którego w ogóle nie zobaczysz
. Służy do współdzielonych anonimowych mapowań i wspólnej
pamięci SYSV .

To podłączenie nie zależy od CONFIG_TMPFS. Jeśli CONFIG_TMPFS nie jest ustawiony, widoczna dla użytkownika część tmpfs nie jest budowana. Ale wewnętrzne
mechanizmy są zawsze obecne.

2) glibc 2.2 i
nowsze wersje oczekują zamontowania tmpfs w / dev / shm dla pamięci współdzielonej POSIX (shm_open, shm_unlink). Dodanie następującego
wiersza do / etc / fstab powinno się tym zająć:

tmpfs / dev / shm tmpfs domyślnie 0 0

Pamiętaj, aby w razie potrzeby utworzyć katalog, w którym chcesz zamontować tmpfs.

To mocowanie nie jest potrzebne w przypadku pamięci współdzielonej SYSV. Wykorzystano do tego wewnętrzne
mocowanie. (W wersjach jądra 2.3
konieczne było zamontowanie poprzednika tmpfs (shm fs), aby korzystać z
pamięci współdzielonej SYSV )

3) Niektórzy ludzie (w tym ja) uważają, że bardzo wygodnie jest go zamontować
np. Na / tmp i / var / tmp i mieć dużą partycję wymiany. A teraz
działa montowanie w pętli plików tmpfs, więc mkinitrd dostarczany przez większość
dystrybucji powinien odnieść sukces z tmpfs / tmp.

4) I prawdopodobnie o wiele więcej nie wiem o :-)

tmpfs ma trzy opcje montowania do zmiany rozmiaru:

rozmiar: limit przydzielonych bajtów dla tej instancji tmpfs. Domyślnie jest to połowa twojej fizycznej pamięci RAM bez wymiany. Jeśli zwiększysz rozmiar instancji tmpfs, maszyna zablokuje się, ponieważ program obsługi OOM nie będzie w stanie zwolnić tej pamięci.
nr_blocks: Taki sam jak rozmiar, ale w blokach PAGE_CACHE_SIZE.
nr_inodes: maksymalna liczba i-węzłów dla tego wystąpienia. Domyślnie jest to połowa liczby fizycznych stron RAM lub (na komputerze z highmem) liczba stron o niskiej pamięci RAM, w zależności od tego, która z tych wartości jest niższa.

Z przezroczystego dokumentu jądra Hugepage:

Przezroczysta obsługa stron internetowych maksymalizuje użyteczność wolnej pamięci w porównaniu z podejściem rezerwacji hugetlbfs, umożliwiając wykorzystanie całej nieużywanej pamięci jako pamięci podręcznej lub innej ruchomej (lub nawet nieprzenośnej jednostki). Nie wymaga rezerwacji, aby nie dopuścić do zauważenia błędów alokacji strony na stronie użytkownika. Umożliwia stronicowanie i wszystkie inne zaawansowane funkcje maszyn wirtualnych dostępne na stronach testowych. Nie wymaga żadnych modyfikacji, aby aplikacje mogły z niego skorzystać.

Aplikacje można jednak dalej optymalizować, aby skorzystać z tej funkcji, na przykład zostały one zoptymalizowane wcześniej, aby uniknąć zalewu wywołań systemu mmap dla każdego malloc (4k). Optymalizacja obszaru użytkownika nie jest zdecydowanie obowiązkowa, a strona khugepaged może zająć się przydziałem długowiecznych stron, nawet w przypadku nieświadomych aplikacji typu hug page zajmujących się dużą ilością pamięci.


Nowy komentarz po wykonaniu obliczeń:

HugePage Rozmiar: 2 MB
HugePages Używany: Brak / Wył., O czym świadczą wszystkie 0, ale włączony jak powyżej 2 Mb.
DirectMap4k: 8,03 Gb
DirectMap2M: 16,5
Gb DirectMap1G: 2 Gb

Korzystając z powyższego akapitu dotyczącego optymalizacji w THS, wygląda na to, że aplikacje korzystające z malloców 4k, 16,5 Gb zostały wykorzystane przez aplikacje korzystające z malloców 2M. Aplikacje korzystające z malloców 2M naśladują obsługę HugePage, odciążając sekcje 2M do jądra. Jest to preferowana metoda, ponieważ po zwolnieniu malloc przez jądro pamięć jest zwalniana do systemu, podczas gdy montowanie tmpfs przy użyciu hugepage nie spowoduje pełnego czyszczenia, dopóki system nie zostanie ponownie uruchomiony. Wreszcie, ten łatwy, miałeś 2 uruchomione / uruchomione programy, które zażądały malloc 1 Gb

Dla tych z was, którzy nie znają malloc, jest to standardowa struktura w C, która oznacza przydział pamięci. Obliczenia te służą jako dowód na to, że korelacja OP między DirectMapping a THS może być poprawna. Należy również pamiętać, że zamontowanie TYLKO fs OGROMNEJ STRONY spowodowałoby jedynie przyrost o 2 MB, podczas gdy pozwolenie systemowi na zarządzanie pamięcią za pomocą THS występuje głównie w blokach 4k, co oznacza, że ​​pod względem zarządzania pamięcią każde wywołanie malloc ratuje system 2044k (2048 - 4 ) do użycia w innym procesie.

eyoung100
źródło
2
To jest naprawdę dobre - czy THS jest moją DirectMapą ?
mikeserv
Nie mogę odpowiedzieć, gdy przeglądałem DirectMapping i nie znalazłem nic związanego z tmpfs itp. Jedyne, co mogłem znaleźć, to jak skonfigurować obsługę HugeMem dla baz danych Oracle działających na ich smaku Linuksa, co oznacza, że ​​używają HugePages zamiast THS Wspomniałem. Jednak wszystkie jądra w gałęzi 2.6 obsługują THS. Jako przeczucie, patrz mój nowy komentarz powyżej.
eyoung100 15.04.2014
Tak, też bardzo mało się pojawiłem. Przeczytałem trochę na temat HP, THP. Jestem bardzo zaintrygowany twoim komentarzem. To naprawdę się kształtuje, stary. Ta ostatnia część - tylko HP - czy mam to interpretować w ten sposób, że mogę zamontować system plików do odczytu / zapisu na górze strony montowania? Na przykład, plik obrazu zamontowany w pętli z uchwytu strony głównej? Zapisywalny?
mikeserv
Tak, i jest zapisywalny, gdy jest poprawnie zamontowany, ale należy pamiętać: 1. Odkąd go zainstalowałeś, jesteś odpowiedzialny za czyszczenie 2. To marnotrawstwo: Na podstawie przykładu, powiedzmy, że twoja pętla zawierała tylko plik tekstowy z Postacie: Cześć, nazywam się Mike. Zakładając, że każdy znak ma rozmiar 1k, plik zostanie zapisany jako 23k. Zmarnowałeś 2025 tys., Ponieważ Hugepage dał ci 2 MB. To marnotrawstwo powoduje, że zarządzanie pamięcią zostało wbudowane w jądro. Zapobiega nam także potrzebowanie otoki biblioteki DLL, takiej jak kernel32
eyoung100 16.04.14
i na koniec 3. Tracisz swojego wierzchowca po ponownym uruchomieniu lub awarii.
eyoung100 16.04.14
4

Aby rozwiązać problem „DirectMap”: jądro ma liniowe („bezpośrednie”) mapowanie pamięci fizycznej , niezależne od wirtualnych mapowań przydzielonych każdemu procesowi użytkownika.

Jądro używa do mapowania jak największej liczby stron, aby zmniejszyć presję TLB.

DirectMap1G jest widoczny, jeśli Twój procesor obsługuje strony 1 Gb (Barcelona wzwyż; niektóre środowiska wirtualne wyłączają je), a jeśli jest włączony w jądrze - domyślnie jest włączony dla wersji 2.6.29+.

GreenReaper
źródło
3

Nie ma różnicy między shmi tmpfs(tak naprawdę tmpfsto tylko nowa nazwa byłego shmfs). hugetlbfsto tmpfsoparty na systemie plików system, który przydziela swoją przestrzeń z ogromnych stron jądra i wymaga dodatkowego nakładu na konfigurację (sposób korzystania z tego wyjaśniono w Documentation / vm / hugetlbpage.txt ).

Andreas Wiese
źródło
To była dobra próba i oczywiście przeczytałem te dokumenty. A może nie, oczywiście - ale myślę, że zamierzam wystawić to na nagrodę za 100 powtórzeń, ale zanim to zrobię, zaoferuję ci to, jeśli możesz to rozwinąć. Do tej pory jeszcze nie wzbogaciłeś mojego zrozumienia - znałem już większość, z wyjątkiem tego, że te dwa były jedynie synonimami. W każdym razie, jeśli potrafisz udzielić lepszej odpowiedzi do jutra rano, nagroda za 100 powtórzeń jest twoja. Szczególnie interesujące dla mnie jest to, że w ogóle nie ma wzmianki DirectMapna procfs manstronie. Dlaczego?
mikeserv
1
@mikeserv - Znalazłem tę różnicę, która pokazuje, jaką funkcję obliczają DirectMapy na podstawie: lkml.org/lkml/2008/11/6/163
slm