Linux: ¿qué proceso está usando toda la RAM?

127

Antes de preguntar, para ser claros: sí, sé sobre caché de disco, y no, no es mi caso :) Lo siento, por este preámbulo :)

Estoy usando CentOS 5. Cada aplicación en el sistema está intercambiando mucho, y el sistema es muy lento. Cuando lo hago free -m, esto es lo que obtuve:

             total       used       free     shared    buffers     cached
Mem:          3952       3929         22          0          1         18
-/+ buffers/cache:       3909         42
Swap:        16383         46      16337

¡Entonces, en realidad solo tengo 42 Mb para usar! Por lo que entiendo, en -/+ buffers/cacherealidad no cuenta el caché del disco, por lo que solo tengo 42 Mb, ¿verdad? Pensé que podría estar equivocado, así que intenté desactivar el almacenamiento en caché del disco y no tuvo ningún efecto: la imagen seguía siendo la misma.

Entonces, decidí averiguar quién está usando toda mi RAM, y lo usé toppara eso. Pero, aparentemente, informa que ningún proceso está usando mi RAM. El único proceso en mi cima es MySQL, pero está usando 0.1% de RAM y 400Mb de intercambio. La misma imagen cuando intento ejecutar otros servicios o aplicaciones: todos se intercambian, topmuestra que MEM no se usa (0.1% máximo para cualquier proceso).

top - 15:09:00 up  2:09,  2 users,  load average: 0.02, 0.16, 0.11
Tasks: 112 total,   1 running, 111 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4046868k total,  4001368k used,    45500k free,      748k buffers
Swap: 16777208k total,    68840k used, 16708368k free,    16632k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP COMMAND
 3214 ntp       15   0 23412 5044 3916 S  0.0  0.1   0:00.00  17m ntpd
 2319 root       5 -10 12648 4460 3184 S  0.0  0.1   0:00.00 8188 iscsid
 2168 root      RT   0 22120 3692 2848 S  0.0  0.1   0:00.00  17m multipathd
 5113 mysql     18   0  474m 2356  856 S  0.0  0.1   0:00.11 472m mysqld
 4106 root      34  19  251m 1944 1360 S  0.0  0.0   0:00.11 249m yum-updatesd
 4109 root      15   0 90152 1904 1772 S  0.0  0.0   0:00.18  86m sshd
 5175 root      15   0 90156 1896 1772 S  0.0  0.0   0:00.02  86m sshd

Reiniciar no ayuda y, por cierto, es muy lento, lo que normalmente no esperaría en esta máquina (4 núcleos, 4 Gb de RAM, RAID1).

Entonces, con eso, estoy bastante seguro de que este no es un caché de disco, que está usando la RAM, porque normalmente debería haberse reducido y permitir que otros procesos usen RAM, en lugar de ir a intercambiar.

Entonces, finalmente, la pregunta es: ¿si alguien tiene alguna idea de cómo averiguar qué proceso realmente está usando la memoria tanto?

Timur
fuente
1
¿Alguna vez encontraste la respuesta a esto?
Hackeron el
@Hackeron: OP aceptó esta respuesta . Sin embargo, sé que la respuesta no responde a tu pregunta . Pude reproducir su problema en uno de mis servidores, y actualmente estoy investigando si hay alguna forma de solucionarlo.
Deltik
@Deltik Ah, está bien. Gracias :) - Tengo 2 servidores aquí que pierden toda la memoria disponible en el espacio de alrededor de 12 horas, avíseme si hay algo que pueda hacer para ayudar a diagnosticar esto. Soy accesible como el apodo "hackeron" en IRC (irc.freenode.org).
Hackeron
@Hackeron: No pude encontrarte como "hackeron" irc.freenode.org. Creé una sala de chat para una discusión extendida aquí .
Deltik
Vale la pena señalar que la caché ARC en memoria ZFS (y / o L2ARC) no se muestra free -m, pero su tamaño puede consultarse en Linux con cat /proc/spl/kstat/zfs/arcstats | grep data_size.
kqr

Respuestas:

112

En Linux en el topproceso, puede presionar la <tecla para cambiar el orden de visualización de salida a la izquierda. Por defecto, está ordenado por %CPUlo que si presiona la tecla 4 veces, lo ordenará según VIRTel tamaño de la memoria virtual y le dará su respuesta.

Otra forma de hacer esto es:

ps -e -o pid,vsz,comm= | sort -n -k 2

debería darle una salida ordenada por procesos y tamaño virtual.

Aquí está la versión larga:

ps --everyone --format=pid,vsz,comm= | sort --numeric-sort --key=2
Karlson
fuente
Eso me da Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.htmlen el servidor Ubuntu 11.10.
Der Hochstapler
1
@OliverSalzburg El problema son las -oopciones. RHEL4 esto funciona. RHEL5: ps -e -o pid,vsz,comm= | sort -n -k 2funciona. Intentaré 11.10 más tarde esta noche, pero si encuentras las opciones de clasificación correctas antes, házmelo saber. ps -e -o pid,vsz,comm | sort -n -k 2podría funcionar, pero no tengo un lugar para verificar en este momento.
Karlson
2
No estoy realmente familiarizado con la -efopción. Pero esto parece producir resultados razonables:sudo ps axo pid,vsz,comm=|sort -n -k 2
Der Hochstapler
1
Ty, me gusta la sugerencia principal de <que no sabía que era posible, fedora
SSH Este
2
Versión ligeramente modificada para obtener los procesos que ocupan RAM y muestra el comando completo:ps -e --format=pid,rss,args | sort --numeric-sort --key=2
sengs
71

Muestra la memoria de procesos en megabytes y la ruta del proceso.

