Używam Uniksa od dłuższego czasu i przez ostatnie kilka lat czułem, że zamiana jest anachronizmem, ale byłbym ciekawy, co myślą inni ludzie.
Mój argument jest mniej więcej taki (zakładając, że nie ma globalnego limitu ani kręcenia ustawień OOM):
There is little value in swap because if you need to swap out to disk,
odds are it's going to be a vicious cycle where an app will continue
to eat not only real memory, but swap as well until it gets OOM
reaped (_if_ it gets OOM reaped).
If you have swap enabled, it will only prolong this death march to
the detriment of other processes - and in the worst case where the
process is not OOM reaped in a timely manner, grind the system to
a halt.
Without swap, it will probably get OOM reaped sooner (if at all)
W przypadku każdej usługi, która jest dostrojona pod kątem wydajności, sądzę, że zrozumienie górnych granic wykorzystania zasobów byłoby kluczem do dostrojenia jej w pierwszej kolejności, w którym to przypadku wiesz, ile potrzebujesz.
Nie mogę sobie wyobrazić wielu sytuacji (niektórych, ale niewielu), w których można zawiesić trwający proces i może on zamienić się, aby zrobić miejsce na inne rzeczy, ale nadal byś stracił swoje gniazda, gdybyś to zrobił, więc zmuszając zrzut pamięci przez gcc lub ręczne skopiowanie pamięci byłoby funkcjonalnie równoważne.
Zdecydowanie nie chciałbym wymiany w systemie osadzonym (nawet jeśli może mieć mniejszego dostępnego pamięci RAM), jeśli zabraknie pamięci RAM, wolę, aby mój proces umarł, niż podarłbym pamięć flash o milionie zapisów na sektor przejechać weekend, wyrównując zużycie sektorów do zera.
Jakieś brody unixowe mają jakieś ważne powody, aby ciągle się wymieniać?
AKTUALIZACJA odpowiedzi i analizy:
ZATWARDZIAŁY? - fork () wymaga takiej samej ilości pamięci dla procesu potomnego jak rodzic
Modern fork () to kopiowanie przy zapisie dla dzieci na POSIX (ogólnie), ale konkretnie Linux i FreeBSD , i zakładam OSX poprzez ekstrapolację. Uważam tę część anachronicznego bagażu, który zamienia ze sobą.
Co ciekawe, w tym artykule Solaris twierdzi się, że nawet jeśli Solaris używa Copy-on-Write z fork (), to powinieneś mieć co najmniej 2x (!) Rozmiar procesu nadrzędnego w wolnej pamięci wirtualnej, aby fork () nie zawalił się w środkowy. Podczas gdy element Solaris nieco odrzuca argument, że zamiana jest anachronizmem - myślę, że wystarczająca liczba systemów operacyjnych poprawnie implementuje CoW w taki sposób, że ważniejsze jest rozwiać mit niż oznaczyć go jako dalsze uzasadnienie zamiany. Od. Spojrzmy prawdzie w oczy. W tym momencie ludzie, którzy faktycznie korzystają z Solaris, są prawdopodobnie tylko facetami Oracle. Bez obrazy Solaris!
POTWIERDZONY - pliki tmpfs / ramfs mogą zostać zamienione jako przekonanie, gdy tmpfs / ramfs się zapełni
Nie używaj bez ograniczeń tmpfs / ramfs! Zawsze jawnie określ ilość pamięci RAM, którą ma używać tmpfs / ramfs.
PLAUSABLE - Zamień trochę „na wszelki wypadek”
Jeden z moich dawnych szefów miał świetne powiedzenie: „nie wiesz, czego nie wiesz” - w zasadzie nie możesz podjąć decyzji na podstawie informacji, których jeszcze nie masz. Jest to jednak prawdopodobny argument przemawiający za zamianą - podejrzewam, że rodzaje rzeczy, które możesz zrobić, aby wykryć, czy twoja aplikacja się wymienia, czy nie, byłyby cięższe niż sprawdzenie, czy malloc () się powiedzie lub wychwycenie wyjątku od nieudana nowa ().
Może to być przydatne w przypadkach, gdy korzystasz z pulpitu i dzieje się kilka losowych rzeczy, ale nawet nadal - jeśli coś zwariuje, wolę, żeby to było OOM niż nurkowanie w piekle. To tylko ja.
NIESTANDARDOWO! - W systemie Solaris wymiana jest ważna z kilku powodów
tmpfs - stany Ilość wolnego miejsca dostępnego dla tmpfs zależy od ilości nieprzydzielonego miejsca wymiany w systemie. Rozmiar systemu plików tmpfs rośnie, aby pomieścić zapisane w nim pliki, ale istnieją pewne nieodłączne kompromisy dla dużych użytkowników tmpfs. Tmpfs dzieli zasoby z segmentami danych i stosu wykonujących się programów. Na działanie bardzo dużych programów może mieć wpływ sytuacja, gdy systemy plików tmpfs są zbliżone do maksymalnego dopuszczalnego rozmiaru. Tmpfs może przydzielić wszystkie oprócz 4 MB przestrzeni wymiany systemu.
Solaris fakty i mity na temat zamiany - stwierdza Virtual memory dzisiaj składa się z sumy fizycznej pamięci RAM i swap na dysku. Solaris wcale NIE wymaga konfiguracji przestrzeni wymiany. Jeśli wybierzesz tę opcję, po zapełnieniu pamięci RAM nie będzie można rozpocząć nowych procesów. .
Nie jestem pewien, czy to oznacza, że maksymalna wirtualna mapa, którą możesz utworzyć, to ram + swap , czy też nadal możesz zrobić coś takiego jak mmap () plik większy niż ram i polegać na leniwej inicjalizacji mmap (). prawdopodobnie prawdopodobnie działa teraz w systemie Solaris bez wymiany, wygląda na to, że jest mniej przyjazny niż inne systemy operacyjne POSIXy.
NIESTANDARDOWO! Popularne narzędzia hibernacji Linuksa wydają się polegać na zamianie
Domyślnie TuxOnIce wygląda tak, jakby polegał na zamianie w hibernacji - chociaż istnieją inne backendy. Jednakże, jeśli nie korzystasz z urządzenia, które wymaga hibernacji, nadal stałbym za stwierdzeniem, że „swap jest anakroniczny w systemie Linux”
Odpowiedzi:
Nie należy mylić zamiany (jako obszaru dysku) i zamiany (jako metody przenoszenia stron pamięci z pamięci RAM na dysk i wzajemnie).
Nadmierna zamiana jest czymś, czego należy unikać ze względu na wydajność, ale posiadanie obszaru wymiany niekoniecznie stanowi problem.
W systemach, takich jak Linux, które przeciążają pamięć, tj. Które pozwalają procesom na przydzielenie większej ilości pamięci niż dostępna, brak pamięci RAM przy niewystarczającej ilości wymiany do obsłużenia sytuacji spowoduje wyzwolenie OOM-a. Musisz zaufać algorytmowi stosowanemu do wybrania „właściwego” procesu do zabicia i zaakceptować jeden lub więcej procesów, które zostaną zabite bez możliwości prawidłowego zamknięcia. Oto słynna analogia, która wyjaśnia, dlaczego zabójca OOM może wcale nie być dobrym pomysłem.
W systemach takich jak Solaris, które nie przepełniają pamięci, tj. Upewnij się, że rezerwacja pamięci jest zawsze wspierana przez pamięć wirtualną, czy to w pamięci RAM, czy na dysku, posiadanie wystarczającej powierzchni wymiany jest absolutnie konieczne, w przeciwnym razie potencjalnie znaczna część pamięci RAM będzie zmarnowany.
źródło
Znam jeden powód, aby ciągle się wymieniać. Mam aplikację, która zajmuje tyle pamięci, ile mogę sobie pozwolić na skonfigurowanie dla mojego systemu. Korzysta z Hadoop, który w jednej części przetwarzania wykonuje rozwidlenie i exec do uruchomienia pojedynczej komendy unix (myślę, że „uname” lub „user” lub coś, dla czego nie mogliby znaleźć odpowiednika Java). Wygląda na to, że java nie robi vfork z kopiowaniem podczas semantyki zapisu, tak jak zrobiłaby to natywna aplikacja. Jeśli uruchomię aplikację przy użyciu 4 GB pamięci RAM, to gdy rozwidli się, widelec zużyje kolejne 4 GB pamięci RAM, ale szybko ją zwolni. Gdybym nie miał wymiany 4 Gb dla tego Hadoopa do zamiany, musiałbym płacić za 8 Gb pamięci RAM, aby mieć 4 GB dla mojej aplikacji.
źródło
files_struct
, thestruct signals
, thetask_struct
i inne). Ponadto wiele stron wykonywalnych nie jest kodem zależnym od pozycji (PIC), a zatem strony kodu wykonywalnego, które zostały zmodyfikowane przez moduł dynamicznego modułu ładującego (ld-linux.so
), muszą mieć zarezerwowane dla nich miejsce wymiany, nawet jeśli nic nie zostanie zapisane w miejscu wymiany natychmiast. Dlatego kocham Linuxa; możesz wyłączyć swap, a system nadal działa. :)Nie mogę technicznie dodać do dyskusji, ale mogę podać kilka przykładów. Mój stary notebook (2 GB pamięci RAM kunbuntu lucid) zazwyczaj działa z wymianą na 0. Kiedy uruchamiam transmisję (klient bittorrent) z wieloma torrentami, które mogą łącznie korzystać ze 100 połączeń, moja zamiana może pójść w górę. Jest jeszcze gorzej, gdy mam uruchomioną maszynę XP XP, która wykorzystuje 1 GB prawdziwej pamięci.
Widziałem, jak inni komentują, że procesy wymagające dużej ilości pamięci, takie jak renderowanie grafiki, również mogą zamieniać się w swap. Jeśli robisz to tylko okazjonalnie, to nie jest to problem.
Jeśli chodzi o problemy z OOM, zamiana może być rzeczywiście ratownikiem, ponieważ kupuje ci czas między identyfikacją problemu a rzeczami zmierzającymi na południe. Wiele rzeczy zajmuje prawie całą moją pamięć, więc nie zwracam na to uwagi, ale kiedy zaczyna się zamiana, zauważam to i zaczynam szukać problemu - zanim mnie gryzie.
źródło
Jest jedna bardzo ładna aplikacja do wymiany przestrzeni: rozszerzenie pamięci RAM poprzez umieszczenie przestrzeni wymiany na urządzeniu pamięci masowej korzystającym z pamięci RAM, aby pokonać ograniczenia instalowalnej pamięci RAM systemu
Spójrz na ten najobszerniejszy http://techreport.com/articles.x/16255 Zasadniczo jest to interfejs od S-ATA do DDR2-RAM. Możesz w nich umieścić do 64 GB pamięci RAM. Umieszczając miejsce wymiany na jednym z nich, zyskujesz znaczną dodatkową pamięć RAM. Oczywiście nie jest tak szybki jak zwykła pamięć RAM systemu. Ale w pewien sposób zamienia systemową pamięć RAM w coś w rodzaju dodatkowej warstwy pamięci podręcznej.
źródło
Używam Linuksa i Windowsa bez wymiany (plik stronicowania, w nomenklaturze Windows), na notebookach / komputerach z 4 Gb lub więcej. Jest kilka przypadków wyczerpania pamięci, po prostu sobie z nimi radzę. Wydaje mi się, że system jest w ten sposób szybszy, na czym bardziej mi zależy. Jednak nie mam specjalnych wymagań dotyczących mojego obciążenia pracą.
Czego się nauczyłem:
źródło
Myślę, że twoje argumenty są dość poprawne dla serwera , na którym wydajność jest ważna, a wiedza, która aplikacja będzie działać w następnej kolejności, może nie być przewidywalna.
W przypadku komputerów stacjonarnych uznaję zamianę za przydatną podczas pchania i wyskakiwania zadań.
Na przykład, jeśli pracuję nad zadaniem za pomocą aplikacji,
A
a następnie stwierdzam, że muszę doB
czegoś użyć aplikacji (poddziałania lub przerwy), to łatwiej jest mi mentalnie zezwolić naA
zamianę dysku podczas pracy wB
celu zamknięcia,A
a następnie pamiętaj, aby uruchomić go ponownie później.Jest to szczególnie prawdziwe, jeśli
A
utrzymuje jakiś niezapisany stan, który nie zostałby przywrócony po ponownym uruchomieniu.To, czy szybsze jest pchanie i przeciąganie
A
do / z zamiany, czy zamykanie i ponowne uruchamianie, zależy od aplikacji. (Niektórym udaje się uruchomić powoli, ale niewielki rozmiar).Zgadzam się jednak, że lepszym rozwiązaniem w celu zwiększenia wydajności byłoby zainstalowanie dodatkowej pamięci RAM.
źródło
W moim systemie / tmp przelewa się, aby wymienić, jeśli pochłonie zbyt dużo pamięci RAM.
Jest to o wiele szybsze niż używanie prawdziwego systemu plików dla / tmp.
źródło
Istnieje wiele powodów, dla których stosuje się swap.
Zwykle, gdy system nie ma wystarczającej ilości pamięci fizycznej, jądro może zamienić niektóre aplikacje (w rzeczywistości - niektóre części pamięci, które są używane przez nie uruchamiane aplikacje).
Później, gdy te aplikacje powinny coś zrobić (na przykład niektóre dane docierają do gniazda lub niektóre odpalają czasomierz) - jądro spowoduje zamianę innej aplikacji.
Innym przykładem użycia zamiany jest zawieszenie na dysku.
Jeśli chodzi o urządzenia osadzone, wszystkie z nich można podzielić na (co najmniej) dwie duże grupy:
Oczywiście, są urządzenia, na których działa tylko pewien kod (jakiś rodzaj mikrokontrolerów) itp. Nie opisałbym ich, ponieważ takie urządzenia nie mają żadnego systemu operacyjnego, więc omawianie wymiany nie ma sensu dla takich urządzeń.
Pierwsza grupa urządzeń osadzonych (z systemem operacyjnym) może korzystać (i zwykle korzysta) z wymiany. Ogólnie rzecz biorąc, takie urządzenia używają wymiany w taki sam sposób, jak komputery stacjonarne i serwery.
Druga grupa urządzeń (z uruchomionym systemem RTOS) w ogóle nie używa wymiany, ponieważ RTOS ma ograniczony czas reakcji na zdarzenie, oraz
BTW, istnieje wiele opisów tego, w jaki sposób Linux używa wymiany, jednym z nich jest http://distilledb.com/blog/archives/date/2009/02/22/swap-files-in-linux.page
Korzystanie z systemu Windows podobne podejście.
źródło
Wydaje mi się, że zarówno hibernacja, jak i sen hybrydowy wymagają przestrzeni wymiany w systemie Linux .
Nigdy nie korzystałem z przestrzeni wymiany / partycji w systemie Linux, dopóki nie stanąłem przed koniecznością użycia trybu uśpienia hybrydowego - ponieważ uśpienie na krytycznym poziomie baterii nie było dostępne w moim systemie, ponieważ było to obsługiwane przez Upower, który wybiera tylko pomiędzy Shut-Down, Hibernate i Hybrid -spać. (więcej tutaj )
źródło
Kilka dobrych zastosowań, które widziałem, to procesy, które zużywają dużo pamięci, ale nie są krytyczne pod względem wydajności. Jednym z przypadków był starożytny Firefox, który miał zły wyciek pamięci. Wypełniałoby pamięć RAM i rozlewałoby się, aby zamieniać bez negatywnego efektu. Kolejnym, który mieliśmy, był nasz rekurencyjny serwer DNS (te szybko gromadzą ogromną pamięć podręczną, która jest rzadko używana).
Inne wyjaśnienie, które widziałem o zamianie, brzmiało trochę tak: „Mówiono ci, aby zawsze konfigurować SWAP = 2 * RAM. To kompletny nonsens, nie ma związku między pamięcią RAM i zamianą. Zamień ma na celu przyspieszenie wzrostu wykorzystania pamięci , należy dodać wystarczającą ilość pamięci, aby przez większość czasu ładowanie mieściło się w pamięci RAM. Jeśli ładunek jest stabilny, nie potrzebujesz wymiany. Jeśli obciążenie jest bardzo zmienne, potrzebujesz wystarczającej ilości wymiany na skoki i ustaw tak, aby swap jest używany rzadko, aby nie wpływać znacząco na wydajność. Podsumowując, ponieważ nie masz pojęcia, jakie są skoki obciążenia, a dysk jest o wiele tańszy niż pamięć RAM, skonfiguruj SWAP = 2 * RAM. ”
Niektóre stare wersje systemu Solaris nie mogły w ogóle używać swapów, chyba że było co najmniej tyle swapów co RAM (pamiętam, że przydzielono stałą przestrzeń wymiany do wychodzenia z pamięci RAM lub coś w tym rodzaju), więc 2 * RAM było naprawdę około rozsądnego minimum wartość. Ale to było eony temu, kiedy nasza duża maszyna miała 64 MiB RAM i dysk 1 GiB ...
źródło