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…
źródło
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.
źródło
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.
źródło
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.
źródło