Czy potrzebuję przestrzeni wymiany, jeśli mam więcej niż wystarczającą ilość pamięci RAM?

91

Z tego, co rozumiem, celem partycji wymiany w systemie Linux jest uwolnienie niektórych „nie tak często używanych” informacji z pamięci RAM i przeniesienie ich do określonej partycji na dysku twardym (kosztem spowolnienia odczytu lub zapisu do), zasadniczo umożliwiając aktywnym aplikacjom więcej „szybkiej pamięci”.

Jest to świetne, gdy jesteś na komputerze z małą ilością pamięci RAM i nie chcesz mieć problemów, jeśli skończy Ci się. Jeśli jednak Twój system ma 16 GB lub 32 GB pamięci RAM i zakładasz, że nie korzystasz z bazy danych MySQL dla StackExchange ani nie edytujesz filmu o pełnej długości 1080p w systemie Linux, czy należy użyć partycji wymiany?

IQAndreas
źródło
16
@ Mikeserv Wiesz, chciałbym zaakceptować te dwie litery jako odpowiedź tylko dla efektu komediowego.
IQAndreas,
3
@Janis - kosztuje dużo. I możesz łatwo zrobić bez wymiany nawet na maszynie 1 GB, jeśli zaimplementujesz zarządzanie pamięcią dźwięku. Zamiana kosztuje wydajność - kiedy ją masz, jądro z niej nieuchronnie skorzysta. Tak więc na dysku o pojemności 1 TB lub innym rozmiarze tworzącym partycję wymiany jest zaproszenie do jądra, aby umieścić strony pamięci na dysku zamiast trzymać je w pamięci RAM lub całkowicie je upuścić. Przy 16 GB typowy użytkownik nigdy nie podejdzie do korzystania z tego wszystkiego - mam 24 GB pamięci RAM z 2 GB pamięci i 10 GB pamięci podręcznej (ponieważ miałbym torrent do /tmp) po 3 dniach bezczynności .
mikeserv
5
@ Mikeserv, mylisz się, obawiam się; Ciągle obserwowałem wyświetlane parametry dysku. Dopóki dostępna jest wolna pamięć, zamiana nie była używana, tylko gdy pamięć została zapełniona, rozpoczęło się zamiana. Myślę, że to zależy od tego, jak korzystasz z komputera; system pulpitu, który jest zamykany co wieczór, rzadko napotyka problemy z pamięcią, ale mój system miał okresy przestoju kilka miesięcy. Tak, zamiana kosztuje wydajność, ale jeśli nie ma już miejsca w pamięci RAM, system może kontynuować pracę. Jaką masz opcję? Może możesz rozwinąć argument dotyczący zarządzania pamięcią. Używam mojego systemu Linux jako wstępnie skonfigurowanego.
Janis,
40
@mikeserv, w jaki sposób opublikowałeś komentarz krótszy niż 15 znaków?
immibis
11
@immibis jest 12 zerowej szerokości przestrzeni tam
dave

Odpowiedzi:

98

Tak.

Zdecydowanie zawsze powinieneś mieć włączoną zamianę, chyba że istnieje bardzo ważny, zakazujący powód (np. Brak dysku lub tylko dysk sieciowy). Czy powinieneś mieć zamianę w kolejności często zalecanych śmiesznych rozmiarów (takich jak dwukrotność pamięci RAM)? No, no .

Powodem jest to, że zamiana jest przydatna nie tylko wtedy, gdy aplikacje zużywają więcej pamięci niż fizyczna pamięć RAM (w rzeczywistości w takim przypadku zamiana wcale nie jest bardzo przydatna, ponieważ ma poważny wpływ na wydajność). Główną zachętą do wymiany obecnie nie jest magiczne przekształcenie 16 GB pamięci RAM w 32 GiB, ale bardziej efektywne wykorzystanie zainstalowanej, dostępnej pamięci RAM.

Na nowoczesnym komputerze pamięć RAM nie jest nieużywana. Niewykorzystana pamięć RAM to coś, czego równie dobrze można nie kupić i zaoszczędzić. Dlatego buforowane jest wszystko, co ładujesz lub cokolwiek, co inaczej jest mapowane w pamięci, wszystko, co może być ponownie wykorzystane przez kogokolwiek później (ograniczone przez ograniczenia bezpieczeństwa). Wkrótce po uruchomieniu komputera cała fizyczna pamięć RAM zostanie do czegoś wykorzystana .

Ilekroć poprosisz o nową stronę pamięci z systemu operacyjnego, menedżer pamięci musi podjąć świadomą decyzję:

  1. Wyczyść stronę z bufora pamięci podręcznej
  2. Wyczyść stronę z mapowania (w rzeczywistości taka sama jak nr 1 w większości systemów)
  3. Przenieś stronę, do której nie uzyskiwano dostępu przez długi czas - najlepiej nigdy - aby zamienić (może to nawet nastąpić proaktywnie, niekoniecznie w ostatniej chwili)
  4. Zabij swój proces lub zabij losowy proces (OOM)
  5. Panika z jądra

Opcje # 4 i # 5 są bardzo niepożądane i pojawią się tylko wtedy, gdy system operacyjny nie będzie miał innego wyboru. Opcje 1 i 2 oznaczają, że wyrzucasz coś, co prawdopodobnie będzie wkrótce potrzebne. Wpływa to negatywnie na wydajność.

Opcja nr 3 oznacza przeniesienie czegoś, czego (prawdopodobnie) nie potrzebujesz wkrótce, na wolne miejsce. To dobrze, ponieważ teraz coś, czego potrzebujesz, może korzystać z szybkiej pamięci RAM.

Usuwając opcję # 3, skutecznie ograniczyłeś system operacyjny do robienia # 1 lub # 2. Przeładowanie strony z dysku jest tym samym, co przeładowanie ze swapu, z tym wyjątkiem, że przeładowanie ze swapu jest zwykle mniej prawdopodobne (z powodu podjęcia właściwych decyzji stronicowania).

