Comment voir les principaux processus triés par utilisation réelle de la mémoire?


240

J'ai un serveur avec 12G de mémoire. Un fragment de haut est montré ci-dessous:

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                                                                                                                                      
12979 frank  20   0  206m  21m  12m S   11  0.2  26667:24 krfb                                                                                                                                                                                                                                                          
13 root      15  -5     0    0    0 S    1  0.0  36:25.04 ksoftirqd/3                                                                                                                                                                                                                                                   
59 root      15  -5     0    0    0 S    0  0.0   4:53.00 ata/2                                                                                                                                                                                                                                                         
2155 root      20   0  662m  37m 8364 S    0  0.3 338:10.25 Xorg                                                                                                                                                                                                                                                          
4560 frank  20   0  8672 1300  852 R    0  0.0   0:00.03 top                                                                                                                                                                                                                                                           
12981 frank  20   0  987m  27m  15m S    0  0.2  45:10.82 amarok                                                                                                                                                                                                                                                        
24908 frank  20   0 16648  708  548 S    0  0.0   2:08.84 wrapper                                                                                                                                                                                                                                                       
1 root      20   0  8072  608  572 S    0  0.0   0:47.36 init                                                                                                                                                                                                                                                          
2 root      15  -5     0    0    0 S    0  0.0   0:00.00 kthreadd

Le free -mmontre ce qui suit:

             total       used       free     shared    buffers     cached
Mem:         12038      11676        362          0        599       9745
-/+ buffers/cache:       1331      10706
Swap:         2204        257       1946

Si je comprends bien, le système ne dispose que de 362 Mo de mémoire disponible. Ma question est: comment savoir quel processus consomme le plus de mémoire?

Tout comme les informations d'arrière-plan, le système fonctionne 64bit OpenSuse 12.


Réponses:


280

Tout d'abord, répétez ce mantra pendant un petit moment: "la mémoire inutilisée est une mémoire gaspillée". Le noyau Linux conserve d' énormes quantités de métadonnées de fichiers et de fichiers qui ont été demandés, jusqu'à ce que quelque chose qui semble plus important repousse ces données. C'est pourquoi vous pouvez exécuter:

find /home -type f -name '*.mp3'
find /home -type f -name '*.aac'

et faire findexécuter la deuxième instance à une vitesse ridicule.

Linux ne laisse qu'un peu de mémoire «libre» pour gérer les pics d'utilisation de la mémoire sans trop d'effort.

Deuxièmement, vous voulez trouver les processus qui mangent toute votre mémoire; in topuse the Mcommand to sort by memory memory. N'hésitez pas à ignorer la VIRTcolonne, qui vous indique simplement combien de mémoire virtuelle a été allouée, pas la quantité de mémoire utilisée par le processus. RESsignale la quantité de mémoire résidente ou actuellement dans la mémoire RAM (par opposition au swap sur disque ou jamais réellement alloué en premier lieu, malgré la demande).

Mais, puisque REScomptera par exemple la /lib/libc.so.6mémoire une fois pour presque tous les processus, ce n'est pas exactement une mesure impressionnante de la quantité de mémoire qu'un processus utilise. La SHRcolonne indique la quantité de mémoire partagée avec d'autres processus, mais rien ne garantit qu'un autre processus partage réellement - il pourrait être partageable, mais personne d'autre ne veut le partager.

L' smemoutil est conçu pour aider les utilisateurs à mieux évaluer la quantité de mémoire qui doit vraiment être attribuée à chaque processus individuel. Il fait un travail intelligent pour comprendre ce qui est vraiment unique, ce qui est partagé et correspond proportionnellement à la mémoire partagée aux processus qui la partagent. smempeut vous aider à mieux comprendre où va votre mémoire top, mais topc'est un excellent premier outil.


Donc, si seules les statistiques de colonne "libres" chutent, le haut ne montre rien d'autre, nous pouvons conclure que la mémoire est allouée par le noyau linux pour stocker les fichiers et donnera la mémoire à d'autres processus lorsque cela sera nécessaire?
Al2O3

