Ordinamento dei processi in base all'utilizzo della memoria


128

Sono in grado di vedere l'elenco di tutti i processi e la memoria tramite

ps aux 

e passando attraverso VSZ e RSS

C'è un modo per ordinare l'output di questo comando in ordine decrescente sul valore RSS?


Quale sarebbe l'output previsto? checkps
Rahul Patil,

Ulteriori esempi su come usare --sortsono qui: alvinalexander.com/linux/…
slm

Risposte:


224

Utilizzare il comando seguente:

ps aux --sort -rss

Controlla qui per ulteriore utilizzo della memoria di processo Linux


12
nota - se vuoi vedere i migliori risultati è utile headps aux --sort -rss | head -n15
collegarlo

3
Ottengo l'errore ps: illegal option -- -
Miguel Mota,

@MiguelMota E se in questo modo: ps aux --sort=rss?
coffeMug

2
@coffeMug non ha funzionato, ma ha funzionatops aux | sort -rn -k 6
Miguel Mota,

1
@coffeMug non sono sicuro di come trovare la versione, ma sono su Mac OSX, quindi forse è per questo che
Miguel Mota,

25

Un metodo rapido e sporco è solo pipe l'output di ps auxal sortcomando:

$ ps aux | sort -rn -k 5,6

Esempio

$ ps aux | sort -rn -k 5,6
...
root      1584  0.0  0.0  22540  1236 ?        S    07:04   0:01 hald-addon-storage: polling /dev/sr0 (every 2 sec)
root      1575  0.0  0.0  22536   872 ?        S    07:04   0:00 /usr/libexec/hald-addon-generic-backlight
root      1574  0.0  0.0  22536   880 ?        S    07:04   0:00 /usr/libexec/hald-addon-leds
root      1565  0.0  0.0  22536   876 ?        S    07:04   0:00 /usr/libexec/hald-addon-rfkill-killswitch
saml      2507  0.0  0.0  22232   500 ?        S    07:05   0:00 dbus-launch --sh-syntax --exit-with-session
root      1671  0.0  0.0  22156   936 ?        Ss   07:04   0:00 xinetd -stayalive -pidfile /var/run/xinetd.pid
...

Questo non gestisce le intestazioni di colonna che si confondono con l'output, ma è facile da ricordare sulla riga di comando ed è un modo accettabile per fare ciò che vuoi quando visualizzi manualmente questo tipo di output.

Esempio

root      1791  0.0  0.0   4140   536 tty2     Ss+  07:04   0:00 /sbin/mingetty /dev/tty2
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root       996  0.0  0.0      0     0 ?        S    07:04   0:01 [kdmflush]
root       982  0.0  0.0      0     0 ?        S    07:04   0:00 [kvm-irqfd-clean]

Più suggerimenti

Un ulteriore suggerimento sarebbe quello di reindirizzare l'intero output a un altro comando come less. Ciò consente di esaminare le informazioni una pagina alla volta e utilizzare anche i tasti freccia e i tasti pagina su / giù per scorrere avanti e indietro nell'output.

$ ps aux | sort -rn -k 5,6 | less

Se il tuo output si sta esaurendo molto, puoi anche utilizzare l' -Sinterruttore su less, il che costringerà invece tutto l'output a rimanere su una sola riga. È quindi possibile utilizzare i tasti freccia per spostarsi a sinistra / destra / su / giù per vedere tutto.

$ ps aux | sort -rn -k 5,6 | less -S

Ordinamento in ps

Alcune versioni di psforniscono la possibilità di utilizzare --sort. Questo switch può quindi prendere le chiavi che sono precedute da a +o a -per indicare l'ordinamento ... dal minimo al massimo o dal massimo al minimo.

Esempi

VSZ, -rss

$ ps aux --sort=vsz,-rss | head -5
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         2  0.0  0.0      0     0 ?        S    07:03   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    07:03   0:00 [ksoftirqd/0]
root         4  0.0  0.0      0     0 ?        S    07:03   0:01 [migration/0]
root         5  0.0  0.0      0     0 ?        S    07:03   0:00 [watchdog/0]