Innymi słowy, poprzez wyłączenie wymiany nie zyskujesz nic, ale ograniczasz liczbę użytecznych opcji systemu operacyjnego w obsłudze żądania pamięci. Co może nie być , ale najprawdopodobniej może być wadą (i nigdy nie będzie zaletą).

[EDYTOWAĆ]

Uważny czytelnik strony mmap podręcznika , w szczególności jej opis MAP_NORESERVE, zauważy kolejny dobry powód, dla którego zamiana jest w pewnym stopniu konieczna nawet w systemie z „wystarczającą” pamięcią fizyczną:

„Gdy przestrzeń wymiany nie jest zarezerwowana, SIGSEGV może otrzymać zapis, jeśli nie jest dostępna pamięć fizyczna.”

- Poczekaj chwilę, co to znaczy?

Jeśli zamapujesz plik, możesz uzyskać dostęp do jego zawartości bezpośrednio, jak gdyby magicznie jakoś znajdował się w przestrzeni adresowej twojego programu. Aby uzyskać dostęp tylko do odczytu, system operacyjny potrzebuje w zasadzie nie więcej niż jednej strony pamięci fizycznej, którą może ponownie wypełnić różnymi danymi za każdym razem, gdy uzyskujesz dostęp do innej strony wirtualnej (ze względów wydajnościowych nie jest to oczywiście zrobione, ale w zasadzie można uzyskać dostęp do danych o wartości terabajtów za pomocą jednej strony pamięci fizycznej). A co jeśli ty teżzapisać do mapowania pliku? W takim przypadku system operacyjny musi mieć fizyczną stronę - lub przestrzeń wymiany - gotową na każdą zapisaną stronę. Nie ma innego sposobu na zachowanie danych, dopóki proces zapisu brudnych stron nie wykona pracy (co może potrwać kilka sekund). Z tego powodu system operacyjny rezerwuje (ale niekoniecznie zawsze zatwierdza) przestrzeń wymiany, więc jeśli piszesz do mapowania, podczas gdy strona fizyczna nie jest nieużywana (to całkiem możliwe i normalne warunki), „ re gwarantuje , że będzie nadal działać.

A co jeśli nie będzie wymiany? Oznacza to, że nie można zarezerwować wymiany (duh!), A to oznacza, że ​​gdy nie ma już wolnych stron fizycznych i piszesz na stronie, otrzymujesz przyjemną niespodziankę w postaci otrzymywania procesu błąd segmentacji i prawdopodobnie został zabity.

[/EDYTOWAĆ]

Jednak tradycyjna rekomendacja dokonywania zamiany dwa razy więcej pamięci RAM jest bezsensowna. Chociaż miejsce na dysku jest tanie, przypisywanie takiej wymiany nie ma sensu. Marnowanie czegoś, co jest tanie, wciąż jest marnotrawstwem i absolutnie nie chcesz ciągle wymieniać i wyłączać działających zestawów o rozmiarach kilkuset megabajtów (lub więcej).

Nie ma jednego „prawidłowego” rozmiaru wymiany (jest tyle „prawidłowych” rozmiarów, ile użytkowników i opinii). Zwykle przypisuję stałe 512 MB, niezależnie od wielkości pamięci RAM, co dla mnie działa bardzo dobrze. Powodem tego jest to, że 512 MB to obecnie coś, na co zawsze możesz sobie pozwolić, nawet na małym dysku. Z drugiej strony dodanie kilku gigabajtów wymiany nie jest niczym lepszym. Nie będziesz ich używać, chyba że coś pójdzie nie tak.

Nawet na dysku SSD zamiana jest o rząd wielkości wolniejsza niż pamięć RAM (ze względu na przepustowość i opóźnienie magistrali) i chociaż jest bardzo dopuszczalne przeniesienie czegoś do zamiany, które prawdopodobnie nie będzie ponownie potrzebne (tj. Najprawdopodobniej nie będziesz zamieniając go ponownie, więc twoja pula dostępnych stron jest skutecznie powiększana za darmo), jeśli naprawdę potrzebujesz znacznej ilości swapów (to znaczy, że masz aplikację, która wykorzystuje np. zestaw danych 50GiB), jesteś prawie zagubiony.

Gdy komputer zacznie wymieniać strony na gigabajty, wszystko zaczyna się indeksować. Tak więc dla większości ludzi (w tym dla mnie) nie jest to opcja, a więc taka zamiana nie ma sensu.

Damon
źródło
7
Zupełnie nieprawda: jądro może nie korzystać z dysku, zwłaszcza jeśli skonfigurowałeś OOM zgodnie ze specyfikacją. Jeśli zabójca OOM jest skonfigurowany do obsługi czyszczenia, korzystne
mikeserv
22
Jaka jest różnica między posiadaniem 8 GB pamięci RAM i 8 GB wymiany i 16 GB pamięci RAM bez wymiany? Jeśli komputer zdecyduje, że potrzebuje 16,001 GB pamięci, czy nie zacznie tak samo czyścić / zabijać (ale wydajność zacznie się kraterować, zanim zacznie się dziać)?
Nick T
5
@NickT: Zamiana nie dotyczy więcej pamięci RAM, ale czerwonej flagi, że coś wkrótce zostanie zabite. Lubię mieć czerwoną flagę przed zabiciem, niż proces „losowy” znika na moich oczach.
Mooing Duck
10
-1 ta odpowiedź nie ma sensu. Dlaczego, do cholery, wolniejsza pamięć (zamiana) ma lepszą wydajność niż ta sama ilość szybszej pamięci (RAM)? w pewnym momencie trzeba przyznać dość RAM oznacza brak konieczności wymiany jest ..
Mehrdad
14
@Mehrdad: To z pewnością ma sens. Wolniejsza pamięć (zamiana) poprawia wydajność, o ile „wolniejsze” nie ma znaczenia dla rzeczy, do których masz dostęp rzadko lub nigdy. Zamiana skutecznie zwiększa ilość pamięci dostępnej dla „gorących” danych poprzez przeniesienie „zimnych” danych na zewnątrz. Demony, które wykonują coś tylko raz na godzinę lub pamięć przydzieloną przez moduł jądra, który jest domyślnie ładowany, ale nigdy nie jest używany, są tego przykładem. Można zamienić z tych , czy można zamiast spaść stron z pamięci podręcznej. Który jest lepszy?
Damon
50

