Udostępnij za pośrednictwem


Błąd braku pamięci występuje na maszynie wirtualnej platformy Azure z systemem Linux

Dotyczy: ✔️ maszyny wirtualne z systemem Linux

Oryginalny numer KB: 4010058

W tym artykule omówiono kilka scenariuszy, w których maszyna wirtualna platformy Microsoft Azure z systemem operacyjnym Linux kończy się pamięcią (OOM). Warunek OOM powoduje niepowodzenie nowych żądań alokacji pamięci lub powoduje wywołanie procesu OOM Killer . Jeśli jest skonfigurowany do tego celu, jądro panikuje i zostanie utworzony plik zrzutu pamięci.

Symptomy

W systemie operacyjnym Linux problemy z alokacją pamięci mogą wystąpić w dowolnym momencie, gdy system operacyjny jest uruchomiony. Te problemy obejmują różne scenariusze rejestrowania. Poniższe sekcje zawierają kilka przykładów typowych komunikatów o błędach.

Objaw 1: Niepowodzenie alokacji pamięci

[12345.678901] ruby: błąd alokacji strony: order:0, mode:0x1080020(GFP_ATOMIC), nodemask=(null)

Objaw 2: Brak pamięci

Napotkasz błąd OOM w dziennikach lub w wierszu polecenia podczas interakcji z systemem operacyjnym. Na przykład plik dziennika systemu pokazuje następujący błąd:

localhost kernel: Out of memory: Kill process 2154 (oom) score 844 or sacrifice child

Poniższy tekst przedstawia inną formę komunikatu OOM. Ten komunikat wskazuje, że wywołano program OOM Killer:

Jul  7 21:09:50 hostname kernel: [ 1347.090377] output.rb:140 invoked oom-killer: gfp_mask=0x100cca(GFP_HIGHUSER_MOVABLE), order=0, oom_score_adj=0

W konsoli szeregowej lub dzienniku systemu ślad stosu jądra jest często generowany dla dowolnego zdarzenia OOM. Komunikat jest podobny do następującego tekstu:

[1774674.375021] out_of_memory+0x1ab/0x4a0

Objaw 3: Niepowodzenie rozwidlenia

Jeśli system operacyjny próbuje uruchomić nowy proces, ale nie może utworzyć tego procesu, wystąpi komunikat "nie można rozwidlić". Ten komunikat o błędzie zwykle wskazuje przyczynę, dla którego nie można rozwidlić procesu. Jedną z typowych przyczyn — i tej, która ma zastosowanie w tej sytuacji — jest niepowodzeniem przydzielenia niezbędnej pamięci dla stanu procesu początkowego. Następujący tekst zawiera jedną formę wiadomości:

Feb 29 08:35:52 hostname systemd: Failed to fork: Cannot allocate memory

Przyczyna

Na najwyższym poziomie podstawową przyczyną tego błędu jest to, że system operacyjny nie może przydzielić pamięci dla żądania, które zostało wykonane. Przyczyny błędów mogą się różnić, a administrator systemu musi przeprowadzić diagnostykę w momencie napotkania błędu. Możliwe przyczyny błędów alokacji pamięci obejmują, ale nie są ograniczone do następujących wystąpień:

  • Nieoczekiwane lub niespodziewane wzrosty obciążenia aplikacji
  • Fragmentacja pamięci (małe wolne bloki pamięci są dostępne, ale żaden z bloków nie jest wystarczająco duży, aby spełnić żądanie)
  • Błędna konfiguracja parametrów pamięci
  • Wycieki pamięci w aplikacjach
  • Błędy jądra
  • Brak dostępnego miejsca zamiany lub zamiany pełnej

Diagnoza

W momencie wykrycia błędów należy przeprowadzić diagnostykę pamięci. Diagnoza zwykle nie może być wykonywana retrospektywnie. Do diagnozowania użycia pamięci i fragmentacji można użyć różnych narzędzi i metod. Poniższa lista narzędzi nie powinna być postrzegana jako wszystkie, ale lista jest punktem wyjścia do diagnozowania:

  • free

  • vmstat

  • top

  • htop

  • atop

  • cat /proc/meminfo

  • cat /proc/buddyinfo

  • echo m > /proc/sysrq-trigger

    Uwaga 16.

    Dane wyjściowe tego polecenia znajdują się w dzienniku systemu. Zazwyczaj ten dziennik jest plikiem /var/log/messages lub /var/log/syslog .

  • sa/sar

    Uwaga 16.

    Zestaw narzędzi umożliwia sa analizowanie historycznych danych agregacji dla systemu jako całości, ale bez szczegółów na poziomie procesu.

Rozwiązanie

Najbardziej odpowiednie rozwiązanie wymaga dokładnej analizy użycia pamięci, wzorców i konfiguracji. Takie rozwiązania obejmują co najmniej jeden z następujących elementów akcji:

  • Skalowanie w górę pamięci maszyny wirtualnej
  • Ponowne konfigurowanie cgroup definicji, jeśli są używane limity
  • Zmiana ogromnej alokacji stron
  • Konfigurowanie miejsca wymiany

Aby skonfigurować miejsce wymiany na platformie Azure, możesz wybrać między dwoma ogólnymi podejściami, które są zgodne z najlepszymi rozwiązaniami platformy Azure. Oba podejścia wymagają modelu maszyny wirtualnej, który zawiera dysk zasobów.

Typ systemu Opis podejścia
Systemy korzystające z pakietu cloud-init Preferowaną metodą jest użycie konfiguracji cloud-init lub skryptów na rozruch.
Systemy, które nie korzystają z pakietu cloud-init, ale używają agenta platformy Azure Dyrektywy konfiguracji istnieją w pliku /etc/waagent.conf , aby utworzyć plik wymiany na dysku zasobu o rozmiarze dostosowywalnym.

Aby uzyskać więcej informacji na temat tych metod, zobacz następujące artykuły:

Zastrzeżenie dotyczące innych firm

Produkty innych firm omówione w tym artykule są wytwarzane przez producentów niezależnych od firmy Microsoft. Firma Microsoft nie udziela żadnych gwarancji, dorozumianych ani żadnego innego rodzaju, w odniesieniu do wydajności lub niezawodności tych produktów.

Skontaktuj się z nami, aby uzyskać pomoc

Jeśli masz pytania lub potrzebujesz pomocy, utwórz wniosek o pomoc techniczną lub zadaj pytanie w społeczności wsparcia dla platformy Azure. Możesz również przesłać opinię o produkcie do społeczności opinii na temat platformy Azure.