+ VSZ, + rss

$ ps aux --sort=+vsz,+rss | head -5
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         2  0.0  0.0      0     0 ?        S    07:03   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    07:03   0:00 [ksoftirqd/0]
root         4  0.0  0.0      0     0 ?        S    07:03   0:01 [migration/0]
root         5  0.0  0.0      0     0 ?        S    07:03   0:00 [watchdog/0]

-vsz, -rss

$ ps aux --sort=-vsz,-rss | head -5
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      1832  0.0  0.0 2088924 3312 ?        Sl   07:04   0:00 /usr/sbin/console-kit-daemon --no-daemon
saml      3517  0.2  1.2 2073196 100492 ?      Sl   07:06   0:34 /home/saml/.dropbox-dist/dropbox
saml      3516  0.0  0.8 2071032 67388 ?       Sl   07:06   0:07 /home/saml/.dropbox-dist/dropbox
saml      2657  0.1  0.7 1580936 57788 ?       Sl   07:05   0:27 nautilus

visualizzerà ps sempre le colonne nel modo in cui ti aspetti sortdi vederle / elaborarle?
Felipe Alvarez,

Dipende da quale versione di ps
slm

2
A ... | lessè un buon consiglio ma a volte il tuo processo ha un'enorme riga di comando e ingombra l'output. In questi casi ... | less -Sfunziona meglio.
rifiuti il

@waste - buon consiglio, ricorda solo che si -Stronca e quindi potresti perdere parte di ciò che vuoi vedere, ma per il resto un buon consiglio se sei interessato solo alla maggior parte delle colonne.
slm

@slm Non sono sicuro che sia il caso less -S. Quando chiudi la lessvista tutto scompare, ma finché sei nella vista, puoi scorrere in verticale ma anche in orizzontale. Copiare potrebbe essere difficile, però.
spreco il

6

Anche se ps non riflette l'effettiva memoria utilizzata, questo comando è piuttosto utile.

ps -eo size,pid,user,command --sort -size | awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }'

4

ps aux --sort -rss è carino:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
user     5984  0.8  7.4 1632488 296056 ?      Sl   06:30   6:18 /usr/lib/chromium-browser/chromium-browser --type=ren
user    23934 21.7  6.0 1565600 241228 ?      Sl   15:45  40:10 /opt/atom/atom --type=renderer --enable-experimental-
user     5533  0.9  5.1 3154096 206376 ?      SLl  06:30   6:47 /usr/lib/chromium-browser/chromium-browser --enable-p
user    17306  1.7  4.9 1360648 196124 ?      Sl   18:14   0:36 /usr/lib/chromium-browser/chromium-browser --type=ren
user    22272 30.1  4.6 1347784 185032 ?      Sl   18:43   1:54 /usr/lib/chromium-browser/chromium-browser --type=ren
user    19318  0.6  3.3 1304324 133452 ?      Sl   18:27   0:09 /usr/lib/chromium-browser/chromium-browser --type=ren
user    22098  1.0  3.3 1298500 133216 ?      Sl   18:43   0:04 /usr/lib/chromium-browser/chromium-browser --type=ren

ma se vuoi vedere gli usi della memoria e della cpu per applicazione (raggruppati per comandi):

python3.6  sum_process_resources.py 
====   CPU%   ====
0. /opt/atom/atom | 27.8
1. /usr/lib/chromium-browser/chromium-browser | 11.2
2. python3.6 | 11.0
3. /opt/google/chrome/chrome | 1.6
4. /usr/lib/xorg/Xorg | 1.4
5. /opt/Franz/franz | 0.7
====   MEM%   ====
0. /usr/lib/chromium-browser/chromium-browser | 37.2
1. /opt/google/chrome/chrome | 11.3
2. /opt/Franz/franz | 10.6
3. /opt/atom/atom | 10.1
4. /usr/lib/xorg/Xorg | 2.0
5. com.google.android.gms.persistent | 1.4
====   RSS MB   ====
0. /usr/lib/chromium-browser/chromium-browser | 1475.07 MB
1. /opt/google/chrome/chrome | 461.35 MB
2. /opt/Franz/franz | 429.04 MB
3. /opt/atom/atom | 402.18 MB
4. /usr/lib/xorg/Xorg | 78.53 MB
5. com.google.android.gms.persistent | 58.02 MB

