2009-12-08 16 views
26

Czy istnieje gotowe do użycia rozwiązanie do rejestrowania zużycia pamięci od początku systemu? Chciałbym zapisać dane w prostym pliku tekstowym lub w bazie danych, aby móc je później przeanalizować.Jak rejestrować zużycie pamięci w systemie Linux?

Pracuję na systemie wbudowanym z systemem Linux 2.4. Muszę debugować problem związany ze zużyciem pamięci. Moja aplikacja uruchamia się automatycznie przy każdym uruchomieniu systemu. Potrzebuję sposobu, aby uzyskać dane z sygnaturami czasowymi w regularnych odstępach czasu (tak często, jak to możliwe), aby móc śledzić problem.

Objawy mojego problemu: po uruchomieniu systemu uruchomiłem moją główną aplikację i GUI, aby zwizualizować główne parametry systemu. GUI oparty na GTK + (serwer X). Jeśli wyłączę GUI i X serwer, to moja aplikacja działa poprawnie. Jeśli włączę GUI i X serwer, to nie działa, gdy mam 256 MB lub 512 MB pamięci fizycznej zainstalowanej na płycie głównej. Jeśli mam zainstalowane 1 GB pamięci, wszystko jest w porządku.

+0

To wygląda podobnie do tego pytania: Czy http://stackoverflow.com/questions/131303/linux-how-to-measure-actual-memory-usage-of-an-application-or-process – monksy

+0

Twoja aplikacja działa przynajmniej przez jakiś czas, zanim się zawiesza? –

+0

Tak, poprzednie wersje działają poprawnie w tym samym systemie. Teraz opracowujemy nową wersję i zaczynamy uderzać w ten problem. – bialix

Odpowiedz

23

mały skrypt jak

rm memory.log 
while true; do free >> memory.log; sleep 1; done 
+0

Rzeczywiście, jest to bardzo zbliżone do tego, czego potrzebuję. Potrafię samodzielnie dodawać sygnatury czasowe. – bialix

+9

'free -s 1> memory.log'; nie wiąże się to z kosztami rozpoczęcia nowego procesu co sekundę.Nie ma jednak znacznika czasu. (Wiem, że to stary post, ale szukałem tego samego, podobnie jak inni). –

+1

W niektórych wersjach darmowych konieczne jest określenie liczby wydruków przy pomocy -c z powodu błędu. W przeciwnym razie pokazuje wolny od błędów: argument sekundowy "1" nie powiodło się – Sputnik

2

Można umieścić coś jak

vmstat X >> mylogfile 

do skryptu startowego. Ponieważ aplikacja jest już uruchomiona, wystarczy dodać tę linię na końcu skryptu inicjalizacyjnego, którego aplikacja już używa. (gdzie X to # sekund między logów)

+0

Dzięki za podpowiedź, choć muszę rejestrować dane częściej niż w każdej sekundzie. – bialix

3

Istnieje program o nazwie

sar 

na systemów uniksowych. Możesz spróbować użyć tego do monitorowania użycia pamięci. Wykonuje pomiary w regularnych odstępach czasu. Więcej szczegółowych informacji można uzyskać, aby uzyskać szczegółowe informacje. Myślę, że opcja -r do wykonywania pomiarów pamięci, -i do określenia interwału, który chcesz.

+1

Zdecydowanie mocniejszy niż inne proponowane rozwiązania, choć nieco trudniejszy do skonfigurowania. – Ale

4

myślę dodanie wpisu crontab będzie wystarczająco

*/5 * * * * free -m >> some_output_file 

Są też inne narzędzia, takie jak SeaLion, New Relic, Server Density etc, które będą prawie takie same, ale zrobić są znacznie łatwiejsze do zainstalowania i skonfigurowania. Moim ulubionym jest SeaLion, ponieważ jest darmowy, a także daje niesamowity widok osi czasu na surowe wyjścia z popularnych poleceń systemu Linux.

+0

+1 dla Sealion, najszybsza rejestracja/konfiguracja EVER. Wydaje mi się, że zajęło mi to około 6 sekund - wpisałem swój adres e-mail, hasło. Wkleiłem pojedyncze polecenie w ssh i bum, pojawiły się moje statystyki. – rgvcorley

17

Poniższy skrypt wyświetla wydrukowane stemple i nagłówek.

#!/bin/bash -e 

echo "  date  time $(free -m | grep total | sed -E 's/^ (.*)/\1/g')" 
while true; do 
    echo "$(date '+%Y-%m-%d %H:%M:%S') $(free -m | grep Mem: | sed 's/Mem://g')" 
    sleep 1 
done 

Wynik wygląda następująco (testowany na Ubuntu 15.04, 64-bitowy).

 date  time   total  used  free  shared buffers  cached 
2015-08-01 13:57:27   24002  13283  10718  522  693  2308 
2015-08-01 13:57:28   24002  13321  10680  522  693  2308 
2015-08-01 13:57:29   24002  13355  10646  522  693  2308 
2015-08-01 13:57:30   24002  13353  10648  522  693  2308 
Powiązane problemy