@Rubby, c'est probablement vrai; les fichiers /proc/meminfoet /proc/slabinfodétaillent à quoi le noyau utilise le stockage - le slabtopprogramme est très similaire top, mais montre à quels allocateurs de dalles ont alloué combien, à quoi ressemblent leurs ratios, etc.
sarnold

Merci pour l'astuce sur 'smem' - je veux que Linux "gaspille" un peu de RAM pour que ma machine puisse fonctionner rapidement. Si «trouver» prend un peu plus de temps lors d'un 2e passage, c'est ok. Une souris bloquée et des fenêtres gelées pendant que Linux décide quelle RAM (qu'il a inutilement absorbée), doit être effacée et réallouée à ce que je fais MAINTENANT - ou même échange sur le disque - n'est pas une option. J'ai 16 Go de RAM sur cette boîte, et je m'attends à ce que plusieurs Go restent libres et disponibles pour les applications en cours d'exécution.
JosephK

@JosephK, déplacer une souris a plus à voir avec les priorités de programmation et les algorithmes; si des allocations de mémoire sont nécessaires pour déplacer un pointeur de souris, alors quelque chose ne va vraiment pas avec le logiciel que vous utilisez. :)
sarnold

2
@JosephK Il faut en fait moins de temps au noyau pour réutiliser la mémoire d'une utilisation à une autre que pour utiliser la mémoire libre. L'un nécessite l'accès et la modification de la liste gratuite, l'autre non. Malheureusement, c'est une question XY. Le problème a à voir avec les performances et peut être totalement indépendant de la consommation de mémoire (malgré la preuve que rendre plus de mémoire libre l'aide, cela peut être pour des raisons plus complexes que les suspects OP), mais à la place, ils ont posé des questions sur l'analyse de l'utilisation de la mémoire. Cela obtient des réponses moins utiles que de poser des questions sur le problème réel.
David Schwartz

321

utiliser un conseil rapide en utilisant la commande top sous linux / unix

$ top

puis appuyez sur Shift+ m(c'est-à-dire écrire un capital M).

De man top

SORTING of task window
  For compatibility, this top supports most of the former top sort keys.
  Since this is primarily a service to former top users, these commands do
  not appear on any help screen.
    command   sorted-field                  supported
      A         start time (non-display)      No
      M         %MEM                          Yes
      N         PID                           Yes
      P         %CPU                          Yes
      T         TIME+                         Yes

Ou bien: appuyez sur Shift+ f, puis choisissez l'affichage à commander en fonction de l'utilisation de la mémoire en appuyant sur la touche npuis appuyez sur Enter. Vous verrez le processus actif trié par utilisation de la mémoire


71
Ou vous pouvez simplement appuyer sur M( Shift+ m)
Patryk

8
@risnandar existe-t-il un moyen d'afficher la mémoire en Mo et non%
codecowboy

2
salut codecowboy, vous pouvez peut-être consulter commandlinefu.com/commands/view/3/… pour une mémoire plus détaillée utilisée sur mon serveur j'utilise une
risnandar

6
ou tout simplement top -o mem -O cpu
skipy

Sur Ubuntu 16, j'avais besoin top -o RESautrement de "nom de champ non reconnu 'mem'"
AdamS


28

Vous devez d'abord lire une explication sur la sortie defree . Conclusion: vous disposez d'au moins 10,7 Go de mémoire facilement utilisable par les processus.

Ensuite, vous devez définir ce qu'est "l'utilisation de la mémoire" pour un processus (ce n'est pas facile ou sans ambiguïté, croyez-moi).

Ensuite, nous pourrons peut-être vous aider davantage :-)


D'où avez-vous obtenu 10,7? De tampons / cache [gratuit]? Merci pour le lien, je vais le lire.
user3111525

