Czy to zły pomysł, aby utworzyć skrypt cron, który opróżnia swap co godzinę?

26

Od lat mam ten sam problem z moimi małymi konfiguracjami Ubuntu: używana przestrzeń wymiany rośnie z czasem. Mam wrażenie, że dzieje się tak głównie dlatego, że przydzielona pamięć nigdy nie wraca do pamięci RAM, mimo że jest na nią wystarczająco dużo miejsca, z wyjątkiem przypadku akcji użytkownika, takiej jak wyłączenie wymiany.

Zrobiłem krótkie cronpolecenie, aby to zautomatyzować i mam dobre wyniki:

#! /bin/sh

echo "* */1 * * * root swapoff -a && swapon -a" >> /etc/crontab

Ale ponieważ jest to bardziej podstęp niż prawdziwe rozwiązanie tego problemu, zastanawiam się nad potencjalnymi powodami, dla których może to być zły pomysł, lub jak mogę ulepszyć ten skrypt, aby uczynić go trochę bardziej sprytnym?

Yvan Sraka
źródło
29
Przepraszam za moją niewiedzę, ale co dokładnie masz na myśli mówiąc, że przestrzeń SWAP rośnie z czasem i opróżnia przydzieloną pamięć RAM ? Zwykle przydzielasz trochę miejsca jako system wymiany i nigdy więcej z niego nie słyszysz. Kogo obchodzi, ile faktycznie dokonano zamiany? Jaki jest problem?
deser
5
Dlaczego w ogóle chcesz to zrobić? Dlaczego uważasz, że korzystanie z zamiany jest złe? O jakim zużyciu wymiany mówimy?
marcelm
25
Jestem trochę zdziwiony. Ciągle mówisz o „problemie”, ale tak naprawdę nie opisujesz żadnych negatywnych skutków. Dlaczego uważasz to za problem?
David Schwartz,
17
Jeśli coś się zamienia i pozostaje, dzieje się tak dlatego, że nic z niego nie korzysta. A jeśli nic z niego nie korzysta, lepiej pozwolić RAM na wykorzystanie do czegoś, co jest dostępne, jak pamięć podręczna, niż na zamianę danych z powrotem.
Hobbs
12
Jak to jest lepsze niż pozostawienie zamiany?
user253751,

Odpowiedzi:

51

Używanie tego w ten sposób: tak, źle. Naprawdę musisz sprawdzić, czy dostępna jest wystarczająca ilość pamięci, zanim wyłączysz swap. Zobacz /ubuntu//a/90399/15811 dla lepszej wersji.

Ponadto: jesteś tego pewien? Przydzielenie swapu nie oznacza użycia swapu. Polecenie vmstat, kolumny si(zamień w) i so(zamień). Jeśli pozostaną 0, masz inny problem. Z mojego doświadczenia wynika, że ​​zamiana jest rzadko używana i być może nie używasz jej, myśląc, że jej nie opróżnia, ale nie ma nic do opróżnienia.

Rinzwind
źródło
3
Czekaj, co? Jeśli nie ma wystarczającej ilości pamięci, aby swapoff odniósł sukces, swapoff zostaje zabity przez zabójcę OOM. Tak, tak naprawdę to zakodowali (sprawdza przez wywołanie systemowe).
Joshua
@Joshua na pewno, ale chce, aby działało to automatycznie. Nie wystąpił błąd.
Rinzwind,
4
Mówiąc bardziej szczegółowo, nie pisząc własnej odpowiedzi, rosnąca w miarę upływu czasu wymiana swapów wcale nie jest zła . Oznacza to, że jądro powoli odkrywa, które śmieci zużywające pamięć nigdy się nie zużywają, i przenosi je w celu zamiany, aby pamięć mogła się przyzwyczaić do rzeczy, które w rzeczywistości Ci pomagają (np. Do przechowywania większej ilości danych pamięci podręcznej, więc nie musi ciągle go odrzucać i ponownie odczytywać z dysku).
R ..
@Rinzwind cron działa dobrze z zadaniami, które zawierają błąd, a połączony skrypt też nie używa vmstat.
jpaugh
41

Powiedziałbym, że to zły pomysł. Jeśli uważasz, że masz wolną pamięć i aktywny proces nie jest przenoszony z zamiany do pamięci RAM, to albo nie masz tyle wolnej pamięci, ile myślisz, lub proces nie jest tak aktywny, jak myślisz jest.

Jeśli aktywny proces nadal jest zamieniany, powinieneś naprawić wszystko, co powoduje presję na pamięć. Jeśli nie jest to aktywny proces, o co chodzi?