Nie zgadzam się z kilkoma opiniami, które tu widzę. Nadal będę tworzyć partycję SWAP, szczególnie w środowisku produkcyjnym. Robię to również dla moich domowych maszyn i maszyn wirtualnych.

Obecnie oceniam je około 1-1,5 razy pamięci. Pamięć 2 razy była regułą. Dysk wymiany jest „tani”, ponieważ nie wymaga tworzenia kopii zapasowej ani ochrony.

Jeśli zabraknie ci pamięci, miejsce na zamianę da ci trochę czasu i poduszki, aby rozwiązać problem.

Zrozum, że rzeczy takie jak / tmp mogą znajdować się w przestrzeni wymiany.

Obszar wymiany może przechowywać częściowy zrzut jądra, aby można go było przywrócić przy następnym uruchomieniu. Może to być przydatne w przypadku niektórych przyszłych sytuacji awaryjnych związanych z debugowaniem.

mdpc
źródło
16
+1. Zamiana oznacza różnicę między zranioną wydajnością przy małej ilości pamięci a poważną awarią.
Davidmh,
6
@ mikeserv bez względu na to, jak ją skonfigurujesz, jeśli twój program spróbuje przydzielić więcej pamięci niż jest dostępna, coś się zawiesi lub system operacyjny zacznie je zabijać.
Davidmh,
6
@Davidmh: Z tego powodu twój plik wymiany musi być nieskończenie duży, w przeciwnym razie twoje programy nadal ulegną awarii, gdy wyczerpią plik wymiany.
Mehrdad
6
@ Mehrdad, ale jest też droższy. Biorąc pod uwagę, że masz X GB pamięci RAM, ponieważ to tyle, ile możesz sobie pozwolić, jest to zdecydowanie gorsze niż posiadanie X GB pamięci RAM i Y wymiany, dla niektórych rozsądnych wartości Y (które będą zależeć od twojego użycia i wielkości twój HD).
Davidmh,
9
„Twoja przestrzeń wymiany daje ci trochę czasu i poduszki na rozwiązanie problemu” - Oznacza to również, że muszę siedzieć znacznie dłużej przed niereagującą maszyną, aż wyciek pamięci „sam się„ rozwiąże ”.
Raphael
23

Może:

Długo zastanawiałem się nad tym tematem i widziałem, jak opinie padają po obu stronach argumentu więcej razy, niż mogę zliczyć. Moje podejście polegało na opracowaniu sposobu na sprawdzenie.

Zacznij od aktywnej partycji wymiany o rozmiarze, który Twoim zdaniem jest wystarczający.

Następnie otwórz terminal w obszarze roboczym i wydaj polecenie, free -hs 1które będzie raportować użycie co sekundę.

Opcjonalnie przejdź do innych obszarów roboczych.

Zrób wszystko, co najprawdopodobniej zrobisz, a potem jeszcze trochę. Uruchom wszystkie popularne aplikacje naraz, przeglądaj wiele kart i desperacko spróbuj dać systemowi prawdziwy trening, co może oznaczać ponowne zakodowanie 1/2 tuzina filmów podczas wykonywania operacji kompilacji i sprawdzania poczty e-mail lub czegokolwiek innego. Spójrzmy prawdzie w oczy fakty, to wszystko o tym, jak można korzystać z systemu.

Kiedy czujesz, że masz system pod dużym obciążeniem (lub tak wysokim, jak to się zwykle zdarza, a potem niektórym), spójrz na terminal i sprawdź wyniki. lub jeszcze lepiej przekieruj dane wyjściowe do pliku, dodając >output.txtdo polecenia, abyś mógł zbadać pełny przebieg. Jeśli użyty Swap nigdy nie przekracza wartości wolnej od Mem, nie potrzebujesz wymiany. Jeśli tak, to robisz. free.png

Nie potrzebuję zamiany. Może ty. Dlaczego nie dowiesz się?

Jeśli chodzi o zamianę rozmiaru, reguły praktyczne są zwykle zawyżone, ponieważ jest to pytanie oparte na użyciu.

Starszy Geek
źródło
2
Czy mówisz, że swap jest używany tylko wtedy, gdy Twój system tego absolutnie wymaga? W takim przypadku, czy kiedykolwiek jest kara za włączenie wymiany - na wszelki wypadek? Inne komentarze wydają się sugerować, że nawet obecność zamiany może mieć negatywny wpływ na wydajność?
MrWhite
3
@ w3d Nie, nie mówię tego. Jak widać z moich danych wyjściowych powyżej, swap jest używany, nawet jeśli nie jest wymagany. można to nieco zmienić za pomocą współczynnika swapiness. Mówię o konieczności wymiany, czy nie.
Starszy Geek
Skrypt ten można zwiększyć do swapa w górę za każdym razem swappodchodzi free?
JFA
@JFA Nie widziałem tego. Osobiście mam trudności z koncepcją zarezerwowania do tego celu nieokreślonej ilości przestrzeni wymiany. Teoretycznie wszystkie rzeczy są możliwe. Interesująca jest faza implementacji.
Elder Geek
17

UWAGA: Zdarzyło mi się to w konkretnej, nietypowej sytuacji. Jeśli rozwiązujesz problem, może to być przydatne. Nie chcę sugerować, że WSZYSTKIE maszyny MUSZĄ mieć zamianę.

MOŻE!

W przeszłości miałem problemy z „urządzeniem”, które zbudowałem, działając pod Linuksem - działając na kompaktowym urządzeniu flash, nie chciałem nosić swojego CF za pomocą swapu i było wystarczająco dużo pamięci dla aplikacji.

Większość z tych urządzeń działała dobrze, ale na szczególnie obciążonym urządzeniu napotkałem problem:

FRAGMENTACJA PAMIĘCI