codice:

#sum_process_resources.py
from collections import OrderedDict
import subprocess

def run_cmd(cmd_string):
    """Runs commands and saves output to variable"""
    cmd_list = cmd_string.split(" ")
    popen_obj = subprocess.Popen(cmd_list, stdout=subprocess.PIPE)
    output = popen_obj.stdout.read()
    output = output.decode("utf8")
    return output

def sum_process_resources():
    """Sums top X cpu and memory usages grouped by processes"""
    ps_memory, ps_cpu, ps_rss = {}, {}, {}
    top = 6
    output = run_cmd('ps aux').split("\n")
    for i, line in enumerate(output):
        cleaned_list = " ".join(line.split())
        line_list = cleaned_list.split(" ")
        if i > 0 and len(line_list) > 10:
            cpu = float(line_list[2])
            memory = float(line_list[3])
            rss = float(line_list[5])
            command = line_list[10]
            ps_cpu[command] = round(ps_cpu.get(command, 0) + cpu, 2)
            ps_memory[command] = round(ps_memory.get(command, 0) + memory, 2)
            ps_rss[command] = round(ps_rss.get(command, 0) + rss, 2)
    sorted_cpu = OrderedDict(sorted(ps_cpu.items(), key=lambda x: x[1], reverse=True))
    sorted_memory = OrderedDict(sorted(ps_memory.items(), key=lambda x: x[1], reverse=True))
    sorted_rss = OrderedDict(sorted(ps_rss.items(), key=lambda x: x[1], reverse=True))
    print("====   CPU%   ====")
    for i, k in enumerate(sorted_cpu.items()):
        if i < top:
            print("{}. {} | {}".format(i, k[0], k[1]))
    print("====   MEM%   ====")
    for i, k in enumerate(sorted_memory.items()):
        if i < top:
            print("{}. {} | {}".format(i, k[0], k[1]))
    print("====   RSS MB   ====")
    for i, k in enumerate(sorted_rss.items()):
        if i < top:
            print("{}. {} | {} MB".format(i, k[0], round((k[1]/1024), 2)))


if __name__ == '__main__':
    sum_process_resources()

1

In alternativa agli argomenti in stile BSD mostrati nelle altre risposte, si può usare (almeno usando procps, fornito da Debian e Ubuntu):

ps -eF --sort=-rss

1

il modo semplice è installare htop

in quanto è possibile ordinare il processo in base a PID, CPU percentuale, MEM

più sofisticato


0
  1. Esegui topcomando
  2. Shift + F per ordinare in base al campo (vedere il menu completo di seguito)
  3. Selezionare nper ordinare in base all'utilizzo della memoria

n:% MEM = utilizzo memoria (RES)


0

Come sommare la memoria utilizzata per nome processo:

A volte, anche guardando ai singoli processi più grandi, c'è ancora molta memoria usata non considerata. Per verificare se ci sono molti stessi processi più piccoli che usano la memoria puoi usare un comando come il seguente che usa awk per riassumere la memoria totale usata dai processi con lo stesso nome:

ps -e -orss=,args= |awk '{print $1 " " $2 }'| awk '{tot[$2]+=$1;count[$2]++} END {for (i in tot) {print tot[i],i,count[i]}}' | sort -n

ad es. uscita

9344 docker 1
9948 nginx: 4
22500 /usr/sbin/NetworkManager 1
24704 sleep 69
26436 /usr/sbin/sshd 15
34828 -bash 19
39268 sshd: 10
58384 /bin/su 28
59876 /bin/ksh 29
73408 /usr/bin/python 2
78176 /usr/bin/dockerd 1
134396 /bin/sh 84
5407132 bin/naughty_small_proc 1432
28061916 /usr/local/jdk/bin/java 7
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.