muru
źródło
1
+1: o co chodzi? Nigdy nie zmieniaj działającego systemu , nie sądzę, że należy zadzierać z takimi podstawowymi funkcjami systemu, szczególnie nie bez potrzeby.
deser
3
Czasami mam problemy, w których zabijam proces z wyciekiem pamięci (co zmusiło całą resztę do zamiany), pozostawiając mnie z ~ 10% zajętej pamięci RAM ... ale wszystkie uruchomione programy są zamienione, dopóki nie uzyskam do nich dostępu. Za każdym razem, gdy coś dotkniesz, nastąpi dwusekundowe opóźnienie. Widzę, skąd pochodzi OP, i byłoby miło, gdyby zrobiło się to automatycznie, ale to nie jest właściwy sposób.
Ktoś gdzieś
1
@SomeoneSomewhere Ale i tak to nie działa. Jeśli proces wycieka z pamięci, to z definicji nie korzysta z niej aktywnie (nie odczytuje i nie zapisuje); po prostu przypadkowo go przydzielono. Jeśli w pobliżu są inne aktywne procesy, wyciekająca pamięć zostanie zamieniona i będzie to śmieci pełne, a nie fizyczna pamięć RAM.
David Richerby,
@DavidRicherby Jeśli masz otwarty program w tle, to ten program jest nadal mniej aktywny niż wyciek pamięci - a kiedy wrócisz do niego, musi wyjść z wymiany.
Ktoś gdzieś
@SomeoneSomewhere Wygląda na to, że źle zrozumiałeś, jak działa system pamięci. Nie musisz mieć całego procesu w fizycznej pamięci RAM: swap jest zarządzany na poziomie szczegółowości pojedynczych stron. Każda strona, która nie była używana przez pewien czas, może zostać zamieniona, a strona składająca się całkowicie z wycieku pamięci nigdy nie będzie ponownie używana, więc nigdy nie zostanie zamieniona z powrotem po zamianie.
David Richerby,
34

To zły pomysł.

Jądro rozpoczyna kopiowanie (nie przenoszenie) danych w celu zamiany na długo przed zapełnieniem pamięci fizycznej, ponieważ jeśli jakiś proces kiedykolwiek wymaga dużej ilości pamięci, każda strona, która ma już prawidłową kopię w zamianie, może zostać natychmiast ponownie wykorzystana bez konieczności kolejnego zapisu na dysk.

Zasadniczo dzieje się tak głównie w przypadku stron, które nie były otwierane od dłuższego czasu, co jest dobrym wskaźnikiem, że jest mało prawdopodobne, że będą dostępne wkrótce.

Jeśli wyraźnie odrzucisz kopie, nie przyniesie to żadnych korzyści, ponieważ dane nadal istnieją w pamięci RAM, ale może kosztować szybkość, gdy jakiś proces chce przydzielić dużo pamięci i konieczna jest wymiana.

Jądro zawsze będzie używać przestrzeni wymiany, gdy tylko pamięć fizyczna zapełni się w ponad 50%, więc liczby te będą niezerowe, nawet jeśli masz zainstalowaną wystarczającą ilość pamięci.

Simon Richter
źródło
4
zawsze : myślę, że zakładasz, że /proc/sys/vm/swappinesspozostała wartość domyślna 70, co jest dobre dla serwerów i dość agresywnie wysuwa brudne strony z procesów, które nie dotknęły ich przez jakiś czas, aby zrobić miejsce dla większej ilości pamięci podręcznej. Jest to często niekorzystne dla komputerów stacjonarnych, ponieważ Alt-Tab może zwolnić.
Peter Cordes,
@PeterCordes, jeśli strony faktycznie zostały eksmitowane, pamięci podręczne uzyskały więcej dostępu niż strony aplikacji, o których mowa, więc korzyść z ich wykorzystania jako pamięci podręcznej na dysku była ogromna. Widzę, w jaki sposób wydajność Alt-Tab jest bardziej widoczna dla użytkownika niż np. Czas kompilacji dla dużego projektu, ale trudno mi sformułować zasady, które gwarantują natychmiastową reakcję bez poświęcania zbyt dużej wydajności.
Simon Richter,
1
Mówiąc inaczej: jądro jest dostrojone pod kątem przepustowości ( swappiness=70), ale opóźnienie jest ważniejsze dla doświadczenia użytkownika na pulpicie. To jest kompromis. Jeśli rutynowo kompilujesz rzeczy, które są nieco za duże, aby pozostać w pamięci podręcznej, to z pewnością pozostaw swappinesstrochę wyżej, na przykład 20 lub 30 zamiast 5 lub 10. Zobacz także akitaonrails.com/2017/01/17/optimizing-linux-for -wolne komputery . Wyświetlanie vm.vfs_cache_pressureponiżej 100 również sprzyja buforowaniu metadanych i-węzłów / katalogów na stronach danych, co jest również miłe z punktu widzenia responsywności interfejsu użytkownika.
Peter Cordes,
1
Inne przestrajalne: progi odpisania lonesysadmin.net/2013/12/22/… . Kontrolują one, jak szybko Linux zaczyna zapisywać na dysk po zapisaniu danych w plikach oraz ile dozwolonych jest brudnych stron. (tzn. ile pamięci można przeznaczyć na buforowanie zapisu)
Peter Cordes,
21