Bez przestrzeni wymiany pamięć stopniowo stawała się coraz bardziej pofragmentowana, szczególnie w przypadku długotrwałych procesów (mimo że miałem dużo wolnej pamięci, wszystko było bardzo małe). Wstawiłem trochę przestrzeni wymiany i powiedziałem Linuksowi, żeby nie korzystał z niego, chyba że musiał; to całkowicie rozwiązało problem.

Oprócz wszystkiego innego, przestrzeń wymiany pozwala na przenoszenie pamięci, defragmentację. Jeśli masz pofragmentowaną pamięć i potrzebujesz jednego dużego fragmentu, fragmenty zostaną zamienione; kiedy są zamieniane z powrotem, są skutecznie defragmentowane.

Sprawdź / proc / buddyinfo - moje wygląda teraz tak:

Node 0, zone      DMA      9      5      3      4      2      3      2      2      3      3      1 
Node 0, zone    DMA32  33901   1149      0      0      0      0      0      0      0      0      1 
Node 0, zone   Normal   2414   1632    259     22      3      0      2      0      1      1      0 

Liczby reprezentują bloki o różnych rozmiarach; każdy rozmiar jest o połowę mniejszy od następnego bloku, od 4 MB bloków po lewej stronie, do 4 KB po prawej stronie (czyli 4 MB, 2 MB, 1 MB itd.). Nowo uruchomiona maszyna powinna mieć wszystkie bloki po lewej stronie, bardzo mało po prawej (= nie podzielone). Pamiętaj również, że ta sama ilość pamięci (np. 4 MB) będzie reprezentowana przez różne liczby w kolumnach - 1 blok w kolumnie najbardziej po lewej stronie, 1024 w kolumnie po prawej stronie.

Pamięć jest przydzielana z puli, która jest jak najbardziej prawidłowa; np. jeśli twój program chce 12kb pamięci (za jednym razem), pobierze ją z kolumny 16kb; reszta pojawi się w kolumnie 4kb. Jeśli nie ma bloków 16 kb, pobierze je z bloków 32 kb, w wyniku czego pozostaną 16 kb i 4 kb, i tak dalej.

Jeśli nie ma wystarczająco dużych bloków pamięci, A MASZ SWAP SPACE, to np. Jeśli chcesz 16kb pamięci, znajdzie najmniej używany blok 16kb (który może np. Zawierać używany blok 4kb, dostępny blok 4kb, i jeszcze 2 używane bloki 4kb), przenieś części USED tylko do zamiany i przydziel wolną pamięć nowej aplikacji.

W pudełku, który się rozbił, miałem setki tysięcy bloków 4kb i 8kb i niewiele więcej.

TAK DALEKO, JAK MOGĘ POWIEDZIEĆ (przechodząc przez uszkodzone maszyny!) Jądro będzie przenosić się z pamięci do zamiany i zamiany do pamięci, ale nigdy nie przejdzie z pamięci do pamięci.

AMADANON Inc.
źródło
3
Twoja skrzynka wygląda na dobrą do przydzielania / implementowania stron o dużych rozmiarach. Pozwoliłoby to uniknąć problemów związanych z fragmentacją (ponieważ przydzielona strona o określonym rozmiarze, po przydzieleniu, będzie odtąd i na zawsze będzie przydzielana ponownie tylko w tym rozmiarze) .
mikeserv
2
To najlepszy powód, dla którego czytałem na korzyść korzystania z partycji wymiany. Próbowałem szybkiego wyszukiwania i nie znalazłem odniesienia do tego, zastanawiam się, dlaczego ta funkcja nie jest częściej dokumentowana.
Do 마 SE
1
(nieprzejrzyste) fragmenty aplikacji mogą nie być użyteczne. Zwykle mogą z nich korzystać aplikacje wymagające dużej ilości pamięci; np. serwery baz danych, java jvm. Muszą być jawnie włączone i stają się oddzielną pulą pamięci, której nie można wykorzystać do innych celów. To może być dobre lub złe, w zależności od okoliczności. Dowiedz się także o przezroczystych stronach. Próbują one przenosić różne elementy, tak abyś korzystał ze stron (w celu poprawy wydajności), nawet jeśli Twoje aplikacje nie wiedzą, jak to zrobić. Jeśli pamięć jest pofragmentowana, rzeczy mogą pójść na południe, ponieważ zamiatarka stron internetowych ma więcej do zrobienia.
Dan Pritts,
1
Nie wątpię w twoje wrażenia z korzystania z urządzenia flash, po prostu nie jestem przekonany, że przedstawiony przypadek jednorazowego użycia prawdopodobnie oznacza zamianę i nie jestem przekonany, że fragmentacja pamięci jest związana z zamianą, czy nie. Rodzi to interesujące pytanie, które można łatwo przetestować, udowodnić lub obalić.
Starszy Geek
1
Pytanie uzupełniające . Co rozumiesz przez „fragmentację pamięci”? MMU nie dba o to, czy fizyczne strony używane dla kolejnych stron w jakiejś wirtualnej przestrzeni adresowej są kolejne, czy nie. Strony fizyczne są pofragmentowane, ale to nie ma znaczenia (o ile mówimy o zwykłej pamięci aplikacji na maszynie fizycznej w jednym klastrze, a nie np. O stronach pamięci używanych przez urządzenie peryferyjne lub hiperwizora). Gdy program prosi o 16 kB, otrzymuje cztery strony, które mogą, ale nie muszą być blisko siebie w pamięci fizycznej.
Gilles,
15

Partycja wymiany ma znaczącą wartość ponad to, że po prostu działa jako dodatkowa pamięć RAM, gdy skończy się.

Po pierwsze, Linux zużywa jak najwięcej pamięci do buforowania plików i operacji IO, jeśli masz jakąś zamianę, może się okazać, że więcej pamięci trafia do buforowania IO i przyspiesza (minimalizując dostęp do dysku i zmniejszając zużycie dysków SSD) w przeciwieństwie do do przechowywania danych, które jakiś program przydzielił, ale wykorzystuje tylko raz na 12 godzin, co może mieć miejsce w przypadku niektórych demonów.