ps aux  | awk '{print $6/1024 " MB\t\t" $11}'  | sort -n
no nulo
fuente
8
Bienvenido a Super User. ¿Puede ampliar su respuesta para explicar qué hace este código y cómo aborda el problema? Se desaconseja el código inexplicable porque no enseña la solución. Gracias.
Fixer1234
99
Me sorprende que esta respuesta haya sido rechazada y tenga un comentario que solicite explicarla ... es lo suficientemente corta como para que quede claro lo que hace (canaliza ps aux en awk y luego ordena), y en el contexto de la pregunta, muestra qué procesos están utilizando la mayor cantidad de RAM. Creo que es una buena respuesta.
John
14

Solo una nota al margen en un servidor que muestra los mismos síntomas pero aún muestra agotamiento de la memoria. Lo que terminó por encontrar fue un sysctl.conf de una caja con 32 GB de RAM y la configuración para una base de datos con grandes páginas configuradas en 12000. Esta caja solo tiene 2 GB de RAM, por lo que estaba asignando toda la RAM libre a las grandes páginas (solo 960 de ellos). Establecer páginas enormes en 10, ya que ninguna se usó de todos modos, liberó toda la memoria.

Una comprobación rápida de / proc / meminfo para buscar la configuración de HugePages_ puede ser un buen comienzo para solucionar al menos un problema inesperado de memoria.

Jinete de la muerte
fuente
2
Recientemente tuve otro servidor donde este era el problema. Si su organización tiene empleados de Oracle anteriores, esta configuración puede ser su culpable.
campos
5

En mi caso, el problema era que el servidor era un servidor virtual VMware con el vmw_balloonmódulo habilitado:

$ lsmod | grep vmw_balloon
vmw_balloon            20480  0
vmw_vmci               65536  2 vmw_vsock_vmci_transport,vmw_balloon

Corriendo:

$ vmware-toolbox-cmd stat balloon
5189 MB

Entonces, de hecho, el host recuperó alrededor de 5 GB de memoria. Entonces, a pesar de tener 8 GB para mi VM "oficialmente", en la práctica era mucho menos:

$ free
              total        used        free      shared  buff/cache   available
Mem:        8174716     5609592       53200       27480     2511924     2458432
Swap:       8386556        6740     8379816
Mitar
fuente
2

También puede usar el comando ps para obtener más información sobre el proceso.

ps aux | less
Atul
fuente
Por curiosidad, ¿cuál es la forma correcta de escapar de este comando? Muestra FIN cuando llego a la última línea, no elimina el proceso cuando lo presiono Ctrl + C.
KingsInnerSoul
1
@KingsInnerSoul presione 'q'
enobayram
2

¿Hago referencia a esto y a la memoria total utilizada por el proceso de Python? - Stack Overflow , esa es mi respuesta. Ahora obtengo una herramienta de recuento de proceso específico (python).

# Megabyte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum/1024 " MB"}'
87.9492 MB

# Byte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum " KB"}'
90064 KB

Adjunte mi lista de procesos.

$ ps aux  | grep python
root       943  0.0  0.1  53252  9524 ?        Ss   Aug19  52:01 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root       950  0.6  0.4 299680 34220 ?        Sl   Aug19 568:52 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root      3803  0.2  0.4 315692 36576 ?        S    12:43   0:54 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
jonny    23325  0.0  0.1  47460  9076 pts/0    S+   17:40   0:00 python
jonny    24651  0.0  0.0  13076   924 pts/4    S+   18:06   0:00 grep python

Referencia

Chu-Saing Lai
fuente
1

Haz un script llamado show-memory-usage.shcon contenido:

#!/bin/sh
ps -eo rss,pid,user,command | sort -rn | head -10 | awk '{ hr[1024**2]="GB"; hr[1024]="MB";
 for (x=1024**3; x>=1024; x/=1024) {
 if ($1>=x) { printf ("%-6.2f %s ", $1/x, hr[x]); break }
 } } { printf ("%-6s %-10s ", $2, $3) }
 { for ( x=4 ; x<=NF ; x++ ) { printf ("%s ",$x) } print ("\n") }
 '
Felipe
fuente
66
¿Por qué? ¿Qué hace esto? ¿Como funciona? No le digas a la gente que ejecute código aleatorio; explicar su propósito y cómo funciona.
un CVn
2
Figura Explicaré el código para aquellos que no entienden, ya que parece seguro ejecutarlo, pero el voto negativo puede evitar aquellos para los que sería útil. Está ejecutando el mismo comando que en las respuestas anteriores , pero agrega formato con AWK. No he ejecutado personalmente el script ya que no lo uso, pero explicarlo ayuda a aquellos que necesitan algún formato.
Dooley_labs
1
He leído el código y lo ejecuto. Alinea los campos como una tabla y formatea la memoria residente consumida con prefijos (como 1.12 GB, 582.79 MB).
Stéphane Gourichon
0

Esto también toma la identificación del proceso, ordena por MB utilizado y describe el comando (que creó el proceso):

ps aux | awk '{print $6/1024 " MB\t\t" $2 "\t" $11}' | sort -n

prosti
fuente
0

Mi servidor ubuntu DISTRIB RELEASE = 18.04 en Hyper-V tenía la mayor parte de la memoria utilizada, pero todos los procesos estaban bien. (Admití que eliminé los paquetes snapd y desatendido-upgr, pero todavía se usó el 95% de la memoria).

La respuesta es que Hyper-V tiene memoria dinámica, por lo que tomó memoria para el uso del sistema principal y ubuntu lo marcó como usado.

Espero que ayude a alguien.

Vodyanikov Andrew Anatolevich
fuente