Odpowiedzi:
/dev/shm
to system plików tymczasowego przechowywania plików, tj. tmpfs , który wykorzystuje pamięć RAM do przechowywania kopii zapasowych. Może działać jako implementacja pamięci współużytkowanej, która ułatwia IPC .
Ostatnie kompilacje jądra Linuksa 2.6 zaczęły oferować / dev / shm jako pamięć współdzieloną w postaci ramdysku, a dokładniej jako katalog do zapisu na świecie, który jest przechowywany w pamięci ze zdefiniowanym limitem w / etc / default / tmpfs. Obsługa / dev / shm jest całkowicie opcjonalna w pliku konfiguracyjnym jądra. Jest domyślnie dołączany zarówno do dystrybucji Fedora, jak i Ubuntu, gdzie jest najczęściej wykorzystywany przez aplikację Pulseaudio. (Podkreślenie dodane.)
/tmp
to lokalizacja plików tymczasowych zgodnie z definicją w standardzie hierarchii systemów plików , po której znajdują się prawie wszystkie dystrybucje Uniksa i Linuksa.
Ponieważ pamięć RAM jest znacznie szybsza niż pamięć dyskowa, można jej użyć /dev/shm
zamiast /tmp
do zwiększenia wydajności , jeśli proces wymaga intensywnych operacji we / wy i intensywnie wykorzystuje pliki tymczasowe.
Aby odpowiedzieć na twoje pytania: Nie, nie zawsze możesz polegać na /dev/shm
obecności, z pewnością nie na maszynach przywiązanych do pamięci. Powinieneś używać, /tmp
chyba że masz bardzo dobry powód do używania /dev/shm
.
Pamiętaj, że /tmp
może być częścią /
systemu plików zamiast osobnego montowania, a zatem może rosnąć w miarę potrzeb. Rozmiar pliku /dev/shm
jest ograniczony nadmiarem pamięci RAM w systemie, dlatego jest większe prawdopodobieństwo, że zabraknie miejsca w tym systemie plików.
/dev/shm
. /dev/shm
to pamięć (tmpfs) wspierana przez dysk (swap). /var/tmp
to pamięć (pamięć podręczna dysku) wspierana przez dysk (system plików na dysku). W praktyce wydajność jest prawie taka sama (tmpfs ma niewielką przewagę, ale nie wystarcza, aby mieć znaczenie). /tmp
może być tmpfs lub nie, w zależności od tego, jak skonfigurował go administrator. Nie ma dobrego powodu, aby używać /dev/shm
w swoich skryptach.
/tmp
jest to normalna lokalizacja (z $TMPDIR
przesłonięciem). Wybór, aby wykonać /tmp
kopię zapasową, inną przestrzeń dyskową lub nic, należy do administratora.
W kolejności malejącej tmpfs
prawdopodobieństwa:
┌───────────┬──────────────┬────────────────┐
│ /dev/shm │ always tmpfs │ Linux specific │
├───────────┼──────────────┼────────────────┤
│ /tmp │ can be tmpfs │ FHS 1.0 │
├───────────┼──────────────┼────────────────┤
│ /var/tmp │ never tmpfs │ FHS 1.0 │
└───────────┴──────────────┴────────────────┘
Ponieważ pytasz o punkt montowania tmpfs specyficzny dla Linuksa w porównaniu z katalogiem przenośnym, którym może być tmpfs (w zależności od twojego sysadmin i tego, co jest domyślne dla twojej dystrybucji), twoje pytanie ma dwa aspekty, na które inne odpowiedzi podkreślały inaczej:
Edycja konserwatywna (połączenie konwencji z FHS i powszechnego użytku):
/tmp
./var/tmp
do dużych danych, które nie mogą łatwo zmieścić się w pamięci RAM./var/tmp
do danych, które są korzystne dla ponownego uruchamiania (np. Pamięci podręcznej)./dev/shm
jako efekt uboczny połączenia shm_open()
. Docelowi odbiorcy są ograniczonymi buforami, które są w nieskończoność nadpisywane. Tak jest w przypadku plików długowiecznych, których zawartość jest niestabilna i niezbyt duża.mktemp
program honoruje TMPDIR
zmienną środowiskową.Edycja pragmatyczna:
Użyj, /dev/shm
gdy ważne jest użycie tmpfs, /var/tmp
gdy ważne jest, aby nie, w przeciwnym razie /tmp
.
fsync
jest zakazem działania na tmpfs. To wywołanie systemowe jest największym wrogiem wydajności (IO) (i długowieczności flash, jeśli ci na tym zależy), chociaż jeśli używasz tmpfs (lub eatmydata) tylko po to, aby pokonać fsync, a następnie (lub inny programista w łańcuchu) robisz coś złego. Oznacza to, że transakcje dotyczące urządzenia pamięci masowej są niepotrzebnie drobiazgowe dla twojego celu - wyraźnie chcesz pominąć niektóre punkty zapisu dla wydajności, ponieważ doszedłeś do skrajności sabotowania ich wszystkich - rzadko najlepszy kompromis. Również tutaj, w krainie wydajności transakcji, znajdują się jedne z największych zalet posiadania dysku SSD - każdy porządny dysk SSD będzie działał nie z tego świata w porównaniu z tym, co może wziąć wirujący dysk (7200 obr./min = 120 Hz , jeśli tylko inne osoby mają do niego dostęp), nie wspominając już o kartach pamięci flash, które różnią się znacznie w zależności od tego wskaźnika (zwłaszcza dlatego, że jest to kompromis z wydajnością sekwencyjną, według której są oceniane, np. ocena klasy karty SD). Więc strzeżcie się,
Chcesz usłyszeć śmieszną historię? Moja pierwsza fsync
lekcja: Miałem zadanie polegające na rutynowym „uaktualnianiu” kilku baz danych Sqlite (przechowywanych jako skrzynki testowe) do ciągle zmieniającego się bieżącego formatu. Struktura „upgrade” uruchamiałaby wiele skryptów, wykonujących co najmniej jedną transakcję, aby zaktualizować jedną bazę danych. Oczywiście zaktualizowałem swoje bazy danych równolegle (8 równolegle, ponieważ zostałem pobłogosławiony potężnym 8-rdzeniowym procesorem). Ale jak się dowiedziałem, nie było żadnego przyspieszenia równoległości (raczej niewielkie trafienie ), ponieważ proces był całkowicie związany z IO. Zabawne jest to, że zawijanie frameworka aktualizacji w skrypcie, który kopiował każdą bazę danych /dev/shm
, uaktualniało ją tam i kopiowało z powrotem na dysk było 100 razy szybsze (wciąż z 8 równolegle). Jako bonus, komputer był użyteczny podczas aktualizacji baz danych.
Właściwe użycie tmpfs polega na uniknięciu niepotrzebnego zapisu lotnych danych. Skutecznie wyłącza zapisywanie zwrotne , takie jak ustawienie /proc/sys/vm/dirty_writeback_centisecs
nieskończoności w zwykłym systemie plików.
Nie ma to wiele wspólnego z wydajnością, w przeciwnym razie jest to znacznie mniejszy problem niż nadużywanie fsync: Limit czasu zapisu określa, jak leniwie zawartość dysku jest aktualizowana po zawartości pagecache, a domyślnie 5 sekund to długi czas dla komputera - aplikacja może nadpisywać plik tak często, jak chce, w pagecache, ale zawartość dysku jest aktualizowana tylko raz na 5 sekund. Chyba że aplikacja wymusi przejście przez fsync, to znaczy. Zastanów się, ile razy aplikacja może w tym czasie wyprowadzić mały plik, a zobaczysz, dlaczego synchronizacja każdego z nich byłaby o wiele większym problemem.
fsync
oczywiście.Przechowywanie zimnych danych. Możesz mieć pokusę, aby myśleć, że udostępnianie plików bez wymiany jest tak samo wydajne jak normalny system plików, ale istnieje kilka powodów, dla których tak nie jest:
mount -t tmpfs "jarno is great" /mnt/jarno
jeśli chcesz! Po trzecie, domyślny rozmiar to połowa pamięci RAM - założę się, że masz 4 GB pamięci RAM.
OK, oto rzeczywistość.
Zarówno tmpfs, jak i normalny system plików są pamięcią podręczną na dysku.
Tmpfs wykorzystuje pamięć i swapspace, ponieważ tworzy kopię zapasową, system plików używa określonego obszaru dysku, żaden z nich nie jest ograniczony wielkością systemu plików, całkiem możliwe jest posiadanie 200 GB tmpfs na maszynie z mniej niż GB pamięci RAM, jeśli masz wystarczająco dużo przestrzeni wymiany.
Różnica polega na tym, kiedy dane są zapisywane na dysku. W przypadku tmpfs dane są zapisywane TYLKO wtedy, gdy pamięć się zapełni lub dane prawdopodobnie nie zostaną wkrótce wykorzystane. OTOH większość normalnych systemów plików Linux jest zaprojektowana tak, aby zawsze mieć mniej lub bardziej spójny zestaw danych na dysku, więc jeśli użytkownik wyciągnie wtyczkę, nie wszystko straci.
Osobiście jestem przyzwyczajony do posiadania systemów operacyjnych, które nie powodują awarii i systemów UPS (np. Baterii laptopów), więc myślę, że systemy plików ext2 / 3 są zbyt paranoiczne z ich 5-10 sekundowym interwałem punktu kontrolnego. System plików ext4 jest lepszy z 10-minutowym punktem kontrolnym, z tym wyjątkiem, że traktuje dane użytkownika jako drugą klasę i nie chroni ich. (ext3 jest taki sam, ale nie zauważasz go z powodu 5-sekundowego punktu kontrolnego)
To częste sprawdzanie oznacza, że niepotrzebne dane są ciągle zapisywane na dysk, nawet dla / tmp.
W rezultacie musisz utworzyć przestrzeń wymiany tak dużą, jak potrzebujesz / tmp (nawet jeśli musisz utworzyć plik wymiany) i użyć tej przestrzeni do zamontowania tmpfs o wymaganym rozmiarze na / tmp.
NIGDY nie używaj / dev / shm.
Chyba, że używasz go do bardzo małych (prawdopodobnie mmap'd) plików IPC i masz pewność, że istnieje (to nie jest standard), a maszyna ma więcej niż wystarczającą ilość pamięci + wymiany.
Użyj / tmp / dla plików tymczasowych. Użyj / dev / shm /, jeśli chcesz pamięci współdzielonej (tj. Komunikacja międzyprocesowa poprzez pliki).
Możesz polegać na tym, że / tmp / istnieje, ale / dev / shm / jest stosunkowo nową rzeczą dla Linuksa.
1>/dev/null 2>&1
. Zrobiłbym to kilka tysięcy razy, więc tmpfs byłby miły. Jednak jeśli wypuść skrypt, w którym nie mogę polegać na tmpfs, /tmp
ponieważ myślę, że nie jest to takie powszechne. Jeśli jest bardziej powszechne, /dev/shm
to jest to dla mnie lepsze. Ale szukam wskazówek dotyczących przenośności itp.
Innym razem, kiedy należy używać / dev / shm (Linux 2.6 i wyżej), gdy trzeba gwarantowana tmpfs systemu plików, ponieważ nie wiem, czy można napisać na dysku.
Znany mi system monitorowania musi zapisywać pliki tymczasowe podczas tworzenia raportu w celu przesłania go na serwer centralny. W praktyce jest o wiele bardziej prawdopodobne, że coś uniemożliwi zapisywanie w systemie plików (brak miejsca na dysku lub podstawowa awaria RAID spowodowała, że system przeszedł w sprzętowy tryb tylko do odczytu), ale nadal można utykać, aby ostrzec o tym, czy coś spiralnie zapełnia całą dostępną pamięć, tak że tmpfs będzie bezużyteczny (a pudełko nie będzie martwe). W takich przypadkach system monitorowania preferuje zapisywanie do pamięci RAM, aby potencjalnie móc wysłać ostrzeżenie o pełnym dysku lub martwym / umierającym sprzęcie.
/ dev / shm służy do sterowników i programów specyficznych dla systemu pamięci wirtualnej.
Jeśli tworzysz program, który wymaga sterty pamięci wirtualnej, którą należy zamapować na pamięć wirtualną. Jest to dwukrotne, więc jeśli potrzebujesz wielu procesów lub wątków, aby mieć bezpieczny dostęp do tej pamięci.
Faktem jest, że tylko dlatego, że sterownik używa do tego specjalnej wersji tmpfs, nie oznacza to, że powinieneś używać go jako ogólnej partycji tmpfs. Zamiast tego powinieneś po prostu utworzyć kolejną partycję tmpfs, jeśli chcesz ją dla swojego katalogu tymczasowego.
W PERL, mając minimum 8 GB na dowolnej maszynie (wszystkie z uruchomioną Linux Mint), uważam, że dobrym nawykiem jest wykonywanie złożonych algorytmów opartych na pliku DB_ (struktura danych w pliku) z milionami odczytów i zapisów przy użyciu / dev / shm
W innych językach, gdzie nie ma miejsca na gigether, aby uniknąć startów i zatrzymań w transferze sieciowym (praca lokalna na pliku znajdującym się na serwerze w atmosferze klient-serwer), używając pliku wsadowego pewnego rodzaju, skopiuję plik cały plik (300-900 MB) do / dev / shm, uruchom program z wyjściem do / dev / shm, zapisz wyniki z powrotem na serwer i usuń z / dev / shm
Oczywiście, gdybym miał mniej pamięci RAM, nie zrobiłbym tego. Zwykle system plików w pamięci / dev / shm odczytuje jako rozmiar stanowiący połowę dostępnej pamięci RAM. Jednak zwykłe użycie pamięci RAM jest stałe. Tak naprawdę nie można tego zrobić na urządzeniu o pojemności 2 GB lub mniejszej. Aby zmienić parafrazę w hiperbolę, w pamięci RAM często występują rzeczy, których nawet system nie zgłasza dobrze.
/dev/shm
istnieje, użyję go, jeśli tak, lub wrócę do/tmp
. Czy to brzmi dobrze?