Ponadto Linux stosuje optymistyczną strategię alokacji pamięci, dzięki której pozwoli na nominalną alokację stron, nawet jeśli nie ma pewności, czy ma prawdziwą pamięć do ich wypełnienia. Jest to bardziej wydajne niż odpowiednie sprawdzanie i mapowanie każdego przydziału i zwykle nie powoduje problemów. Jednak heurystyka, której jądro używa do ustalenia, czy zezwolenie na przydział jest rozsądne, obejmuje poziom wymiany dostępny w systemie, dlatego przydziały mogą być szybsze, jeśli system ma dużo swapów, nawet jeśli nie jest często używany.

Te czynniki razem sprawiają, że osobiście uważam, że lepiej jest mieć zamianę na prawie każdym normalnym systemie, jednak w przypadku dużych rozmiarów pamięci RAM ignoruję zasadę pamięci RAM * 2 i po prostu ograniczam swap do wielkości 4–8 GB (w zależności od rozmiaru dysku ).

Rzeczywistość
źródło
9
Nawet 4 GB jest za duże na komputer stacjonarny. Wolę, aby zabójca OOM aktywował się, zanim zaczeka na tyle wymiany, aby coś się zapełniło, jeśli coś pójdzie nie tak. (Gdybym kiedykolwiek natknął się na przypadek, w którym potrzebowałem więcej, mogłem dd i mkswap wymiany pliku przed uruchomieniem jakiejkolwiek wielkiej pracy wymagającej więcej pamięci wirtualnej niż moja maszyna miała pamięć RAM. To znaczy, jeśli wyjście z przeglądarki nie zwolniło wystarczająco dużo ...)
Peter Cordes,
@PeterCordes To prawdopodobnie zależy od tego, jakie zadania wykonujesz, całkowicie rozumiem. Osobiście uważam, że czerpię korzyści z wysokiego poziomu wymiany, ponieważ często wykonuję długie kompilacje z niskim priorytetem w tle podczas korzystania z mojego komputera, a następnie są one zamieniane, gdy pamięć jest w przeciwnym razie napięta (zwykle gdy maszyna jest zbyt zajęta, aby wykonać jakąkolwiek kompilację tak czy siak). Mimo to zgadzam się, że jest to bardzo osobista sprawa oparta na obciążeniu pracą, przed podjęciem decyzji należy zawsze pomyśleć o własnym użyciu.
Rzeczywistość
1
zabawna historia: właśnie dzisiaj, na moim laptopie z 4 GB pamięci RAM, zamianą 0,5G (SSD), firefox uruchomił zabójcę OOM (który wybrał firefoxa). Nie zdarzyło mi się to wcześniej. (Chociaż korzystałem z laptopa częściej niż zwykle). Prawie nic innego nie działało (tylko terminal gnome w xfce). Myślę więc, że nie mam nic przeciwko, ponieważ Firefox powinien wiedzieć lepiej, niż wiązać tyle pamięci RAM. Jakiś czas temu ktoś powiedział: „istnieją przeglądarki internetowe do testowania obciążeniowego podsystemu pamięci wirtualnej” lub coś w tym rodzaju. Firefox jest dość kiepski w zwalnianiu pamięci podręcznych dla kart, które nie były używane przez wiele dni itp.
Peter Cordes
3
Jednym z przypadków, w których Linux rozważa dostępną przestrzeń wymiany jest sytuacja, gdy duży proces próbuje uruchomić dziecko: wywołania systemowe fork () + exec () zaczynają się od z grubsza powielenia alokacji rodzica - jądro nie może zagwarantować, że nowe dziecko będzie mniejsze niż rodzic. Przestrzeń wymiany zwykle nie jest używana, ale jeśli nie jest dostępna, fork () może zawieść. Typowym przykładem na kliencie jest przeglądarka uruchamiająca wtyczkę lub na serwerze, gdy duży kontener aplikacji wywołuje program pomocniczy. 1/2 lub 1GiB swapu zwykle wystarcza do rozwiązania problemu. Google „java exec nie może przydzielić pamięci”
James
13

Nigdy nie powinieneś mieć swapu większego niż maksymalny rozmiar, który byłbyś w stanie tolerować, czekając, aż jądro zamieni się we / wy; w przeciwnym razie po prostu tworzysz nowy tryb awarii dla swojego systemu (stajesz się niemożliwy do naprawienia podczas wymiany). Zauważ, że pomimo nowoczesnych dysków zdolnych do transferu rzędu GB / s, Linux zazwyczaj może przesuwać swap tylko z szybkościami większymi niż setki kB, a najlepiej trochę MB, na sekundę. Tak duża zamiana może sprawić, że Twój system będzie bezużyteczny przez kilka minut, godzin, a nawet dni.

Jeśli masz wystarczającą pamięć fizyczną do tego, co robisz, idealnym rozmiarem wymiany jest dopasowanie jej do ilości „niepotrzebnych danych”, które procesy utrzymują, ale nigdy ich nie używają. Jest to prawdopodobnie w zakresie od kilku do kilkuset megabajtów. Ta strategia pozwala na wykorzystanie całej pamięci fizycznej do buforowania użytecznych informacji, a nie jako trwałego magazynu danych, które prawdopodobnie nigdy nie zostaną ponownie wykorzystane.

Jeśli nie masz wystarczającej pamięci fizycznej, musisz ocenić, czy możesz tolerować poważne spowolnienie z powodu dużej zamiany. Jeśli tak, zawierające do 1-2 GB swap może mieć sens, a może nawet do 4 GB, jeśli masz bardzo szybkich dysków. Ale wszystko to tylko pogorszy tryby awarii systemu i powinieneś rozważyć zakup większej ilości pamięci RAM.

