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,
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.
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?
Odpowiedzi:
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-docs
pakiet i idź,/Documentation/sysctl/vm.txt
aby przeczytać więcej lub przeczytać online .Jeśli ustawisz
vm.overcommit_memory=2
, spowoduje to nadpisanie do procentu skonfigurowanej fizycznej pamięci RAMvm.overcommit_ratio
(domyślnie 50%).To nie przetrwa ponownego uruchomienia. Aby zachować trwałość, umieść to w
/etc/sysctl.conf
pliku:i biegnij
sysctl -p
. Nie ma potrzeby ponownego uruchamiania.źródło
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ę)
źródło
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ę.
źródło