Chcę monitorować wykorzystanie pamięci przez proces i chcę rejestrować te dane. Czy takie narzędzie istnieje?
Chcę monitorować wykorzystanie pamięci przez proces i chcę rejestrować te dane. Czy takie narzędzie istnieje?
Odpowiedzi:
Napisałem skrypt, aby dokładnie to zrobić . Zasadniczo pobiera próbki ps
w określonych odstępach czasu, aby stworzyć profil określonego procesu. Proces może zostać uruchomiony przez samo narzędzie monitorujące lub może być procesem niezależnym (określonym przez pid lub wzorzec poleceń).
Czasami, gdy pojawia się taka potrzeba, po prostu robię:
$ top -d 1 -b |grep <process> >>somefile
To nie jest eleganckie rozwiązanie, ale wykonuje zadanie, jeśli chcesz, aby szybka, surowa wartość zweryfikowała twoją hipotezę.
grep --line-buffered <process> >>somefile
aby zmusić grep do wypisywania każdej linii bez buforowania
sar
( System Activity Reporter ) z pakietu sysstat jest twoim przyjacielem w takich przypadkach.
Innym sposobem byłoby monitorowanie w połączeniu z danymi historycznymi, np. Munin, pnp4nagios, rrdtools, ...
sar
można skupić się tylko na jednym procesie? głównie wydaje się, że monitoruje system jako całość
pidstat
Polecenia również z pakietu sysstat zapewnia dość ładny interfejs dla statystyk dotyczących jednego procesu raportowania.
Oprócz wyżej wymienionego sar, polecam na szczycie . Zapisuje dziennik binarny, który można później przejrzeć, a poza tym pamięć oszczędza wiele innych informacji.
Możesz spróbować Valgrind .
Valgrind to środowisko instrumentacyjne do budowania narzędzi do analizy dynamicznej. Istnieją narzędzia Valgrind, które mogą automatycznie wykrywać wiele błędów zarządzania pamięcią i wątków oraz szczegółowo profilować twoje programy. Możesz także użyć Valgrind do tworzenia nowych narzędzi.
Dystrybucja Valgrind obejmuje obecnie sześć narzędzi jakości produkcyjnej: wykrywacz błędów pamięci , dwa wykrywacze błędów wątków, profil pamięci podręcznej i prognozowania gałęzi, bufor pamięci generującej graf wywołań i profil prognozowania gałęzi oraz profil stosu .
Podoba mi się prosta odpowiedź Sridhara, ale rzuciłem własną, zanim wypróbowałem jego:
import json, psutil, datetime, time
with open('log.txt', 'w') as f:
while True:
json.dump((datetime.datetime.now().isoformat(),
psutil.Process(7274).memory_info()._asdict()), f)
f.write('\n')
f.flush()
time.sleep(1)
Jest to w zasadzie przydatne tylko, jeśli chcesz uzyskać uporządkowane dane wyjściowe. Zmień odpowiednio 7274. Również Python 3.5. Coś się zepsuło _asdict()
, więc użyj Python 2.
Plik wyjściowy wygląda następująco:
["2019-03-19T11:21:53.784670", {"rss": 220389376, "vms": 538984448, "shared": 15724544, "text": 303104, "lib": 0, "data": 221364224, "dirty": 0}]
["2019-03-19T11:21:54.786136", {"rss": 220438528, "vms": 539119616, "shared": 15724544, "text": 303104, "lib": 0, "data": 221499392, "dirty": 0}]
["2019-03-19T11:21:55.787555", {"rss": 220495872, "vms": 539119616, "shared": 15724544, "text": 303104, "lib": 0, "data": 221499392, "dirty": 0}]
["2019-03-19T11:21:56.788754", {"rss": 220528640, "vms": 539119616, "shared": 15724544, "text": 303104, "lib": 0, "data": 221499392, "dirty": 0}]