R ..
źródło
2
Myślę, że to najlepsza odpowiedź. Jeśli masz za dużo miejsca wymiany, może to spowodować, że maszyna całkowicie nie będzie reagować z powodu wszystkich zamian. Oznacza to, że nie możesz zabić przestępcy. Jeśli zmniejszysz przestrzeń wymiany, zabójca OOM automatycznie wykona za ciebie zadanie. Argumenty w innych odpowiedziach dotyczące buforowania buforów plików są całkowicie nieprzekonujące. Powinieneś mieć swap, aby jądro mogło przenosić bufory plików do swap ... który jest na dysku? Proszę.
Timmmm,
Jedyny argument przeciwko przestrzeni wymiany, jaki mogę znaleźć, to: „jakiś program przecieka pamięć”. I? Jeśli zabójca OOM zabija ważną rzecz, której nie uratowałeś, skutecznie straciłeś pracę. Co oznacza, że ​​ten argument staje się zupełnie nieistotny, mogę po prostu wymusić zamknięcie mojego komputera, aby uzyskać dokładnie taki sam efekt, a jednocześnie mieć dużą przestrzeń wymiany dla zadań o niskim priorytecie, które zużywają dużo pamięci i często są zamieniane. Jeśli twoja maszyna utknie w takim stanie, to twoja wina. Jedyny raz przydarzyło mi się to, kiedy sam napisałem program do zapełnienia całej pamięci roboczej.
Sahsahae
11

Tylko jeśli chcesz mieć możliwość hibernacji w celu zamiany (ta funkcja jest również nazywana „wstrzymaj na dysk” i polega na zapisaniu całej zawartości pamięci RAM i wyłączeniu zasilania). Zwykle jest to używane tylko na laptopach i innych urządzeniach mobilnych, więc to zależy.

Hanetzer
źródło
6

Nie ma uniwersalnej i jasnej odpowiedzi, ponieważ zależy to od zadania, które zamierzasz wykonać. Jeśli masz zamiar uruchomić serwer DB, HTTP, wirtualizacji lub pamięci podręcznej, nigdy nie powinieneś włączać żadnego rodzaju zamiany, niezależnie od ilości pamięci RAM. Jeśli masz komputer stacjonarny lub host do zadań mieszanych i masz ponad 16 GB szybkiej pamięci RAM - spójrz tutaj: zRam

Alexey Vesnin
źródło
zRam to świetny wybór. Użyłem go w połączeniu z małymi systemami pamięci flash, aby uzyskać dobry efekt.
Starszy Geek
1
@ElderGeek Użyłem go również w środowisku bezdyskowym, np. Podczas uruchamiania sieci. Świetna robota, ale są pewne zastrzeżenia: po pierwsze, nie potrzebujesz więcej barana, potrzebujesz SZYBKIEGO. Powolne i tanie moduły pamięci RAM, które prawdopodobnie pasowałyby do ciebie w zwykłej klasycznej obudowie, mogą powodować problem. Należy również wziąć pod uwagę magistralę CPU od przodu: nawet w przypadku, gdy częstotliwość procesora może być mniejsza, ale szybsza częstotliwość FSB znacznie poprawi wydajność. Drugi problem dotyczy szeregu partycji wymiany zRam. Wypróbuj liczby od 1 do liczby rdzeni procesora. Nie używaj w systemach jednordzeniowych!
Alexey Vesnin
Dobre ważne wszystkie punkty. Ponieważ jestem maniakiem wydajności i zawsze projektuję i buduję własne systemy, nie jestem osobiście nękany takimi obawami
Starszy Geek
@ElderGeek też też :) miło cię poznać! Zauważyłem też jedną dziwną rzecz w zachowaniu zRam. Pojawia się i znika w różnych wersjach i konfiguracjach jądra, ale wysoce reprodukowalne w jądrze HZ 100 i 1000. zRam działa dobrze dla 1,2,4 - ale nie więcej partycji. Nawet na 8 i 16 rdzeniach fizycznych na najwyższym sprzęcie przy prawie bezczynnych zadaniach. Pamiętaj o tym, grając z poprawkami! Pozdrowienia z Rosji!
Alexey Vesnin
Nie zgadzam się z „jeśli uruchomisz db, ... nigdy nie powinieneś włączać żadnego rodzaju zamiany, niezależnie od tego, jaki posiadasz RAM.” Zamiana jest zwykle lepsza niż OOM Killer zabijający losowe procesy. Tak, powinieneś mieć wystarczającą ilość pamięci dla uruchomionych aplikacji i tak, użycie dużych ilości swapów może spowolnić system. Zazdroszczę ci życia w idealnym świecie.
AMADANON Inc.
5

Nie ma sposobu, aby stwierdzić, czy potrzebujesz przestrzeni wymiany, czy nie, czy jedynym znanym parametrem jest ilość zainstalowanej pamięci RAM.

W każdym razie istnieje powszechne błędne przekonanie, że posiadanie przestrzeni wymiany ma negatywny wpływ na wydajność systemu. To jest niepoprawne. Tak długo, jak masz wystarczającą ilość pamięci RAM, posiadanie obszaru wymiany bez względu na jego rozmiar wcale nie wpływa negatywnie na wydajność. Na wydajność wpływa brak pamięci RAM i efektywne wykorzystanie przestrzeni wymiany.

  • przypadek 1: Jeśli nie masz przestrzeni wymiany i akurat brakuje pamięci RAM, jądro Linuksa wybierze jeden lub więcej procesów, które jego zdaniem są dobrymi kandydatami, i zabije je.

  • przypadek 2: Jeśli masz miejsce wymiany i brakuje pamięci RAM, jądro wybiera mniej używane strony pamięci i umieszcza je w obszarze wymiany, aby zwolnić pamięć RAM. Spowolni to system, ale nie wpłynie to na twoje aplikacje.

Zawsze wolę przypadek 2, ponieważ czuję się niekomfortowo tracąc części lub całą moją pracę, ponieważ jądro uważa, że ​​moje aplikacje są warte zabicia. Co więcej, przy obecnym rozmiarze przeciętnego dysku znajdującego się w zakresie TB, zarezerwowanie kilku procent na zamianę nie powinno stanowić problemu.

