¿Cómo puedo mostrar el uso de memoria de cada proceso si hago un 'ps -ef'?


24

En Linux, ¿cómo puedo mostrar el uso de memoria de cada proceso si hago un ps -ef? Me gustaría ver la 'memoria virtual', 'memoria res', 'memoria compartida' de cada progreso. Puedo obtenerlo a través de top, pero quiero la misma información ps -efpara poder canalizar la salida grepcon mi nombre de proceso.

Respuestas:


8

Obtener el uso de memoria a través de ps es bastante poco confiable. Si tiene un kernel más nuevo, debería ser compatible con / proc / pid # / smaps que le brinda información detallada sobre el uso de memoria de cada proceso. A continuación se muestra una secuencia de comandos bastante sucia y rápida para recorrer cada proceso que está abierto y tomar el tamaño, Rss, Pss y uso compartido limpio / sucio. Esperemos que pueda ser útil de alguna manera.

#!/bin/bash

for pid in $(ps -ef | awk '{print $2}'); do
    if [ -f /proc/$pid/smaps ]; then
            echo "* Mem usage for PID $pid"
            echo "-- Size:"
            cat /proc/$pid/smaps | grep -m 1 -e ^Size: | awk '{print $2}'
            echo "-- Rss:"
            cat /proc/$pid/smaps | grep -m 1 -e ^Rss: | awk '{print $2}'
            echo "-- Pss:"
            cat /proc/$pid/smaps | grep -m 1 -e ^Pss: | awk '{print $2}'
            echo "Shared Clean"
            cat /proc/$pid/smaps | grep -m 1 -e '^Shared_Clean:' | awk '{print $2}'
            echo "Shared Dirty"
            cat /proc/$pid/smaps | grep -m 1 -e '^Shared Dirty:' | awk '{print $2}'
    fi
done

1
Debería sumar la columna Tamaño. Ver la respuesta de ezsmith a continuación.
— Basil A

11

ps ef -o command,vsize,rss,%mem,size

No pude encontrar una opción para la memoria compartida, pero sí encontré opciones para el% de memoria física total y la cantidad de espacio de intercambio que sería necesario para intercambiar el proceso. Esto y mucho más está documentado en la página del manual para ps.


Las cuentas de Linux comparten memoria en la memoria para cada proceso, lo que puede conducir a sumas falsas si tiene muchos procesos conectados a un segmento de memoria compartida grande. top, psy programas similares se ven afectados por esto de la misma manera.
— Peter Eisentraut

Sé cómo funciona la memoria compartida, pero parece que ps no puede proporcionar esa información (o al menos no pude encontrarla en mi documentación de ps). top u htop en realidad puede mostrar el uso de memoria compartida por proceso.
— Justin Smith el

9

La respuesta de @ user26528 no calcula la memoria correctamente: necesita la suma de las asignaciones en smaps, no solo la superior. Este script debería hacerlo:

#!/bin/bash

for pid in $(ps -ef | awk '{print $2}'); do
    if [ -f /proc/$pid/smaps ]; then
        echo "* Mem usage for PID $pid"     
        rss=$(awk 'BEGIN {i=0} /^Rss/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        pss=$(awk 'BEGIN {i=0} /^Pss/ {i = i + $2 + 0.5} END {print i}' /proc/$pid/smaps)
        sc=$(awk 'BEGIN {i=0} /^Shared_Clean/ {i = i + $2} END {print i}' /proc/$pid/smaps)            
        sd=$(awk 'BEGIN {i=0} /^Shared_Dirty/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        pc=$(awk 'BEGIN {i=0} /^Private_Clean/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        pd=$(awk 'BEGIN {i=0} /^Private_Dirty/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        echo "-- Rss: $rss kB" 
        echo "-- Pss: $pss kB"
        echo "Shared Clean $sc kB"
        echo "Shared Dirty $sd kB"
        echo "Private $(($pd + $pc)) kB"
    fi
done

Salidas: línea 16: +: error de sintaxis: operando esperado (el token de error es "+"), que es la línea que contiene: echo "Private $ (($ pd + $ pc)) kB", estoy ejecutando en CentOS 7 .
— albahaca Una

2
@evsmith ¿por qué agregar 0.5 a Pss?
— Pete

1
Ejecutar 10.000 scripts Awk pequeños es un antipatrón masivo, solo debe refactorizar todo esto en un solo script Awk.
— tripleee

pero este script en sí consume demasiada memoria
— mehmet riza oz

8

Lista de procesos por uso de memoria

ps -e -orss =, args = | ordenar -b -k1,1n


Se usa ps -e -orss=,pid=,args= | sort -b -k1,1npara incluir la identificación del proceso
— Jacob

pspuede ordenar por su cuenta:ps -eo rss=,args= --sort +rss
— phil294


3

Lista de procesos por uso de memoria

comando: ps -e -orss =, args = | ordenar -b -k1,1n | pr -TW $ COLUMNS \


3

Actualizar:

La siguiente línea también proporciona información sobre el consumo total de memoria del usuario actual.

echo "------------------------------------" && mem=0 && while read -r rss comm ; do mbs=$((rss/1024)); mem=$((mbs + mem)); echo $mbs"MB - $comm"; done <<< "$(ps -u $USER -wo rss=,comm= --sort -rss)" && echo "------------------------------------" && echo $mem"MB: Memory used by user '$USER'"

Acabo de enumerar todos los procesos de usuario ordenados por el uso de memoria más alto en MB como este:

ps -u $USER -wo rss=,comm= --sort -rss | while read -r rss comm ; do echo $((rss/1024))"MB -" $comm; done

Puedes usar en command=lugar decomm= mostrar el proceso de ruta completa.

El =solo elimina el título de la columna.


3

Descubrí que muchas veces el mismo proceso tiene un subproceso de fork y usted está interesado en la memoria total utilizada por el proceso. Por ejemplo, Google Chrome inicia un proceso múltiple y desea saber la memoria total tomada por Chrome. Encontré debajo de un comando de línea muy útil

echo "%CPU   %MEM    MEM     PROCESS"
ps aux | awk '{mem[$11]+=int($6/1024)}; {cpuper[$11]+=$3};{memper[$11]+=$4}; END {for (i in mem) {print cpuper[i]"% ",memper[i]"% ",mem[i]" MB ",i}}' | sort -k3nr | head -n 5

Se encarga de muchas cosas, como mostrar memoria en MB, ordenar en memoria y principalmente agrupar por comando. También está agrupando% CPU y% memoria. Muestra datos en un formato fácil de usar.

Este comando se inspiró en esta respuesta y me ayudó mucho a tener una idea de qué proceso está consumiendo mis recursos.

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.