Ordenar procesos por uso de memoria

128

Puedo ver la lista de todos los procesos y la memoria a través de

ps aux 

y pasando por VSZ y RSS

¿Hay alguna manera de ordenar la salida de este comando por orden descendente en el valor RSS?

usuario2817836
fuente
¿Cuál sería el resultado esperado? checkps
Rahul Patil
Ejemplos adicionales de cómo usarlos --sortestán aquí: alvinalexander.com/linux/…
slm
1
Pregunta de superconjunto, usando cualquier herramienta: stackoverflow.com/questions/4802481/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

224

Use el siguiente comando:

ps aux --sort -rss

Consulte aquí para obtener más uso de la memoria de proceso de Linux

taza de cafe
fuente
12
nota: si desea ver los mejores resultados, es útil canalizarlo headcomops aux --sort -rss | head -n15
Yehosef
3
Me sale un error ps: illegal option -- -
Miguel Mota
@MiguelMota ¿Qué pasa si así ps aux --sort=rss:?
coffeMug
2
@coffeMug no funcionó, pero esto síps aux | sort -rn -k 6
Miguel Mota
1
@coffeMug no estoy seguro de cómo encontrar la versión, pero estoy en Mac OSX, así que tal vez por eso
Miguel Mota
25

Un método rápido y sucio es simplemente canalizar la salida de ps auxla sortorden:

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

Ejemplo

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

Esto no se maneja para los encabezados de columna que se mezclan con la salida, pero es fácil de recordar en la línea de comando, y es una forma aceptable de hacer lo que desea al ver manualmente este tipo de salida.

Ejemplo

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]

Mas consejos

Un consejo adicional sería canalizar toda la salida a otro comando como less. Esto le permite ver la información página por página y también usar las teclas de flecha y las teclas de página arriba / abajo para desplazarse hacia adelante y hacia atrás a través de la salida.

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

Si su salida se ajusta mucho, también puede utilizar el -Sinterruptor a menos, lo que obligará a toda la salida a permanecer en una sola línea. Luego puede usar las teclas de flecha para moverse hacia la izquierda / derecha / arriba / abajo para verlo todo.

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

Ordenar dentro de ps

Ciertas versiones de psproporcionan la capacidad de uso --sort. Este interruptor puede tomar teclas que tienen el prefijo a +o a -para indicar el orden de clasificación ... de menor a mayor o de mayor a menor.

Ejemplos

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
slm
fuente
ps siempre generará las columnas de la forma en que espera sortverlas / procesarlas?
Felipe Alvarez
Depende de qué versión de ps
slm
2
A ... | lesses un buen consejo, pero a veces su proceso tiene una línea de comando enorme y satura la salida. En tales casos ... | less -Sfunciona mejor.
desperdicio el
@waste: buen consejo, solo recuerda que se -Strunca y, por lo tanto, puedes perder algo de lo que quieres ver, pero de lo contrario, es un buen consejo si solo te interesan las columnas de la izquierda.
slm
@slm No estoy seguro de que sea así less -S. Cuando cierra la lessvista, todo desaparece, pero mientras esté en la vista, puede desplazarse verticalmente pero también horizontalmente. Sin embargo, copiar puede ser difícil.
desperdicio
6

Incluso si ps no refleja la memoria real utilizada, este comando es bastante útil.

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 "" }'
Pierozi
fuente
4

ps aux --sort -rss es bueno:

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

pero si desea ver los usos de memoria y CPU por aplicación (agrupados por comandos):

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

código:

#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()
jturi
fuente
1

Como alternativa a los argumentos de estilo BSD que se muestran en las otras respuestas, uno puede usar (al menos usando procps, enviados por Debian y Ubuntu):

ps -eF --sort=-rss
usuario30747
fuente
1

manera simple es instalar htop

en que puede ordenar el proceso basado en PID, porcentaje de CPU, MEM

más sofisticado

Ayyanar
fuente
0
  1. Ejecutar topcomando
  2. Shift + F ordenar según el campo (ver el menú completo a continuación)
  3. Seleccione npara ordenar según el uso de memoria

n:% MEM = Uso de memoria (RES)

Sabrina
fuente
0

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

A veces, incluso observando los procesos individuales más grandes, todavía hay mucha 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
gaoithe
fuente