Cum aflu câtă memorie consumă fiecare aplicație

Dec. 6, 2018, 11:47 a.m. osx bash linux centos


De când cu AWS, Azure, Digital Ocean, Webfaction mult mai mulți utilizatori cu ceva experiență în IT preferă să aibă propriul server la un "cloud provider", în defavoarea hosting-ului clasic cu access cpanel.

Mai ales dacă avem un "shared server" este de bun simț să monitorizăm resursele. Multă lume folosește free, top sau și mai tare htop, însă pe un shared server valorile afișate se referă la toți utilizatorii care își împart colegial resursele.

Așa că multă lume se întreabă: "Cum aflu câtă memorie consumă fiecare aplicație?"

Deschide o sesiune terminal, iTerm sau putty și încearcă opțiunea rss a comenzii ps.
De exemplu:

[gigi@web555 myLogs]$ ps -u gigi -o rss,command
  RSS COMMAND
 4136 /usr/pgsql-9.4/bin/postgres -D /home/gigi/webapps/margareta/data
  620 postgres: logger process
 4668 postgres: checkpointer process
  940 postgres: writer process
 1460 postgres: wal writer process
 1684 postgres: autovacuum launcher process
 1068 postgres: stats collector process
 1204 /bin/sh -c ~/myApps/filebeat-6.5.1/filebeat -c /home/gigi/myApps
30684 /home/gigi/myApps/filebeat/filebeat -c /home/gigi/myA
30544 /home/gigi/myApps/filebeat/filebeat -c /home/gigi/myA
 2224 /home/gigi/webapps/decebal/apache2/bin/httpd.worker -f /home/gigi/webapp
 4960 /home/gigi/webapps/decebal/apache2/bin/httpd.worker -f /home/gigi/webapp
43736 /home/gigi/webapps/decebal/apache2/bin/httpd.worker -f /home/gigi/webapp
  876 /usr/sbin/sendmail -FCronDaemon -i -odi -oem -oi -t -f gigi
 1620 ps -u gigi -o rss,command


Vedem de exemplu un server postgresql pe nume margareta, un server apache2 pe nume decebal, șamd. În prima coloană putem vedea câtă memorie ocupă fiecare.

Ok, ok dar dacă vreau totuși să știu căt folosesc în total din acel 1GB RAM alocat serverului meu? Păi atunci să folosim bc și să facem totalul:

[gigi@web555 myLogs]$ ps -u gigi -o rss | grep -v RSS |paste -sd+ | bc
696272

Deci toate procesele care rulează pentru utilizatorul gigi însumează 696272 kB. Dacă vrem însă o formatare mai drăguță putem folosi numfmt, citește aici mai multe despre numfmt:

[gigi@web555 myLogs]$ ps -u gigi -o rss | grep -v RSS |paste -sd+ | bc | numfmt --from-unit=1024 --to=iec
681M

Dacă tot ești aici încearcă rapid și o buclă (habar nu am cum se traduce while loop în română, cred că trebuie să caut niște cărți sau cursuri de la Poli să mă pun la curent) care să verifice memoria utilizată din 5 in 5 secunde:

[gigi@web555 myLogs]$ while true; do ps -u gigi -o rss | grep -v RSS |paste -sd+ | bc | numfmt --from-unit=1024 --to=iec; sleep 5; done
689M
689M
689M
^C

Sau și mai bine, când pleci în pauza de prânz direcționează rezultatul către cat și către un fișier pe disc (da, se poate și mai scurt dar riscăm să nu mai fie citibil ce introducem în linia de comandă) fișier care îl putem monitoriza folosind tail -f și pe care îl poți analiza ulterior mai ușor (pentru asta am introdus și date, dar și echo -n ca să îți apară frumos totul pe o linie ;-) ).

[gigi@web555 myLogs]$ while true; do ps -u gigi -o rss | grep -v RSS |paste -sd+ | bc | numfmt --from-unit=1024 --to=iec; sleep 5; done | cat > testRSS.out

^Z
[1]+  Stopped                 while true; do
    ps -u gigi -o rss | grep --color=auto -v RSS | paste -sd+ | bc | numfmt --from-unit=1024 --to=iec; sleep 5;
done | cat > testRSS.out
[gigi@web555 myLogs]$ bg
...skipping...
[1]+ while true; do
    ps -u gigi -o rss | grep --color=auto -v RSS | paste -sd+ | bc | numfmt --from-unit=1024 --to=iec; sleep 5;
done | cat > testRSS.out &
[gigi@web555 myLogs]$
[gigi@web555 myLogs]$ tail -f testRSS.out
688M
688M
688M
689M
^C
[gigi@web555 myLogs]$ while true; do date; ps -u gigi -o rss | grep -v RSS |paste -sd+ | bc | numfmt --from-unit=1024 --to=iec; sleep 5; done
Thu Dec  6 12:53:38 UTC 2018
687M
Thu Dec  6 12:53:43 UTC 2018
687M
^C
[gigi@web555 myLogs]$ while true; do echo -n `date`; ps -u gigi -o rss | grep -v RSS |paste -sd+ | bc | numfmt --from-unit=1024 --to=iec; sleep 5; done
Thu Dec 6 12:54:40 UTC 2018687M
^C
[gigi@web555 myLogs]$ while true; do echo -n `date`" " ; ps -u gigi -o rss | grep -v RSS |paste -sd+ | bc | numfmt --from-unit=1024 --to=iec; sleep 5; done
Thu Dec 6 13:01:22 UTC 2018 688M
Thu Dec 6 13:01:27 UTC 2018 688M
Thu Dec 6 13:01:32 UTC 2018 688M
^C


Nota bene:
Am folosit CTRL+z ca să "înghețăm" și apoi bg - ca să trimitem un task/comandă în "background". E bine să mai facem un jobs din când în când, pentru a vedea ce am trimis să ruleze "în spate" în sesiunea actuală de terminal.
Când ne plictisim facem fg ca să readucem în prim plan procesul respectiv (asta dacă avem un singur task în bg, iar dacă nu, atunci fg 1 pentru primul "job" din listă, fg 2 pentru al doilea, șamd; mai multă documentare există însă și google :-) ), pentru ca apoi să îl exterminăm cu CTRL+c:

[gigi@web555 myLogs]$ jobs
[1]+  Running                 while true; do
    ps -u gigi -o rss | grep --color=auto -v RSS | paste -sd+ | bc | numfmt --from-unit=1024 --to=iec; sleep 5;
done | cat > testRSS.out &
[gigi@web555 myLogs]$ fg
while true; do
    ps -u gigi -o rss | grep --color=auto -v RSS | paste -sd+ | bc | numfmt --from-unit=1024 --to=iec; sleep 5;
done | cat > testRSS.out
^C

Am pornit de la 3 rânduri și am ajuns la ditamai pagina. Mă opresc aici.
Pentru observații, păreri, sfaturi lăsați un comentariu mai jos. O zi bună