¿Cómo ver los principales procesos ordenados por el uso real de la memoria?


240

Tengo un servidor con 12G de memoria. A continuación se muestra un fragmento de la parte superior:

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

El free -mmuestra lo siguiente:

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

Si entiendo correctamente, el sistema tiene solo 362 MB de memoria disponible. Mi pregunta es: ¿cómo puedo saber qué proceso consume la mayor parte de la memoria?

Al igual que la información de fondo, el sistema se está ejecutando 64bit OpenSuse 12.


Respuestas:


280

Primero, repita este mantra por un momento: "memoria no utilizada es memoria desperdiciada". El kernel de Linux mantiene grandes cantidades de metadatos de archivos y archivos que se solicitaron, hasta que algo que parece más importante elimina esos datos. Es por eso que puedes correr:

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

y que la segunda findinstancia se ejecute a una velocidad ridícula.

Linux solo deja un poco de memoria 'libre' para manejar los picos en el uso de la memoria sin demasiado esfuerzo.

Segundo, quieres encontrar los procesos que están consumiendo toda tu memoria; en topuso el Mcomando para ordenar por uso de memoria. Siéntase libre de ignorar la VIRTcolumna, que solo le indica cuánta memoria virtual se ha asignado, no cuánta memoria está usando el proceso. RESinforma la cantidad de memoria residente , o actualmente en ram (en lugar de intercambiada a disco o nunca asignada realmente en primer lugar, a pesar de ser solicitada).

Pero, dado RESque contará, por ejemplo, la /lib/libc.so.6memoria una vez para casi todos los procesos, no es exactamente una medida asombrosa de cuánta memoria está usando un proceso. La SHRcolumna informa cuánta memoria se comparte con otros procesos, pero no hay garantía de que otro proceso esté realmente compartiendo; podría ser compartible, simplemente nadie más quiere compartir.

La smemherramienta está diseñada para ayudar a los usuarios a medir mejor cuánta memoria debería realmente atribuirse a cada proceso individual. Hace un trabajo inteligente para descubrir lo que es realmente único, lo que se comparte, y da proporcionalmente la memoria compartida a los procesos que la comparten. smempuede ayudarlo a comprender hacia dónde va su memoria mejor de toplo que lo hará, pero topes una excelente primera herramienta.


Entonces, si solo la estadística de columna "libre" cae, la parte superior no muestra nada más diferente, podemos concluir que la memoria es asignada por el kernel de Linux para almacenar cosas de archivos y dará la memoria a otros procesos cuando sea necesario.
Al2O3

@Rubby, eso es probablemente cierto; el /proc/meminfoy /proc/slabinfoarchivos detalle lo que el kernel está utilizando el almacenamiento para - el slabtopprograma es muy parecido top, pero muestra cuál de los asignadores de losa han asignado la cantidad, lo que sus proporciones son similares, etc.
sarnold

Gracias por el consejo sobre 'smem': quiero que Linux "desperdicie" algo de RAM para que mi máquina pueda funcionar rápidamente. Si 'encontrar' tarda un poco más en un segundo pase, está bien. Un mouse atascado y ventanas congeladas mientras Linux decide qué RAM (que ha acumulado innecesariamente), necesita ser borrada y reasignada a lo que estoy haciendo AHORA, o incluso intercambiar a disco, no es una opción. Tengo 16 GB de RAM en esta caja, y espero que varios GB se mantengan libres y disponibles para ejecutar aplicaciones.
JosephK

@JosephK, mover un mouse tiene más que ver con la programación de prioridades y algoritmos; Si las asignaciones de memoria son necesarias para mover el puntero del mouse, entonces algo está muy mal con el software que está utilizando. :)
sarnold

2
@JosephK Realmente le toma al kernel menos tiempo reutilizar la memoria de un uso a otro que poner memoria libre en uso. Uno requiere acceder y modificar la lista gratuita, el otro no. Desafortunadamente, esta es una pregunta XY. El problema tiene que ver con el rendimiento y puede no estar relacionado con el consumo de memoria (a pesar de la evidencia de que hacer más memoria libre lo ayuda, eso puede ser por razones más complejas de lo que sospechan los OP), sino que preguntaron sobre el análisis del uso de la memoria. Eso obtiene respuestas menos útiles que preguntar sobre el problema real.
David Schwartz el

