Uruchomienie dowolnego polecenia zwraca „Nie można przydzielić pamięci” na Ubuntu Server

16

Używam Ubuntu 14.04. Ostatnio, kiedy loguję się przez SSH z moim użytkownikiem z uprawnieniami sudo, każde uruchamiane polecenie powoduje błąd „Nie można przydzielić pamięci”. Oto kilka, które wypróbowałem na konsoli

myuser@mymachine:~$ whoami
-bash: fork: Cannot allocate memory
myuser@mymachine:~$ uname -a
-bash: fork: Cannot allocate memory

Nawet jeśli spróbuję sudo reboot now, otrzymuję powyższy błąd, więc nie wiem, co jeszcze mogę spróbować odblokować moją instancję. Jeśli to ma znaczenie, gospodarzem jest DigitalOcean.

Edycja: Zgodnie z podaną tutaj odpowiedzią / sugestią jest wynikiem „darmowy”

myuser@mymachine:~$ free
-bash: fork: Cannot allocate memory
Dave
źródło

Odpowiedzi:

12

Rozwiązanie

Jak mówi komunikat o błędzie, w urządzeniu zabrakło pamięci. Może to być z wielu powodów, ale w zasadzie coś pochłania całą twoją pamięć i nie pozostawia żadnej nawet dla podstawowego użycia poleceń.

Sugeruję ponowne uruchomienie dropletu (po prostu przejdź do panelu sterowania klienta i wybierz „Uruchom ponownie”), ssha następnie uruchom toplub htop. Miej oko na zużycie pamięci i zobacz, jaki proces zużywa całą pamięć. Stamtąd spróbuj

  1. Zabijanie / Usuwanie uszkodzonego programu / procesu

    UWAGA : PROSIMY zrobić swoje badania na temat, czy proces jest podstawowym procesem systemowym pierwszy! Jeśli proces systemowy powoduje problemy z pamięcią, nie zabijaj go po prostu, badaj go i znajdź konkretne sposoby radzenia sobie z nim.
  2. Zmiana konfiguracji tego programu / procesu, aby nie pochłonął całej pamięci.

Sugestie dotyczące zapobiegania ponownemu wystąpieniu problemu

  • Dobrze jest dodać pamięć wymiany , ponieważ przydziela ona więcej pamięci, jeśli kończy się.
  • Za każdym razem, gdy instalujesz programy, upewnij się, że skonfigurujesz je poprawnie, aby nie działały w niezamierzony sposób (np. Zjadają pamięć)
  • Po każdym dodaniu pakietu lub w zasadzie wszystkiego nowego, co jest konfigurowane, sprawdź za pomocą htoplub, topaby zobaczyć, ile pamięci zużywasz w bieżących programach. Jeśli zauważysz, że używasz prawie wszystkiego, spróbuj je usunąć, przechodząc i usuwając niepotrzebne programy / procesy.
  • Jeśli jest coś, co jest uruchamiane automatycznie (poza procesami systemowymi, oczywiście!), Którego nie rozpoznajesz lub nie chcesz, aby było uruchamiane automatycznie, usuń je! Ale zawsze wykonuj badania nad tym, czym jest proces przed jego zabiciem / usunięciem, ponieważ może to być niezbędne do procedur rozruchowych lub funkcji systemowych itp.
Dziwne
źródło
7

Aby wyjść z tego stanu bez ponownego uruchamiania, możesz ręcznie uruchomić OOM Killer w następujący sposób:

echo 1 > /proc/sys/kernel/sysrq
echo f > /proc/sysrq-trigger
echo 0 > /proc/sys/kernel/sysrq

Odniesienie

Luke F.
źródło
Czy masz dokumentację obsługującą te polecenia? Dlaczego nie tylko sudo sysctl -w vm.oom_kill_allocating_task=1lub na stałe/etc/sysctl.conf .
Pablo Bianchi
1
Nie wydaje się, że to by miało znaczenie, system nie osiąga rzeczywistego warunku OOM, jeśli dzieje się to w spoczynku, ponieważ żaden proces nie próbuje przydzielić pamięci i nie można uruchomić żadnych dodatkowych procesów. I na wpół niezwiązane, ale nie będziesz w stanie użyć sudo ani sysctl raz w tym stanie.
Luke F
To zadziałało dla mnie. Nie wiem jak, nie obchodzi mnie to. Nie mogłem nawet biegać sudo rebootprzed uruchomieniem tego. Dzięki!
boulder_ruby
0

W uzupełnieniu do zaakceptowanej odpowiedzi należy wziąć pod uwagę jeszcze jedną rzecz: W twoim systemie mogą zabraknąć uchwytów plików, a nawet buforów gniazd i nadal będą mieć dużo pamięci, dając ten sam błąd. Jest to szczególnie ważne, jeśli hosting współdzielony narzuca ograniczenia tego rodzaju. W systemach OpenVZ obejrzyj zawartość

# cat / proc / user_beancounters

To da ci w prawej kolumnie pierwsze przekroczenia. Jeśli to prawda, przejdź do większego pakietu hostingowego lub odszukaj najbardziej prawdopodobnego winowajcę: bazę danych mysql lub mariadb, która w przypadku wadliwej aplikacji PHP może przeciekać setki plików na sekundę.

Może się to również zdarzyć, jeśli Twój serwer WWW ma ssh otwarty na Internet i akceptuje logowanie się do nazwy użytkownika / hasła: nawet jeśli uruchomiłeś fail2ban, być może przyciągnąłeś rozproszony słownik, który zużywa również wiele zasobów.

aquaherd
źródło