Řešení problémů/paměť
Diagnostika
Kolik mám volné paměti?
Spusťte Sledování systému a záložku Zdroje.
Nebo použijte v Terminálu příkaz free -m (přepínač -m převede jednotky na MB).
~ $ free -m total used free shared buffers cached Mem: 2509 1404 1105 0 123 1034 -/+ buffers/cache: 247 2262 Swap: 1051 0 1051
RAM | swap | |
Celkem | 2509 MB | 1051 MB |
Obsazeno | 247 MB | 0 MB |
Volno | 2262 MB | 1051 MB |
Systém vykazuje pouze 9,9% využití RAM, 1150 MB je využito pro vyrovnávací paměť (cache/buffers), a v případě potřeby bude hned uvolněno. Swap není využit, což ukazuje na dostatečnou kapacitu RAM.
Který proces mi zabírá nejvíc paměti?
Spusťte Sledování systému, záložku Procesy, a klikněte na sloupec Paměť.
Nebo použijte v Terminálu příkaz top; pak zmáčkněte Shift+M, aby se procesy seřadily podle toho, kolik paměti (RSS/RES, viz níže) zabírají.
Nebo pro jednoduchý výpis bez aktualizace ps -eo rss,args | sort -rn | head (výpis „RAM top ten“)
~ $ ps -eo rss,args | sort -rn | head 168744 /usr/lib/firefox-3.6.24/firefox-bin 30208 /usr/bin/python /usr/share/kupfer/kupfer.py --no-splash 26172 compiz 24340 nautilus 20896 /usr/lib/firefox-3.6.24/plugin-container /usr/lib/flashplugin-installer/libflashplayer.so 1414 plugin true 18936 python /usr/share/stackapplet/stackapplet.py 18128 /usr/bin/X :0 -nr -verbose -auth /var/run/gdm/auth-for-gdm-87yGLs/database -nolisten tcp vt7 16696 gnome-panel 15508 /usr/bin/python /usr/share/system-config-printer/applet.py 13796 /usr/lib/gnome-panel/clock-applet --oaf-activate-iid=OAFIID:GNOME_ClockApplet_Factory --oaf-ior-fd=42
Řešení
Linux mi žere strašně moc RAM!
- Zkontrolujte výstup z
free -m
nebo Sledování systému. Pokud používáte minimum swapu nebo žádný, je vše v pořádku. Kernel se vždy snaží využít maximum RAM pro zrychlení práce. - Pokud ve výpise procesů vidíte, že některý neúměrně zabírá RAM (řádově stovky MB), může se jednat o chybu v programu (memory leak). Zkuste jinou verzi programu nebo jiný podobný, případně chybu nahlašte.
Zeptejte se na fóru Ubuntu
Snažte se uvést co nejvíce informací, hlavně
- podrobný popis problému a přesný přepis chybového hlášení (případně snímek obrazovky, třeba i z foťáku)
- co jste všechno už zkoušeli při řešení problému
- informace k systému (hardware, distribuce, vydání)
- přidejte výstupy z příkazů
ps -eo rss,args | sort -rn | head
afree -m
- případně připojte další relevantní logy (pokud jsou dlouhé, tak radši jako přílohu, nebo je nahrajte na Ubuntu pastebin)
- … a pokud se vám podaří problém nakonec vyřešit, nezapomeňte se pak na fóru pochlubit jak…
Technické detaily
Kolik RAM mám skutečně k dispozici?
Kapacita RAM modulů nemusí odpovídat údaji o volné paměti ve výstupu free
apod. Podívejte se, co k tomu říká kernel při bootování:
dmesg | grep -iw memory
... [ 0.000000] Memory: 2554056k/2612412k available (4940k kernel code, 57908k reserved, 2333k data, 688k init, 1703108k highmem) ... [ 0.746013] Freeing initrd memory: 14896k freed [ 1.316731] Freeing unused kernel memory: 688k freed
K dispozici je celkem 2612412k paměti.
57908k je rezervováno pro kernel a obsluhu paměti, z toho 4940k pro kód, 2333K pro různá data, 14896k bylo po zavedení systému uvolněno. Zbývá tedy 2554056k RAM.
Výpočet může vycházet pro různé systémy různě, ale vždy je třeba počítat se zabranou pamětí pro kernel a režii. Také pokud se velikost modulů RAM blíží 4GB na 32 bitovém systému, je potřeba počítat s ukrojením větší části paměti na mapování grafické paměti, I/O apod.
Co znamená VIRT, RSS/RES, SHR?
VIRT (virtual size) - celková velikost namapované paměti - kód, data, sdílené knihovny, paměť vyžádaná programem k použití. Maximální velikost paměti, kterou může momentálně proces použít.
RES (resident size) - paměť skutečně využitá procesem. Pokud si proces vyžádá 100M paměti, ale skutečně použije jen 1M, stoupne RES o 1M. Nezahrnuje ale část paměti ve swapu, a může obsahovat sdílenou paměť.
SHR (shared) - paměť, kterou je možné sdílet.
Nejvíce vypovídající hodnotou je asi RSS/RES, ale i ta je těžko izolovatelná pro konkrétní proces.
Jak zjistím údaje k RAM?
Použijte údaje z DMI (dmidecode
, případně lshw
), nebo SPD informace z EEPROM (decode-dimms
).
sudo dmidecode -t memory
sudo lshw -c memory
sudo -s apt-get install i2c-tools modprobe eeprom decode-dimms