Wolna pamięć RAM znika - wyciek pamięci?

11

W nowo uruchomionym systemie freeraporty o zużyciu 1,5 GB pamięci RAM (łącznie 8 GB pamięci RAM, Ubuntu 12.04 z lightdm i pulpitem plazmowym, uruchomiono jedno okno konsoli). Mając uruchomione aplikacje, których używam, nadal zużywa nie więcej niż 2G. Jednak po kilkudniowym uruchomieniu systemu coraz więcej mojej wolnej pamięci RAM znika - bez pokazywania się na liście używanych aplikacji: podczas gdy smem --pie=nameraporty zużywają mniej niż 20% (i jest dostępnych 80%), wszystko inne mówi różnie. free -mna przykład raporty z dnia 7:

             total       used       free     shared    buffers     cached
Mem:          7459       7013        446          0        178        997
-/+ buffers/cache:       5836       1623
Swap:         9536        296       9240

(więc widać, że nie są to bufory ani pamięć podręczna). Dzisiaj ostatecznie zakończyło się to całkowitym awarią systemu: zniknął menedżer okien, aplikacje „wisiały w powietrzu” (bez ramki) - i wyskakujące okienko informujące mnie o „zbyt wielu otwartych plikach”. Raporty Syslog:

kernel: [856738.020829] VFS: file-max limit 752838 reached

Zamknąłem więc te aplikacje, które udało mi się zamknąć, i zabiłem X, używając Ctrl-Alt-backspace. X próbował potem pojawić się ponownie z failafeX, ale nie był w stanie tego zrobić, ponieważ nie mógł już wykryć swojej konfiguracji. Więc przełączyłem się na konsolę, używając Ctrl-Alt-F2, przechwyciłem wszystkie informacje, które mogłem wymyślić (vmstat, free, smem, lsof proc/meminfo, ps aux), i w końcu ponownie uruchomiłem. X ponownie wymyślił FailafeX; tym razem powiedziałem mu, aby „przywróciło konfigurację z kopii zapasowej”, a następnie przełączyłem się na konsolę i z powodzeniem startxuruchomiłem środowisko graficzne.

Nie mam pojęcia, co powoduje ten problem - choć musi to dotyczyć samego X lub niektórych procesów użytkownika działających na X - ponieważ po zabiciu X free -mdane wyjściowe wyglądały następująco:

             total       used       free     shared    buffers     cached
Mem:          7459       2677       4781          0         62        419
-/+ buffers/cache:       2195       5263
Swap:         9536         59       9477

(~ 3,5 GB jest zwolnione) - aby porównać z wyjściem po nowym uruchomieniu:

             total       used       free     shared    buffers     cached
Mem:          7459       1483       5975          0         63        730
-/+ buffers/cache:        689       6769
Swap:         9536          0       9536

Dwa kolejne pomocne wyniki są dostarczane przez memstat -u. Krótko przed katastrofą:

User     Count     Swap      USS      PSS      RSS
mail         1        0      200      207      616
whoopsie     1      764      740      817     2300
colord       1     3200      836      894     2156
root        62    70404   352996   382260   569920
izzy        80   177508  1465416  1519266  1851840

Po zabiciu X:

User     Count     Swap      USS      PSS      RSS
mail         1        0      184      188      356
izzy         1     1400      708      739     1080
whoopsie     1      848      668      826     1772
colord       1     3204      804      888     1728
root        62    54876   131708   149950   267860

Po ponownym uruchomieniu ponownie w X:

User     Count     Swap      USS      PSS      RSS
mail         1        0      212      217      628
whoopsie     1        0     1536     1880     5096
colord       1        0     3740     4217     7936
root        54        0   148668   180911   345132
izzy        47        0   370928   437562   915056

Wykorzystanie systemu plików przez jeden tydzień Zużycie jądra / procesora przez tydzień

Edycja: Właśnie dodałem dwa wykresy z mojego systemu monitorowania. Ciekawe do zobaczenia: za każdym razem, gdy następuje skok zużycia pamięci, procesor również osiąga szczyt. Właśnie to znalazłem w tej chwili - i przypomina mi kolejny wskaźnik wskazujący na sam X: Często po powrocie do mojego komputera i odblokowaniu ekranu znalazłem coś, co bardzo ciężko pracowało na moim procesorze. Sprawdzając top, zawsze tak było /usr/bin/X :0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch -background none.

Po tym długim wyjaśnieniu wreszcie moje pytania:

  1. Jakie mogą być możliwe przyczyny?
  2. Jak mogę lepiej zidentyfikować zaangażowane procesy / aplikacje?
  3. Jakie kroki można podjąć, aby uniknąć tego zachowania - krótko od ponownego uruchomienia komputera przez X dni?

