Wydaje mi się, że mam większy wyciek pamięci w moim obecnym systemie Ubuntu
Po zgłoszeniu dziwnych błędów pamięci Eclipse ( /ubuntu/148998/eclipse-constant-different-out-of-memory-errors ) zacząłem dzisiaj otrzymywać komunikaty o błędach „Za mało pamięci” w mojej konsoli - podczas gdy wykonując proste zadania, takie jak wpisywanie sudo -s
- a nawet -free -m
Wpisywanie „free-m” wielokrotnie pokazało mi, jak moja pamięć RAM szybko rośnie z 700M do 900M, a po kilku sekundach rośnie do wielkości 2000M (po zwolnieniu pamięci za pomocą echo 3 > /proc/sys/vm/drop_caches
)
Zaćmienie nie jest przyczyną, całkowicie zabiłem proces, a baran wciąż się wznosił. Czy jest jakiś sposób na wykrycie, skąd pochodzi wyciek? Nie mogę nawet zaktualizować mojego systemu, ponieważ apt-get update
kończy się niepowodzeniem (prawdopodobnie dlatego, że brakuje pamięci)
Za pomocą Ubuntu 11.10
źródło
Odpowiedzi:
memprof
Źródło: Podręcznik Ubuntu
źródło
Po pierwsze, upewnij się, że masz dostępny folder tymczasowy z wystarczającą ilością wolnego miejsca. Następujące polecenia tworzą zrzuty, które mogą mieć rozmiar kilku GB.
Możesz utworzyć nowy folder tmp za pomocą następującego polecenia. Możesz przejść
/tmp
na inny system plików z wystarczającą ilością miejscaKroki, aby znaleźć wyciek pamięci
Znajdź PID procesu powodującego wyciek pamięci (możesz również użyć np.
htop
Jeśli jest dostępny) i zapisz go w zmiennej o nazwiepid
Biorąc pod uwagę, że PID jest dostępny w zmiennej
pid
, możesz przechwycić zużycie pamięci za pomocą/proc/$pid/smaps
i zapisać w niektórych plikach takich jakbeforeMemInc.txt
.Zrób
/proc/$pid/smaps
ponownie i zapisz jakoafterMemInc.txt
Znajdź różnicę między pierwszym
smaps
a drugimsmaps
, np. Za pomocąZanotuj zakres adresów, w których wzrosła pamięć, na przykład:
Użyj GDB, aby zrzucić pamięć przy uruchomionym procesie lub uzyskać zrzut rdzeniowy za pomocą
Użyłem gdb w uruchomionym procesie, aby zrzucić pamięć do jakiegoś pliku.
Teraz użyj
strings
polecenia lub,hexdump -C
aby wydrukowaćmemory.dump
Z tego otrzymujesz czytelne informacje, które pomagają zlokalizować te ciągi w kodzie źródłowym.
źródło
cat /proc/2882/smaps > /tmp/before.txt
w kroku 2. Co zrobiłem źle?Sztuczka drop_cache nie zwolni pamięci, zresetuje pamięć podręczną. Używa polecenia ps, jeśli chcesz określić, które procesy zużywają więcej pamięci.
Na przykład, aby monitorować listę 15 najlepszych użytkowników pamięci rezydentnej.
Możesz również sprawdzić rezerwację pamięci współdzielonej, ale będziesz wiedział tylko, kto jest właścicielem segmentów.
Alokacja Pmap:
zwróć uwagę, że zarezerwowane alokacje są znacznie wyższe niż rzeczywiste przydzielone strony (df „używane”)
Przydziały systemu V:
Edycja : Musisz przejść,
--sort -rss
abyps
uzyskać procesy o największym zużyciu pamięci, w przeciwnym razie lista procesów zostanie posortowana według wartości liczbowej i zapewni procesy o najmniejszym zużyciu pamięci.źródło
Mam starszą używaną maszynę, która ciągle wyrzuca komunikaty o wycieku pamięci:
Mój skrypt:
Nazwałem to
cache.sh
Widać, że spadłem do 374 MB, uruchomiłem
sync; sudo echo 3 > /proc/sys/vm/drop_caches
i odzyskałem 417 MB. Możnacron
go uruchamiać co 5 minut lub po prostu mieć otwarty terminal i uruchamiać go, gdy widać niską wydajność. Tak, muszę dodać pamięć do maszyny ...źródło
memstat jest również dobrym narzędziem, które pokazuje ilość pamięci używanej przez każdy blok, a także ilość pamięci używanej przez załadowane biblioteki. Nie jest to najlepsze narzędzie, ale warto je wykorzystać do gromadzenia szczegółów i statystyk.
memstat -w -p pid
to dobre polecenie do użycia.źródło
Miałem podobny problem, ale z bardzo dziwnym rozwiązaniem.
Z jakiegoś nieznanego powodu miałem serwer poczty na konfiguracji i działającym laptopie. Nie wiem, dlaczego go miałem ... Jednak zamknąłem jego usługę i okazało się, że to oprogramowanie na moim laptopie było pod atakiem DDOS. Potem wszystko było normalne.
źródło