To jest zły pomysł. Gdyby było to przydatne, jądro Linuksa zaimplementowałoby to w ten sposób. Nie wierzę, że istnieje powód, aby zmieniać więcej niż kilka parametrów dostrajania, ponieważ taki prosty skrypt powłoki najprawdopodobniej nie jest bardziej sprytny niż algorytmy programistów jądra.

Zasadniczo masz dwa przypadki:

  • Procesy w przestrzeni wymiany i tak nie są używane. Dlaczego chcesz wciągnąć je z powrotem do pamięci RAM?
  • Jest mało pamięci RAM, więc są one wymieniane i wciągane z powrotem do pamięci RAM. Następnie twój system ponownie wymieni je jak najszybciej.

Są więc dwa główne punkty:

  1. Po pierwsze, system będzie działał wolno, gdy będzie za mało pamięci RAM, aby uruchomić wszystkie programy na raz. Zamiana pomoże ci uruchomić więcej programów, ale nie przełączysz się szybko na rzadko używany, który może zostać wymieniony. Żadna zamiana nie może zabić rzadko używanego, ani wysłać aktualnie używanego wyjątku braku pamięci.
  2. Po drugie, wymiana jest dobrą rzeczą, podobnie jak zamiana, ponieważ masz wolną pamięć RAM kosztem programów, których i tak nie używasz.

Pomimo problemów z brakiem pamięci w przypadku zbyt wielu programów, niektóre programy mogą przydzielać pamięć na podstawie aktualnie wolnej pamięci RAM (być może Twoja przeglądarka będzie używać więcej pamięci podręcznej i będziesz mógł przeglądać szybciej), a jądro może używać wolnej pamięci RAM do buforowania dysku i podobne optymalizacje. Gdy wymusisz pustą wymianę, jądro upuści pamięć podręczną odczytu i np. Uruchomienie nowej instancji Firefoksa potrwa dłużej niż wtedy, gdy Firefox nadal znajduje się w pamięci podręcznej dysku.

Jeśli chcesz dostroić zachowanie jądra, zobacz parametr swappiness .

Dwa dodatkowe zasoby pochodzą z @ peter-cordes:

Jeśli naprawdę chcesz mieć pustą zamianę, możesz ją wyłączyć na stałe. Nie rozumiem, dlaczego włączenie go przez godzinę, a następnie opróżnienie ma zalety w porównaniu z brakiem zamiany.

allo
źródło
1
Zobacz także akitaonrails.com/2017/01/17/optimizing-linux-for-slow-computers and lonesysadmin.net/2013/12/22/…, aby uzyskać więcej sugestii / szczegółów dotyczących strojenia.
Peter Cordes,
5

Możesz osiągnąć te same wyniki, informując jądro o zwolnieniu pamięci podręcznej:

echo 3 > /proc/sys/vm/drop_caches

W ten sposób unikniesz krótkiego momentu możliwego głodu pamięci i opuścisz jądro, aby zdecydować, co jest konieczne, a co można odrzucić.

Alex C.
źródło
0

Wbrew powszechnemu poglądowi SWAP sam w sobie nie jest zły .
To, co faktycznie spowalnia twój system, to aktywność jądra, która przenosi dane z pamięci RAM do SWAP iz powrotem do pamięci RAM swappiness.
System robi to automatycznie, ponieważ jest skonfigurowany z swappiness.
To powoduje, że pamięć z nieaktywnych procesów jest zrzucana na partycję wymiany dysku twardego.
Sam pracowałem przez lata z maszyną, która nie miała tyle pamięci RAM i zawsze korzystałem z pamięci SWAP. Mimo to moja maszyna działała dobrze, dopóki nie zaczniesz przenosić pamięci z powrotem do pamięci RAM, być może próbując zamknąć otwartą aplikację. Następnie obciążenie pracą zaczęło rosnąć.

  • Zatem ciągłe czyszczenie pamięci SWAP znacznie zwiększy obciążenie komputera.
  • Uruchamianie aplikacji, które mają pamięć na partycji SWAP, może ulec uszkodzeniu w trakcie ich wykonywania.

Raczej sugerowałbym, abyś dokładnie przestudiował, która aplikacja korzysta z pamięci w wierszu poleceń wraz z htopaplikacją i zdecydowała się zamknąć niektóre aplikacje. gnome-system-monitorMoże dać dobry wgląd, jak również, w procesie-Tab.
Jeśli masz duże aplikacje, które używają dużo pamięci RAM. Nie uruchamiaj ich wszystkich naraz.

Bodo Hugo Barwich
źródło