Pracowałem na 8.04 (Hardy) przez około 5 lat na mojej starej maszynie, nigdy nie miałem do czynienia z podobnymi problemami (zawsze ponad 100 dni bezczynności, przed ponownym uruchomieniem w celu np. Aktualizacji jądra). To jest teraz zupełnie nowa maszyna z nową instalacją 12.04 . W razie potrzeby niektóre specyfikacje:

APU AMD A4-3400 z kartą graficzną HD Radeon (tm), wykorzystującą sterownik open source ati / radeon (więc bez zainstalowanego fglrx), 8 GB pamięci RAM, WDC WD1002FAEX-0 hdd (1 TB), płyta główna Asus F1A75-V Evo. Ubuntu 12.04 64-bit z KDE4 / Plasma. Aplikacje zwykle otwierają się mniej więcej na stałe, między innymi Evolution, Firefox, konsola (z uruchomionym programem Midnight Commander, około 4 kartami) i LibreOffice - a także czasami Calibre, Gimp i Moneyplex (oprogramowanie bankowe, którego używam już od prawie 20 lat, w wersji, która dobrze się spisała na Hardy).

Edycja: Dzisiaj znalazłem jednego ze „złych facetów”: pulpit KDE4. Używana pamięć była ponownie do 5 GB, kiedy zrobiłem killall plasma-desktop && plasma-desktop. To uwolniło 1,3 GB pamięci RAM! psmówi:

                             RSS    SIZE   VSZ
plasma usage before restart  120988 526472 1300816
plasma usage after restart   92352  495972 1263632

Gdzie były te 1,3 GB? Różnica między tymi wartościami, jeśli zostaną zsumowane, wynosi 96 MB, a nie 1,3 GB.

I może to być tylko jedna część, ponieważ nadal używane jest 3,7 GB (powinno być mniej niż 2 GB). Monitorowałem to w ciągu ostatnich 6 dni za pomocą kilku narzędzi: używana pamięć (nie mówiąc o pamięci podręcznej i buforach) rośnie powoli, ale stale. Nawet jeśli nie jestem przy biurku, żeby coś uruchomić ...

Jeśli chodzi o monitorowanie procesów z otwartymi plikami, obecnie używam następującej 1-linijki (uwielbiam powłokę, a szczególnie bash), aby uzyskać top 5:

echo "$(for pid in $(ls -a /proc|egrep '^([0-9])*$'|sort -n 2>/dev/null); do \
if [ -e /proc/$pid/fd ]; then FHC=$(ls -l /proc/$pid/fd|wc -l); \
if [ $FHC -gt 0 ]; then PNAME="$(cat /proc/$pid/comm)"; \
echo "$FHC files opened by $pid ($PNAME)"; fi; fi; done)"|sort -r -n|head -n5

Polecenie tutaj w 4 wierszach dla lepszej czytelności. Stamtąd już nic więcej - z wyjątkiem tego, że Skype nie lubi zrywania połączenia internetowego. Każde rozłączenie powoduje nieznaczny wzrost liczby otwartych plików, ale nic dramatycznego. Z drugiej strony wydaje się, że plazma również jest za to odpowiedzialna:

Korzystanie z VFS (2 dni)

Widzisz upuszczenie uchwytów plików na końcu? To był restart plazmy.

Izzy
źródło
Czy sudo bash -c 'sync; echo 3 > /proc/sys/vm/drop_caches'usuwa dodatkowy taran? Możesz przeglądać otwarte pliki programów za pomocąlsof
Savvas Radevic
Czy próbowałeś też zmienić menedżera pulpitu? np. lxde (lub lubuntu-desktop)? Na koniec, czy jesteś pewien, że wyjście na dysk jest w porządku? Czy sprawdziłeś dane SMART dysku i szybkość kopiowania plików z / na dysk za pomocą płyty CD na żywo?
Savvas Radevic
Sprawdź to, aby sprawdzić, czy masz wyciek Jak wykryć wyciek pamięci
Mitch
@medigeek: Jak wskazałem, pamięci podręczne i bufory nie są problemem. Zobacz dane wyjściowe free. Przejście na inną DE faktycznie wziąłem pod uwagę; jeśli KDE3.5 byłby dostępny, nie skończyłbym na Plazmie. Może to być tylko tymczasowe sprawdzenie, czy w grę wchodzi plazma.
Izzy
@Mitch: Zrozumiałem, że memprof miał być użyty przeciwko znanemu procesowi (którego jeszcze nie wyizolowałem). Pewnie, że można go stosować w całym systemie? Co więcej, jak sugeruje błąd „zbyt wielu otwartych plików”, wydaje mi się, że jakiś proces otwiera wiele uchwytów plików, nigdy ich nie zwalniając. Nie jestem pewien, czy zostanie to złapane przez memprof. Teraz skonfigurowałem skrypt do przechwytywania 5 najlepszych procesów przez otwarte pliki - mam nadzieję, że to ujawni ten zły.
Izzy

