Ciągłe zwiększanie rozmiaru wymiany w Linuksie i przestrzeni wymiany nie są odzyskiwane?

10

Mam 8 GB pamięci RAM Linux, na której działają 4 serwery tomcat. Jedna z nich jest ustawiona na 3000 MB pamięci (ustawienie jvm -Xms i -Xmx), a inne na 1500 MB. Partycja wymiany jest również ustawiona na 8Gigs. Kiedy uruchamiam te serwery, użycie pliku wymiany jest niskie. Ale w ciągu kilku dni i w pewnych okresach, gdy jeden / wszystkie serwery są w szczytowej aktywności, użycie wymiany zaczyna rosnąć. Oto typowe wyjście sar -r.

kbmemfree kbmemused% memused kbbuffers kbcached kbswpfree kbswpused % swpused kbswpcad

48260 8125832 196440 2761852 7197688 99,41 1190912 14,20 316044

75504 8098588 99,08 198032 2399460 7197688 1190912 14,20 316032

Pokazuje 14,2% zamiany stosowanej obecnie. Zabawne jest to, że% NIGDY nie maleje . Nadal rośnie i osiąga do 30-40% . Co tydzień restartujemy nasze serwery.

Zakładam, że % swpused rośnie w okresach szczytowej aktywności i maleje w okresach niskiej aktywności. Lub przynajmniej pozostaje stały. Wygląda na to, że system wymiany nigdy nie odzyskuje systemu operacyjnego.

Dane wyjściowe wolnej: wolnej -m łącznej ilości użytych darmowych wspólnych buforów buforowanych Mem: 7982 7937 45 0 32 2088 - / + bufory / pamięć podręczna: 5816 2166 Zamień: 8191 1163 7028

Więc jest co najmniej 2 g darmowego Ram. Pytanie brzmi: dlaczego przestrzeń wymiany ciągle rośnie i nie jest odzyskiwana przez system operacyjny? Lub jak to debugować, aby dowiedzieć się, co się dzieje…

Zenil
źródło

Odpowiedzi:

12

Jeśli informacje zostaną zamienione na płytę, a następnie wczytane z powrotem do pamięci, często zostaną pozostawione przydzielone w obszarze wymiany, aż do wyczerpania się przestrzeni wymiany. Oznacza to, że jeśli te same informacje będą musiały zostać później zamienione i nie ulegną zmianie, system operacyjny może po prostu usunąć strony z przydzielonej pamięci RAM bez potrzeby zapisywania czegokolwiek na dysku.

Swap przypisany do rzeczy, które zostały wczytane z powrotem do pamięci, zostanie zwolniony

  1. gdy odpowiednie strony nie są już wcale potrzebne (tzn. są uwalniane przez aplikację)
  2. po zmianie odpowiednich stron (więc kopia na płycie nie jest już aktualna)
  3. maszyna ma mało miejsca na wymianę, więc usuwa niektóre rzeczy, które są już w pamięci RAM, aby zrobić miejsce

Poszukaj /proc/meminfolinii o nazwie „SwapCached”. Ten wpis zlicza strony znalezione zarówno w pamięci RAM, jak i na partycjach wymiany. Na przykład wybierając losowo małą maszynę /proc/meminfowirtualną, plik wirtualny jednej z moich maszyn wirtualnych pokazuje:

SwapTotal:        698816 kB
SwapFree:         624520 kB
SwapCached:        17232 kB

wskazując, że przydzielono 74268 K miejsca wymiany, ale że te strony o wartości 17232 K są również obecnie mapowane do pamięci RAM (więc można je zwolnić z zamiany w mgnieniu oka, jeśli miejsce jest potrzebne przez coś innego).

Nie będzie też wątpliwości, że strony zostały tam zamienione przed wiekami i odtąd nigdy nie były używane. Jądro nie przeładuje stron z wymiany tylko dlatego, że jest trochę wolnej pamięci RAM do ponownego odczytania, ponieważ ta wolna pamięć RAM może być lepiej wykorzystana do pamięci podręcznej lub buforów - strony napisane do zamiany są generalnie ponownie czytane tylko wtedy, gdy są potrzebne.

Jeśli chcesz wyczyścić to, co jest w swapie, o ile masz wystarczającą ilość wolnego i / lub darmowego (tj. Wolnego + bufora + buforów (mniej tych części c + b, które nie są wolne RightThisInstant)), po prostu włącz wyłącz i włącz ponownie za pomocą swapoff -a && swapon -a.

Oczywiście możesz także mieć gdzieś wyciek pamięci, ale to nie jedyne wytłumaczenie tego, co widzisz.

David Spillett
źródło
Doskonała odpowiedź. Dzięki. Więc mój system obecnie pokazuje SwapTotal: 8388600 kB SwapFree: 7197688 kB SwapCached: 595724 kB Tak rzeczywista zamiana za darmo = 7197688 + 595724 = 7793412. Actul Swap Używany = 8388600 - 7793412 = 595188 == 581 MB. Wydaje mi się, że 581 MB wykorzystania pliku wymiany jest rozsądne w przypadku systemu 8 GB z uruchomionymi 4 aplikacjami. Pozwól mi monitorować to przez kilka następnych dni i sprawdzić, czy liczba swapCached stale rośnie proporcjonalnie do% swapUsed.
Zenil
2

Zasadniczo nie musisz się tym przejmować. Ważne jest, aby wiedzieć, ile IO idzie na wymianę (spójrz na komendę „vmstat”). Posiadanie więcej rzeczy w zamianie nic nie kosztuje. Jedynym kosztem jest umieszczenie rzeczy w zamianie (strona w środku) lub wyjęcie (strona w górę). Jest więc całkowicie uzasadnione, aby system operacyjny pozwalał na wzrost wymiany.

Guillaume
źródło
1
Ważne jest, aby dowiedzieć się, dlaczego wymiana rośnie i nigdy nie maleje. Co, jeśli pozwolimy naszym serwerom działać przez tygodnie? Czy wymiana wzrośnie ponad limit i spowoduje problemy z pamięcią? Zamiana / zamiana wygląda „rozsądnie”. W okresach szczytowej aktywności występuje wysoka zamiana / zamiana (a także wzrost% zamiany). W normalnych okresach zamiana / zamiana jest minimalna, ale% zamiany nie maleje
Zenil
0

tak długo, jak masz dostępną przestrzeń wymiany, nie ma potrzeby, aby system operacyjny zwalniał przestrzeń wymiany. Zostanie uwolniony, gdy nie będzie już miejsca. Bu, kiedy znajdziesz się w takiej sytuacji, na pewno masz problem.

chrześcijanin
źródło
0

Nie ma sposobu, aby stwierdzić, czy ostatecznie stanie się to problemem, chyba że uruchomisz serwer wystarczająco długo, aby sprawdzić, czy stanie się to problemem.

Zasadniczo system operacyjny zamienia rzeczy, które nie są wykorzystywane, aby przez cały czas pozostawać wolna, na wypadek, gdyby nowy program został uruchomiony. Miejsce wymiany nie zostanie zwolnione, dopóki nie będzie potrzebne, co oznacza, że ​​możesz użyć 100% miejsca wymiany i nie mieć problemów z wydajnością. Należy się martwić, jeśli jest to spowodowane wyciekiem pamięci. To niekoniecznie jest wyciek pamięci, ale może być.

Java nie jest podatna na wycieki pamięci, ale może się to zdarzyć szczególnie w przypadku skomplikowanych aplikacji.

Joshua Nurczyk
źródło