321

use un consejo rápido usando el comando top en linux / unix

$ top

y luego presione Shift+ m(es decir, escriba una mayúscula 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

O alternativamente: presione Shift+ f, luego elija la pantalla para ordenar por uso de memoria npresionando la tecla y luego presione Enter. Verá el proceso activo ordenado por uso de memoria


71
O simplemente puede presionar M( Shift+ m)
Patryk

8
@risnandar hay una manera de mostrar memoria en MB y no%
codecowboy

2
hola codecowboy, tal vez puedan mirar commandlinefu.com/commands/view/3/… para obtener una memoria más detallada utilizada en mi servidor. Estoy usando una aplicación de terceros como newrelic.com
risnandar

66
o simplemente top -o mem -O cpu
skipy

En Ubuntu 16 necesitaba de top -o RESotra manera "nombre de campo no reconocido 'mem'"
AdamS


28

Primero debe leer una explicación sobre la salida defree . En pocas palabras: tiene al menos 10.7 GB de memoria fácilmente utilizable por los procesos.

Luego debe definir qué es el "uso de memoria" para un proceso (no es fácil ni inequívoco, créanme).

Entonces podríamos ayudar más :-)


¿De dónde sacaste 10.7? ¿De buffers / cache [gratis]? Gracias por el enlace, lo leeré.
user3111525

3
Si. El punto es que la mayor parte de la memoria es utilizada por buffers y cache. Esta memoria se puede "volcar" de inmediato si algún proceso necesita más memoria. Cuando se resta la cantidad de memoria utilizada para buffers / cache de la cantidad utilizada, o añadirlo a la cantidad GRATIS, se obtiene los números en la segunda línea, que a su vez imples que es de sólo 1,3 concierto realmente utilizadas o, visto desde el otro ángulo, tiene 10.7 gig de memoria fácilmente disponible (ya que las memorias intermedias y el caché se pueden volcar instantáneamente a pedido).
stolsvik

21

Enumerar y ordenar procesos por uso de memoria:

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

77
O:ps -e -orss=,args= | sort -nr | head
kenorb

17

ps aux --sort '%mem'

desde procps 'ps (predeterminado en Ubuntu 12.04) genera resultados como:

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

Así que aquí Firefox es el principal consumidor con el 16% de mi memoria.

Usted también podría estar interesado en:

ps aux --sort '%cpu'

4

puede especificar por qué columna ordenar, con los siguientes pasos:

pasos:
* parte superior
* shift + F
* seleccione una columna de la lista
    por ejemplo, n significa ordenar por memoria,
* presione enter
* Okay

1
Duplicado de la respuesta de risnandar anterior.
benjaoming

3

Puede ver el uso de la memoria ejecutando este código en su terminal:

$ watch -n2 free -m
$ htop

3

Cómo totalizar la memoria usada por nombre de proceso:

A veces, incluso mirando los procesos individuales más grandes, todavía hay una gran cantidad de memoria usada que no se tiene en cuenta. Para verificar si hay muchos de los mismos procesos más pequeños que usan la memoria, puede usar un comando como el siguiente que usa awk para resumir la memoria total utilizada por los procesos del mismo nombre:

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

por ejemplo, salida

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

Esta muy segunda en el tiempo

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

Actualización continua

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

También agregué algunas golosinas aquí que podría apreciar (o podría ignorar)

-n 1 mira y actualiza cada segundo

-U $(whoami)Para mostrar solo sus procesos. $ (algún comando) evalúa ahora

| head -n4 Para mostrar solo el encabezado y los 3 procesos a la vez a menudo, solo necesita líneas de pedido de alto uso

${1-4}dice mi primer argumento $1Quiero que el valor predeterminado sea 4, a menos que lo proporcione

Si está utilizando una Mac, es posible que deba instalar watch first brew install watch

Alternativamente, puede usar una función

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

Y puede ordenar fácilmente por CPU si cambia -ma-r
jasonleonhard

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.