jlliagre
źródło
6
Wolę przypadek 1, ponieważ brakuje mi pamięci RAM tylko wtedy, gdy mam niekontrolowany program. Zabójca OOM jest na ogół całkiem dobry w identyfikowaniu uciekinierów, i naprawdę wolałbym, aby zabił go natychmiast niż po kilku godzinach ciężkich zamian.
Mark
1
@ Mark, To ważny punkt. Nadal staram się unikać delegowania do algorytmu najpierw strzelania, myślę później.
jlliagre
2
przypadek 2 jest ważny tylko wtedy, gdy masz coś, co ostrzega o tej sytuacji i masz wystarczająco dużo czasu, aby ręcznie „zrobić coś”, zanim system skończy się zamianą. Zamiast tego możesz monitorować procent używanej pamięci RAM, aby uzyskać te same wyniki.
Totor
1
W oparciu o twoje rozumowanie wystarczy monitorowanie użycia pamięci RAM .
Totor
1
@Totor Wolę nie obudzić się w środku nocy przez moją aplikację do monitorowania laptopa, ponieważ uruchomiłem pakiet przetwarzający wiele plików i wyczerpałem pamięć RAM. Wolę pracę do wykonania, nawet jeśli zajmuje to kilka godzin więcej z powodu niewymiarowania pamięci RAM niż przerwanie całego procesu.
jlliagre
3

Moją zasadą stosowania wymiany w dowolnym systemie jest odpowiedź na to:

  • Jaki jest cel systemu?
  • Ile pamięci zajmie aplikacja?
  • Czy to jest system krytyczny?
  • Czy potrzebuję tymczasowego miejsca na dysku do przesyłania plików?
  • Przewidywana stopa wzrostu aplikacji?

Gdy otrzymam odpowiedź na te informacje, odpowiednio oceniam system. W poprzednich latach stosowałem zasadę kciuka z Sun Microsystem. Do 16 GB dwa razy więcej pamięci RAM dla SWAP, od 16 GB w tej samej ilości. Ale z drugiej strony, jeśli masz wystarczającą ilość pamięci RAM, a twoje aplikacje nie używają SWAP na siłę, możesz pominąć swap. Jeśli potrzebujesz, wystarczy położyć nowy dysk lub lun i skonfigurować SWAP. reguła Słońca była stosowana głównie dlatego, że w przypadku systemu Solaris w przypadku „paniki jądra” pamięć zostanie całkowicie zrzucona w celu wymiany do dalszej analizy.

BitsOfNix
źródło
1

Swap będzie potrzebny, jeśli nie masz wystarczającej ilości pamięci RAM do uruchomienia wszystkich programów.

Mówisz, że nie robisz niczego, co wymaga dużo pamięci RAM. Masz wystarczającą ilość pamięci RAM.

Zatem nie potrzebujesz przestrzeni wymiany.

Ale jeśli uważasz, że w którymś momencie, pomimo tego, co sugerujesz w swoim pytaniu, twoje programy wykorzystają, powiedz więcej niż połowę (lub dwie trzecie) pamięci RAM (zasada praktyczna), to proszę przeczytaj drugą „pro-swap” „odpowiedzi. Nie będziesz potrzebował wymiany, ale może to poprawić wydajność twojego systemu.

Totor
źródło
Korzystanie z zamiany może pomóc w uniknięciu katastrofalnej katastrofy, ale nigdy nie poprawi wydajności, podobnie jak spadochron przyspieszy ferrari. ;-)
Starszy Geek
@ElderGeek Może to być przypadek na krawędzi, ale zamiana może pomóc. Są chwile, kiedy masz wystarczającą ilość pamięci RAM na wszystko, ale bezczynne programy można zamienić, aby lepiej wykorzystać pamięć RAM (np. Trochę użytecznej pamięci podręcznej dysku). Często to widywałem pod koniec lat 90. Widzę to czasami teraz, gdy mam <1 GB wolnej pamięci RAM (w tym pamięci podręcznej dysku), bez potrzeby wymiany przestrzeni.
jbo5112
@ jbo5112 Nie wykluczę tej możliwości całkowicie, jeśli tak powiesz, moje dotychczasowe doświadczenia wykazały inaczej. Nie jest to zbyt zaskakujące, ponieważ jest to przypadek, w którym system jest używany bardziej niż twarda i szybka reguła (której wszyscy zdają się szukać).
Starszy Geek
@ElderGeek Mogę to zobaczyć tylko teraz, ponieważ moje dyski mają dekadę i rozpaczliwie potrzebują pamięci podręcznej. Zwykle pojawia się dodatkowy problem polegający na tym, że zamiana jest ustawiona zbyt wysoko w prawie każdym przypadku, co powoduje, że przestrzeń wymiany jest zbyt agresywnie wykorzystywana. Upuszczanie wartości z 60 do 10 wydaje się częstą rekomendacją. Możesz zejść jeszcze niżej, ale w pewnym momencie zrzucisz zbyt dużo pamięci podręcznej dysku, powodując wiele dodatkowych operacji we / wy podczas wymiany.
jbo5112
@ jbo5112 Dobry punkt. Zawsze jest to działanie równoważące różne podsystemy. Pamiętam, jak w tamtym czasie dostosowywałem takie thimgi, jak przeplatanie dysku twardego i częstotliwość odświeżania pamięci RAM, aby wycisnąć maksymalną wydajność z systemów 80286 z dyskami Seagate ST225 i ST238. Zawsze musimy podejść do sprawy indywidualnie, aby wycisnąć maksymalną wydajność i niezawodność. Gratulacje BTW! Ostatnim razem, kiedy udało mi się wycisnąć dekadę z dysku, był to Micropolis, który miał w sumie 600 MB.
Starszy Geek
0

Krótka odpowiedź:

Tak, zawsze potrzebujesz wymiany, tylko w mało prawdopodobnym przypadku, gdy aplikacja nie zawraca sobie nawet głowy mapowaniem, ale bezpośrednio mapuje pamięć wirtualną.

Ustaw plik wymiany na:

  • RAM+round(sqrt(RAM)) jeśli korzystasz ze hibernacji
  • round(sqrt(RAM)) jeśli nie

Ustaw swappiness10 na pulpicie, ale nie na serwerze!

Długa odpowiedź:

W przeszłości:

W ciągu ostatnich 25 lat stosowano zasadę minimum 1xRAM i maksimum 2xRAM, tak więc cały czas będziecie cytowani.

