Cent OS: Jak wyłączyć lub zmniejszyć nadmierne zaangażowanie pamięci i czy jest to bezpieczne?


20

Od czasu do czasu „mój” serwer zatrzymuje się, ponieważ zabrakło mu zarówno pamięci, jak i przestrzeni wymiany. (wciąż reaguje na ping, ale nic więcej, nawet ssh).

Powiedziano mi, że linux robi nadmierne zaangażowanie w pamięć, co, o ile rozumiem, jest tym samym, co banki robią z pieniędzmi: zapewnia procesom więcej pamięci niż faktycznie dostępna, zakładając, że większość procesów nie wykorzysta całej pamięci, o którą proszą przynajmniej nie wszystkie jednocześnie.

Załóżmy, że jest to faktycznie przyczyna, dla której mój system czasami się zawiesza, nie omawiajmy tutaj, czy tak jest (zobacz Co może spowodować, że WSZYSTKIE usługi na serwerze przestaną działać, ale nadal reagują na ping? I jak to wymyślić ) .

Więc,

  1. jak mogę wyłączyć lub drastycznie zmniejszyć nadmierne zaangażowanie pamięci w CentOS? Przeczytałem, że istnieją dwa ustawienia o nazwie vm.overcommit_memory (wartości 0, 1 lub 2) i vm.overcommit_ratiom, ale nie mam pojęcia, gdzie muszę je znaleźć i zmienić (mam nadzieję, że plik konfiguracyjny), jakie wartości powinienem spróbować i czy muszę ponownie uruchomić serwer, aby zmiany były skuteczne.

  2. i czy to jest bezpieczne? Jakich skutków ubocznych mogę się spodziewać? Kiedy google szukają nadmiernej pamięci, widzę przerażające rzeczy, takie jak ludzie twierdzący, że ich serwer nie może się już uruchomić.

Ponieważ tym, co powoduje nagły wzrost zużycia pamięci, jest mysql z powodu zapytań wykonywanych przez php, które z kolei wywoływane są podczas obsługi żądań HTTP, oczekiwałbym, że tylko jakiś skrypt php się nie zakończy, a więc od czasu do czasu około 500 odpowiedzi serwer jest zbyt zajęty, co jest ryzykiem, które mogę podjąć (na pewno lepiej, aby cały serwer stał się niedostępny i musiał mocno go zrestartować).

Czy może to naprawdę spowodować, że mój serwer nie będzie mógł zrestartować się, jeśli wybiorę złe ustawienia?


1
Wyłączenie nadpisywania nie pomoże ci, gdy naprawdę zabraknie ci pamięci. Dodanie pamięci RAM do serwera może jednak pomóc.
Michael Hampton

2
Wyłączenie funkcji overcommit nie będzie ostatecznym rozwiązaniem, ale JEST bardzo pomocne, jeśli w dowolnym momencie na serwerze zabraknie pamięci (co jakiś czas przez kilka sekund) mam tylko kilka żądań HTTP odrzuconych (lub źle obsłużony), zamiast całkowicie i na zawsze zmarł mój serwer (dopóki go nie zrestartuję)
Matteo

Odpowiedzi:


30

Nadpisywanie pamięci można wyłączyć za pomocą vm.overcommit_memory=2

0 jest trybem domyślnym, w którym jądro heurystycznie określa przydział poprzez obliczenie wolnej pamięci w porównaniu do wykonywanego żądania przydziału. Ustawienie na 1 włącza tryb czarodziejów, w którym jądro zawsze reklamuje, że ma wystarczającą ilość wolnej pamięci na dowolny przydział. Ustawienie 2 oznacza, że ​​procesy mogą alokować maksymalnie do konfigurowalnej ilości ( overcommit_ratio) pamięci RAM i zaczną otrzymywać komunikaty o niepowodzeniu alokacji lub komunikaty OOM, gdy przekroczy ona tę ilość.

Czy jest to bezpieczne, nie. Nie widziałem żadnego właściwego przypadku użycia, w którym wyłączenie nadmiernej pamięci rzeczywiście pomogło, chyba że jesteś w 100% pewien obciążenia i pojemności sprzętowej. Jeśli jesteś zainteresowany, zainstaluj kernel-docspakiet i idź, /Documentation/sysctl/vm.txtaby przeczytać więcej lub przeczytać online .

Jeśli ustawisz vm.overcommit_memory=2, spowoduje to nadpisanie do procentu skonfigurowanej fizycznej pamięci RAM vm.overcommit_ratio(domyślnie 50%).

echo 0/1/2 > /proc/sys/vm/overcommit_memory 

To nie przetrwa ponownego uruchomienia. Aby zachować trwałość, umieść to w /etc/sysctl.confpliku:

vm.overcommit_memory=X

i biegnij sysctl -p. Nie ma potrzeby ponownego uruchamiania.


część, na którą nie odpowiedziałeś, to w którym pliku zmieniam to ustawienie vm.memory_overcommit, a zwłaszcza czy muszę zrestartować (lub cokolwiek innego), aby to
zadziałało

2
echo 0/1/2> / proc / sys / vm / overcommit_memory To nie przetrwa ponownego uruchomienia. Aby zachować trwałość, włóż ten plik do pliku /etc/sysctl.conf vm.overcommit_memory = X i uruchom sysctl -p. Nie ma potrzeby ponownego uruchamiania
Soham Chakraborty

Wielkie dzięki. Proszę, dodajcie to do treści odpowiedzi, abym mógł formalnie „zaakceptować”.
matteo

1
Dodano nową część.
Soham Chakraborty,

4
„overcommit_ratio” ma istotny wpływ, gdy używa się overcommit_memory = 2 - określa procent fizycznej pamięci RAM, którą można przydzielić! Więc jeśli stosunek <100, to pozostawisz trochę pamięci RAM nieprzydzielonej, być może do pamięci podręcznej dysku lub podobnej. Domyślny współczynnik wynosi 50%, więc użyjesz tylko 50% fizycznej pamięci RAM, jeśli tego nie zmienisz!
David Gardner

6

Całkowicie niewykwalifikowane stwierdzenie: Wyłączenie nadmiernej ilości pamięci jest zdecydowanie „bezpieczniejsze” niż jej włączenie.

Klient $ ustawił go na kilkuset serwerach WWW i bardzo pomógł w kwestiach stabilności. Jest nawet czek Nagios, który woła naprawdę głośno, jeśli kiedykolwiek NIE jest wyłączony.

Z drugiej strony ludzie mogą nie uważać tego za „bezpieczne” wycofywanie procesów z pamięci, gdy chcieliby po prostu przesadzić z pamięci małego barana i nigdy tak naprawdę nie skorzystaliby z tego. (tzn. SAP byłby bardzo dobrym przykładem)

Wracasz więc do sprawdzenia, czy to poprawi twoje wyniki. Ponieważ już to analizujesz, aby pozbyć się powiązanych problemów - myślę, że może ci to pomóc.

(Wiem, że zaryzykuję ocenę zrzędliwą przez jakąś zrzędliwą osobę)


3

Zgadzam się, że wyłączenie nadpisywania jest bezpieczniejsze niż włączenie go w niektórych okolicznościach. Jeśli serwer wykonuje tylko kilka dużych zadań pamięci (w moim przypadku takich jak symulacje obwodów), znacznie bezpieczniej jest odmówić aplikacji żądania pamięci z góry, niż czekać na zdarzenie OOM (które z pewnością nastąpi wkrótce). Często widzimy serwery problemy po tym, jak zabójca OOM wykonał swoją pracę.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.