Odpowiedzi:

6
  1. Ogromna liczba otwartych plików jest dobrą wskazówką, że coś idzie nie tak. Domyślam się, że to jakiś demon systemu KDE.

  2. Otwórz konsolę i uruchom „top”. Następnie użyj <i>, aby zmienić kolumnę sortującą na VIRT lub RES i zobaczyć, które programy używają najwięcej pamięci. Wyciek pamięci pojawi się jako masowo napełnione użycie pamięci wirtualnej, ponieważ gdy wskaźnik do wyciekającej pamięci zostanie utracony, nie zostanie użyty i zostanie wymieniony. Uruchom także „lsof” i poszukaj procesu z dużą ilością otwartych plików, ponieważ wydaje się, że to naprawdę przeciek deskryptora pliku.

  3. Wyśledz program i zgłoś błąd.

Alistair Buxton
źródło
Próbowałem już do tego użyć top / htop. Problem w tym, że nie pokazał żadnych wyników jak w przypadku pamięci RESident (jak opisano powyżej, tylko niewielka część używanej pamięci może być podłączona do uruchomionych aplikacji). A jeśli chodzi o pamięć VIRTual, trudno jest ją interpretować (nawet zaraz po uruchomieniu pamięć wirtualna zużywa tutaj do 3 TB - rozmiar, którego nawet mój dysk twardy nie byłby w stanie obsłużyć). Tak więc obecnie np. Evolution używa 1,9 GB VIRT, zgodnie z górą, podczas gdy całkowita używana pamięć sumuje się do 1,2 GB (bez bufora i buforów). I tak, moim pierwszym zamiarem jest wyśledzenie programu, abym mógł zgłosić błąd ...
Izzy
Właśnie dodałem 2 zdjęcia z mojego systemu monitorowania. Wygląda na to, że „skoki” zawsze miały miejsce o tej samej porze dnia (choć 1 wyjątek). Niestety imgs nie podaje znacznika czasu, aby sprawdzić za pomocą crona. Btw: czy jest jakiś sposób na monitorowanie, który proces ma liczbę otwartych plików?
Izzy
1
Twoje przypuszczenia były dobre. Choć nie był demonem, był to głównie komponent KDE: pulpit plazmowy (patrz wyżej). Zabawna rzecz: właśnie wymyśliłem i opublikowałem to tutaj - a 10 minut później codziennie apt-get update && apt-get upgradeaktualizowałem pulpit plazmowy; ci faceci są szybcy X) Teraz po prostu oglądam to przez chwilę, aby sprawdzić, czy problem został rozwiązany, zanim to stwierdzę. Do tej pory wszystko wyglądało obiecująco.
Izzy
Nadal wygląda stabilnie. Chociaż ani lsofnie topwskazywałem na „zły proces”, twoje przypuszczenia dotyczące demona KDE skierowały mnie w stronę sprawiającego problemy. Dziękuję jeszcze raz - czas działania mojej maszyny wynosi teraz około 14d i wszystko nadal wygląda stabilnie, chociaż nawet równolegle uruchomiłem takie rzeczy jak VirtualBox, kompilacja itp. Uważam to za rozwiązane i zaznaczam najbliższy mecz :)
Izzy,
0

Myślę, że to normalne zachowanie systemu. Najprawdopodobniej wszystko jest w porządku.

Możesz przeczytać ten genialny artykuł (linux zjadł mojego barana), aby zrozumieć, w jaki sposób linux zarządza twoim baranem i dlaczego nie musisz się martwić:

http://www.linuxatemyram.com/

gemue2010
źródło
4
Och - nigdy nie słyszałem, że to „normalne zachowanie systemu”, jeśli system ulega awarii po 7 dniach z błędem „zbyt wielu otwartych plików”. Używam Linuksa od około 15 lat, nigdy tego nie miałem. I tak, w pełni rozumiem, w jaki sposób Linux wykorzystuje „wolną pamięć RAM” (używając go do buforowania itp.) Jak wskazano powyżej: pamięć podręczna i bufory nie są tutaj problemem. Nie mówię o korzystaniu z pamięci RAM z dobrych powodów - Linux nigdy nie trzymałby się pamięci podręcznej w zamian za cenę zamiany.
Izzy