To minimum zostało cofnięte w epoce kamienia łupanego, kiedy byłem nastolatkiem, a dinozaury wciąż wędrowały po Ziemi, a ponieważ pamięć RAM była po prostu zbyt droga i absolutnie potrzebna była ta przestrzeń wymiany, aby móc cokolwiek osiągnąć.

W tym czasie ustalono maksimum ze względu na malejące zwroty: jest zbyt wolno, aby wymieniać tak dużo pamięci, ponieważ dostęp do dysku twardego jest 1000 razy wolniejszy niż pamięć RAM: dobra w nagłych wypadkach, ale niezbyt dobra do codziennego użytku! W tym czasie, kiedy zabrakło ci miejsca na wymianę, nadszedł czas, aby dodać więcej pamięci RAM! (co do dziś jest prawdą).

W teraźniejszości:

  1. Jeśli nie korzystasz z hibernacji i twoja pamięć jest w nadmiarze 1GByte nowa zasada jest round(sqrt(RAM))gdzie RAMjest oczywiście swój rozmiar w GB RAM.

  2. Jeśli używasz hibernacji, musisz mieć możliwość zamiany całej ilości pamięci RAM + już zamienionej pamięci RAM na dysk, dzięki czemu formuła wygląda następująco: RAM+round(sqrt(RAM))

  3. Reguła malejących zwrotów obowiązuje dzisiaj dla maksimum, ale jeśli nie przetestujesz faktycznego użycia, zabranie 2xRAM jest tylko marnotrawstwem miejsca na dysku , więc nie używaj maksimum, chyba że zabraknie miejsca wymiany przy użyciu innych metod .

Wszystkie razem dają następującą tabelę: (ostatnie 3 kolumny oznaczają przestrzeń wymiany)

    RAM   No hibernation    With Hibernation    Maximum
    1GB              1GB                 2GB        2GB
    2GB              1GB                 3GB        4GB
    3GB              2GB                 5GB        6GB
    4GB              2GB                 6GB        8GB
    5GB              2GB                 7GB       10GB
    6GB              2GB                 8GB       12GB
    8GB              3GB                11GB       16GB
   12GB              3GB                15GB       24GB
   16GB              4GB                20GB       32GB
   24GB              5GB                29GB       48GB
   32GB              6GB                38GB       64GB
   64GB              8GB                72GB      128GB
  128GB             11GB               139GB      256GB
  256GB             16GB               272GB      512GB
  512GB             23GB               535GB        1TB
    1TB             32GB              1056GB        2TB

Powyższe jest jedynie ogólną zasadą; to nie jest prawo grawitacji!
Ty może złamać tę regułę (w odróżnieniu od prawa grawitacji), czy dany przypadek użycia jest inny!

Wskazówka: zawsze przydzielaj SWAP na początku dysku twardego, ponieważ głowice muszą mniej poruszać się po wewnętrznej stronie dysku.
Tak: Na dyskach SSD tak naprawdę nie ma już znaczenia, gdzie zlokalizujesz obszar wymiany, ponieważ używają tunelowania kwantowego zamiast ruchomych głowic, a nowoczesne dyski SSD wykorzystują wszystkie swoje komórki pamięci (nawet nieprzydzieloną przestrzeń), aby zapobiec degradacji kwantowej.

Jak sprawdzić, czy użycie swap różni się od reguły „ogólnej”:

Po prostu wykonaj:

for szFile in /proc/*/status ; do 
  awk '/VmSwap|Name/{printf $2 "\t" $3}END{ print "" }' $szFile 
done | sort --key 2 --numeric --reverse | more

który da ci listę wszystkich uruchomionych programów, które są zamienione (z tym, który używa najwięcej przestrzeni wymiany na górze)

Jeśli używasz więcej niż kilku KB: zmień rozmiar na większy niż minimum, w przeciwnym razie nie przejmuj się ...

Jeśli jesteś na serwerze, przestań czytać teraz: wszystko gotowe!


Jeśli pracujesz na komputerze stacjonarnym / laptopie (nie na serwerze), chcesz, aby Twój GUI działał tak szybko, jak to możliwe i zamieniał się tylko wtedy, gdy naprawdę potrzebujesz . System Ubuntu został zoptymalizowany pod kątem wcześniejszej wymiany na potrzeby serwera, ale na kliencie chcesz gimpszybko edytować ten ogromny obraz o rozdzielczości 250 megapikseli , więc ustawienie wartości swappiness10 zapobiegnie zbyt wczesnej zamianie jądra, jednocześnie upewniając się, że nie działa t swap za późno:

sudo nano /etc/sysctl.conf

i dodaj:

# change "swappiness" from default 60 to 10 
# (theoretically only swap when RAM usage reaches around 80 or 90 percent)
vm.swappiness = 10

na końcu pliku, zapisz plik ( Ctrl+ XY+ Enterw nano) i wykonaj:

sysctl --system

aby ponownie załadować parametr lub ze względu na dawny czas, skorzystaj z metody Window $ i uruchom ponownie ... :-)

Fabby
źródło
-1

Odpowiedź kompromisowa: zależy od znaczenia „powinien”.

Czy potrzebujesz partycji wymiany w tym sensie, że wydarzy się coś złego, jeśli jej nie będziesz mieć w opisanych przez ciebie warunkach pracy? Nie.

Jest mądry , aby mieć partycję wymiany tylko w przypadku, gdy przypadkowo tarła armię wieprze pamięci więc masz szansę, aby je zabić przed kopnięciami OOM Killer? Tak.

Jeśli fizyczna pamięć RAM „znacznie” przewyższa użycie pamięci danych przez wszystkie programy, które będziesz uruchamiać jednocześnie przez cały czas, to nie ma korzyści z wymiany. Jeśli przekroczy, ale nie „znacznie”, może wystąpić korzyść z wydajności, jeśli system operacyjny będzie mógł zamienić rzadko używaną pamięć, aby przechowywać w pamięci częściej używane pliki danych.

Podsumowując, to świetnie, że masz 16 GB pamięci RAM. Ale jeśli masz także dysk 1 TB, nie możesz zarezerwować 16 GB na zamianę? To tylko 1,5% dysku.

Atsby
źródło