Tri des processus par utilisation de la mémoire


128

Je suis capable de voir la liste de tous les processus et la mémoire via

ps aux 

et en passant par le VSZ et RSS

Existe-t-il un moyen de trier la sortie de cette commande par ordre décroissant de valeur RSS?


Quelle serait la sortie attendue? checkps
Rahul Patil le

D'autres exemples d'utilisation --sortsont disponibles ici: alvinalexander.com/linux/…
slm

1
Question superposée, en utilisant n’importe quel outil: stackoverflow.com/questions/4802481/…
Ciro Santilli a commencé

Réponses:


224

Utilisez la commande suivante:

ps aux --sort -rss

Vérifiez ici pour plus d' utilisation de la mémoire de processus Linux


12
note - si vous voulez voir les meilleurs résultats , il est utile de tuyau dans headcommeps aux --sort -rss | head -n15
Yehosef

3
Je reçois une erreur ps: illegal option -- -
Miguel Mota

@MiguelMota si comme ceci: ps aux --sort=rss?
coffeMug

2
@coffeMug n'a pas fonctionné mais cela a fonctionnéps aux | sort -rn -k 6
Miguel Mota

1
@coffeMug ne sait pas comment trouver la version mais je suis sur Mac OSX alors c'est peut-être pour ça
Miguel Mota

25

Une méthode rapide et sale consiste simplement à diriger le résultat de ps auxla sortcommande vers:

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

Exemple

$ 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
...

Cela ne prend pas en charge les en-têtes de colonne mélangés à la sortie, mais il est facile de s'en souvenir sur la ligne de commande et constitue un moyen acceptable de faire ce que vous voulez lorsque vous visualisez manuellement ce type de sortie.

Exemple

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]

Plus de conseils

Une astuce supplémentaire consisterait à diriger toute la sortie vers une autre commande telle que less. Cela vous permet de consulter les informations page par page et d'utiliser également les touches fléchées et les touches page précédente / suivante pour faire défiler la sortie.

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

Si votre sortie encapsule beaucoup, vous pouvez également utiliser le -Scommutateur sur less, ce qui obligera toute la sortie à rester sur une seule ligne. Vous pouvez ensuite utiliser les touches fléchées pour vous déplacer gauche / droite / haut / bas pour tout voir.

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

Tri dans ps

Certaines versions de psfournissent la possibilité d'utiliser --sort. Ce commutateur peut alors prendre les clés qui sont soit préfixées avec un +ou -pour indiquer l'ordre de tri ... plus ou moins grand au plus.

Exemples

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

affichera-t-il ps toujours les colonnes de la façon dont vous vous attendez sortà les voir / les traiter?
Felipe Alvarez

Dépend de quelle version de ps
slm

2
A ... | lessest un bon conseil, mais parfois, votre processus a une énorme ligne de commande et encombre la sortie. Dans de tels cas, ... | less -Sfonctionne mieux.
déchets

@waste - bon conseil, rappelez-vous simplement que -Stronque et que vous risquez de perdre une partie de ce que vous voulez voir, mais sinon, un bon conseil si vous n'êtes intéressé que par la plupart des colonnes de gauche.
slm

@ slm je ne suis pas sûr que ce soit le cas less -S. Lorsque vous fermez la lessvue, tout disparaît, mais tant que vous êtes dans la vue, vous pouvez faire défiler verticalement mais aussi horizontalement. La copie peut être difficile, cependant.
déchets

6

Même si ps ne reflète pas la mémoire réellement utilisée, cette commande est très 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 is nice:

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

mais si vous voulez voir les utilisations de la mémoire et du processeur par application (regroupés par commandes):

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

code:

#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

Comme alternative aux arguments de style BSD montrés dans les autres réponses, on peut utiliser (au moins en utilisant procps, fourni par Debian et Ubuntu):

ps -eF --sort=-rss

1

moyen simple est d'installer htop

en ce que vous pouvez trier le processus en fonction du PID, du pourcentage de CPU, du MEM

plus sophistiqué


0
  1. Exécuter la topcommande
  2. Shift + F pour trier par champ (voir le menu complet ci-dessous)
  3. Sélectionnez npour trier en fonction de l'utilisation de la mémoire

n:% MEM = utilisation de la mémoire (RES)


0

Comment totaliser la mémoire utilisée par nom de processus:

Parfois, même en regardant les processus les plus importants, il reste encore beaucoup de mémoire non utilisée. Pour vérifier si la mémoire utilise beaucoup des mêmes processus plus petits, vous pouvez utiliser une commande comme celle-ci, qui utilise awk pour résumer la mémoire totale utilisée par les processus du même nom:

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

par exemple sortie

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.