3
Oui. Le fait est que la majeure partie de la mémoire est utilisée par les tampons et le cache. Cette mémoire peut être "vidée" immédiatement si un processus a besoin de plus de mémoire. Lorsque vous soustrayez la quantité de mémoire utilisée pour les tampons / cache de la quantité UTILISÉE, ou ajoutez-la à la quantité GRATUITE, vous obtenez les chiffres sur la deuxième ligne, ce qui implique alors que seulement 1,3 gig est réellement utilisé, ou, vu de l'autre angle, vous avez 10,7 gig de mémoire facilement disponible (puisque les tampons et le cache peuvent être insta-dumpés à la demande).
stolsvik

21

Lister et trier les processus par utilisation de la mémoire:

ps -e -orss=,args= | sort -b -k1,1n | pr -TW$COLUMNS

7
Ou:ps -e -orss=,args= | sort -nr | head
kenorb

17

ps aux --sort '%mem'

à partir du ps de procps (par défaut sur Ubuntu 12.04) génère une sortie comme:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
...
tomcat7   3658  0.1  3.3 1782792 124692 ?      Sl   10:12   0:25 /usr/lib/jvm/java-7-oracle/bin/java -Djava.util.logging.config.file=/var/lib/tomcat7/conf/logging.properties -D
root      1284  1.5  3.7 452692 142796 tty7    Ssl+ 10:11   3:19 /usr/bin/X -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
ciro      2286  0.3  3.8 1316000 143312 ?      Sl   10:11   0:49 compiz
ciro      5150  0.0  4.4 660620 168488 pts/0   Sl+  11:01   0:08 unicorn_rails worker[1] -p 3000 -E development -c config/unicorn.rb             
ciro      5147  0.0  4.5 660556 170920 pts/0   Sl+  11:01   0:08 unicorn_rails worker[0] -p 3000 -E development -c config/unicorn.rb             
ciro      5142  0.1  6.3 2581944 239408 pts/0  Sl+  11:01   0:17 sidekiq 2.17.8 gitlab [0 of 25 busy]                                                                          
ciro      2386  3.6 16.0 1752740 605372 ?      Sl   10:11   7:38 /usr/lib/firefox/firefox

Donc, ici, Firefox est le premier consommateur avec 16% de ma mémoire.

Vous pourriez également être intéressé par:

ps aux --sort '%cpu'

4

vous pouvez spécifier la colonne sur laquelle trier, en procédant comme suit:

pas:
* Haut
* shift + F
* sélectionnez une colonne dans la liste
    par exemple, n signifie trier par mémoire,
* appuyez sur Entrée
* D'accord

1
Duplicata de la réponse de risnandar ci-dessus.
benjaoming

3

Vous pouvez voir l'utilisation de la mémoire en exécutant ce code dans votre terminal:

$ watch -n2 free -m
$ htop

3

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

Parfois, même en regardant les plus gros processus, il reste encore beaucoup de mémoire utilisée. Pour vérifier s'il y a beaucoup des mêmes processus plus petits utilisant la mémoire, vous pouvez utiliser une commande comme la suivante 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

0

Cette deuxième fois

ps -U $(whoami) -eom pid,pmem,pcpu,comm | head -n4

Mise à jour en continu

watch -n 1 'ps -U $(whoami) -eom pid,pmem,pcpu,comm | head -n4'

J'ai également ajouté quelques goodies ici que vous pourriez apprécier (ou que vous pourriez ignorer)

-n 1 regarder et mettre à jour chaque seconde

-U $(whoami)Pour afficher uniquement vos processus. $ (une commande) évalue maintenant

| head -n4 Pour afficher uniquement l'en-tête et 3 processus à la fois, il suffit souvent de disposer d'éléments de campagne à forte utilisation

${1-4}dit mon premier argument, $1je veux passer à 4 par défaut, sauf si je le fournis

Si vous utilisez un Mac, vous devrez peut-être installer Watch First Brew Installer Watch

Vous pouvez également utiliser une fonction

psm(){
    watch -n 1 "ps -eom pid,pmem,pcpu,comm | head -n ${1-4}"
    # EXAMPLES: 
    # psm 
    # psm 10
}

Et vous pouvez facilement trier par processeur si vous changez -men-r
jasonleonhard

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.