Błędy związane z pamięcią RAM (Out of Memory – OOM): Zrozumienie zarządzania pamięcią, procesy zużywające za dużo zasobów i sposoby radzenia sobie z OOM Killerem
Błędy związane z pamięcią RAM (Out of Memory – OOM): Zrozumienie zarządzania pamięcią, procesy zużywające za dużo zasobów i sposoby radzenia sobie z OOM Killerem
🧠 Wprowadzenie
Zarządzanie pamięcią w systemie Linux to kluczowy element stabilności działania systemu. Gdy pamięć RAM i przestrzeń wymiany (swap) zostaną wyczerpane, system uruchamia OOM Killera (Out of Memory Killer) – mechanizm, który zabija procesy zużywające najwięcej pamięci, by uratować system przed całkowitym zawieszeniem. W tym artykule wyjaśnimy, czym jest OOM Killer, jak diagnozować problemy z pamięcią i jak zapobiegać takim sytuacjom w przyszłości.
🧮 Jak Linux zarządza pamięcią?
Linux dynamicznie zarządza pamięcią RAM, dzieląc ją na:
- Pamięć aktywną – dla działających procesów
- Pamięć buforowaną – dla plików i I/O
- Pamięć wymiany (swap) – gdy RAM się kończy
👉 Komenda do podglądu użycia pamięci:
free -h
💥 Co to jest OOM Killer?
OOM Killer to mechanizm jądra systemu Linux, który uruchamia się w sytuacji braku dostępnej pamięci RAM i swap. Wybiera procesy do „zabicia”, aby odzyskać pamięć.
📌 Typowy wpis z logu systemowego:
Out of memory: Kill process 1234 (firefox) score 987 or sacrifice child
Killed process 1234 (firefox), UID 1000, total-vm:2048576kB
🔍 Jak znaleźć procesy zużywające pamięć?
1. top i htop
top
- Sortowanie według zużycia pamięci:
Shift + M
2. ps z sortowaniem
ps aux --sort=-%mem | head
3. smem
Lepsze podsumowanie rzeczywistego użycia pamięci:
sudo apt install smem
smem -rs rss
📈 Diagnostyka OOM
1. Przegląd logów:
dmesg | grep -i 'oom'
journalctl -k | grep -i 'killed process'
2. Śledzenie wykorzystania pamięci:
- Użycie
vmstat:
vmstat 5
- Sprawdzanie stanu pamięci:
cat /proc/meminfo
🔒 Zapobieganie OOM Killerowi

🧱 1. Konfiguracja limitów procesów (ulimit)
Ustal limity pamięci dla użytkowników lub procesów:
ulimit -v 1048576 # maks. 1 GB pamięci
📁 2. Cgroups
Użyj cgroups, by ograniczyć użycie pamięci przez konkretne procesy, np. kontenery Dockerowe:
docker run -m 512m ubuntu
⚙️ 3. Swappiness
Dostosowanie poziomu użycia SWAP:
cat /proc/sys/vm/swappiness
echo 10 > /proc/sys/vm/swappiness
📌 4. oom_score_adj
Możesz ustawić priorytety zabijania procesów:
echo -1000 > /proc/$(pidof critical_process)/oom_score_adj
-1000oznacza „nie zabijaj nigdy”+1000oznacza „zabij w pierwszej kolejności”
🧪 Przykład rzeczywisty
📦 Problem:
Aplikacja Java na serwerze nagle zostaje „zabita”, a użytkownicy zgłaszają przerwy w działaniu.
📋 Diagnoza:
- Sprawdzenie logów:
journalctl -k | grep -i java
- Znaleziono wpis:
Out of memory: Kill process 8765 (java) score 982 or sacrifice child
- Ustalenie przyczyny: brak limitu pamięci JVM → zużycie całej RAM
🛠️ Rozwiązanie:
Dodano ograniczenie pamięci:
java -Xmx512m -jar app.jar
✅ Dobre praktyki
- Monitoruj system (
top,htop,vmstat,ps) - Konfiguruj limity pamięci (
ulimit,cgroups) - Unikaj aplikacji działających bez ograniczeń pamięci
- Zadbaj o wystarczający swap
- Ustal priorytety z
oom_score_adj
🧠 Podsumowanie
OOM Killer to przydatny, ale groźny mechanizm. Zrozumienie działania zarządzania pamięcią w Linuksie, regularne monitorowanie oraz stosowanie limitów i priorytetów procesów może zapobiec niespodziewanym awariom usług. W środowiskach produkcyjnych każda sekunda dostępności ma znaczenie — dlatego warto zawczasu skonfigurować system tak, by radził sobie z przeciążeniem pamięci bezboleśnie.






