Reportes de uso de memoria con smem

By | September 26, 2017

Smem es una sencilla utilidad que nos permite comprobar el uso de memoria a nivel de procesos, usuarios y global de nuestro sistema.

Podemos instalarla en las principales distros con las herramientas de paquetería correspondientes:

# Debian y derivadas como Ubuntu
apt install smem
# RHEL y derivadas (CentOS, Fedora)
yum install smem

Los reportes de smem son muy sencillos de interpretar, pero para sacar su máximo potencial es conveniente utilizar varias opciones combinadas. Por ejemplo, para obtener la memoria residente (RSS, Resident Set Size) utilizada por cada usuario lanzaríamos con root (o sudo para usuarios con permisos administrativos):

[root@jotadebian ~]# smem -u -c "rss user" -r -t -k -s rss
     RSS User     
    3.2G bob      
    1.9G libvirt-qemu 
  562.1M clamav   
  382.7M root     
  240.7M Debian-gdm 
   15.6M colord   
    4.8M messagebus 
    2.9M rtkit    
    2.1M daemon   
    1.5M vnstat   
------------------
    6.3G          

Donde:

  • -u indica reporte de memoria por usuario
  • -c “rss user” columnas a mostrar
  • -r orden inverso (de mayor a menor)
  • -t sumatorio final
  • -k modo abreviado (Mb, Gb, por defecto es en Kb)
  • -s rss campo a partir del cual ordenar

Para ver memoria PSS (Proportional Set Size) bastaría con:

root@jotadebian ~]# smem -u -c "pss user" -r -t -k -s pss
     PSS User     
    2.4G bob      
    1.8G libvirt-qemu 
  535.4M clamav   
  194.9M root     
  126.3M Debian-gdm 
    8.1M colord   
    1.6M messagebus 
  450.0K rtkit    
  264.0K daemon   
  218.0K vnstat   
------------------
    5.0G          

Para obtener el nº de procesos por usuario:

[root@jotadebian ~]# smem -u -c "count user" -r -t -k -s count
Count User     
   55 bob      
   35 root     
   11 Debian-gdm 
    3 libvirt-qemu 
    2 clamav   
    1 vnstat   
    1 rtkit    
    1 messagebus 
    1 daemon   
    1 colord   
---------------
  111          

Podríamos también obtener la memoria residente de cada proceso reportando además el PID y comando asociado:

[root@jotadebian ~]# smem -c "pid command rss" -k -r -t -s rss
  PID Command                          RSS 
 2318 /usr/lib/firefox-esr/plugin   990.1M 
 3353 qemu-system-x86_64 -enable-   986.9M 
 3300 qemu-system-x86_64 -enable-   984.2M 
 3249 qemu-system-x86_64 -enable-   982.4M 
 2261 /usr/lib/firefox-esr/firefo   741.3M 
  723 /usr/sbin/clamd --foregroun   537.1M 
 1500 /usr/bin/gnome-shell          349.9M 
 3177 /usr/bin/python /usr/share/   238.4M 
 1326 /usr/bin/gnome-shell          151.5M 
 1404 /usr/lib/xorg/Xorg vt2 -dis   101.6M 
 2224 /usr/bin/cli /usr/lib/keepa    94.2M 
 1637 /usr/bin/gnome-software --g    71.9M 
 1633 /usr/bin/python3 /usr/bin/h    64.6M 
 1625 /usr/lib/tracker/tracker-ex    57.3M 
 4310 /usr/bin/nautilus --gapplic    54.3M 
 1624 /usr/lib/evolution/evolutio    50.8M 
 4334 /usr/bin/gedit --gapplicati    48.8M 
 1288 /usr/lib/xorg/Xorg vt1 -dis    47.4M 
 1776 /usr/lib/gnome-terminal/gno    42.3M 
  998 /usr/sbin/libvirtd             41.4M 
 1604 /usr/lib/gnome-settings-dae    39.6M 
 1551 /usr/lib/gnome-online-accou    31.5M 
 1684 /usr/lib/evolution/evolutio    31.1M 
...
  680 /usr/sbin/atd -f                2.3M 
  999 /usr/sbin/vnstatd -n            1.8M 
  647 /usr/sbin/acpid                 1.6M 
  668 /usr/sbin/atopacctd             1.4M 
 1471 /usr/bin/ssh-agent gnome-se   952.0K 
-------------------------------------------
  110                                 7.3G 

A nivel global de sistema podemos ver memoria cargada por el kernel, espacio de usuario y memoria libre:

[root@jotadebian ~]# smem -w -k -t
Area                           Used      Cache   Noncache 
firmware/hardware                 0          0          0 
kernel image                      0          0          0 
kernel dynamic memory         10.4G      10.1G     315.3M 
userspace memory               4.9G     528.0M       4.4G 
free memory                  280.0M     280.0M          0 
----------------------------------------------------------
                              15.6G      10.9G       4.7G 

Mostrando mapeos de memoria:

[root@jotadebian ~]# smem -m -k -r -s pids
Map                                       PIDs   AVGPSS      PSS 
[vvar]                                     110        0        0 
[vsyscall]                                 110        0        0 
[vdso]                                     110        0     3.0K 
[stack]                                    110    48.0K     5.2M 
<anonymous>                                110    45.9M     4.9G 
/lib/x86_64-linux-gnu/libc-2.24.so         110    37.0K     4.0M 
/lib/x86_64-linux-gnu/ld-2.24.so           110     8.0K   968.0K 
[heap]                                     108     5.7M   618.9M 
/lib/x86_64-linux-gnu/libdl-2.24.so        107     7.0K   838.0K 
/lib/x86_64-linux-gnu/libpthread-2.24.so   103     7.0K   806.0K 
/lib/x86_64-linux-gnu/libpcre.so.3.13.3     98    11.0K     1.1M 
/lib/x86_64-linux-gnu/libselinux.so.1       96     8.0K   834.0K 
/lib/x86_64-linux-gnu/librt-2.24.so         96     7.0K   732.0K 
/lib/x86_64-linux-gnu/libuuid.so.1.3.0      80     7.0K   622.0K 
/lib/x86_64-linux-gnu/libz.so.1.2.8         77     8.0K   653.0K 
/lib/x86_64-linux-gnu/libgpg-error.so.0.    77     7.0K   594.0K 
/lib/x86_64-linux-gnu/libgcrypt.so.20.1.    77    41.0K     3.1M 
/lib/x86_64-linux-gnu/libblkid.so.1.1.0     76    20.0K     1.5M 
/usr/lib/x86_64-linux-gnu/libffi.so.6.0.    75     7.0K   587.0K 
/lib/x86_64-linux-gnu/libresolv-2.24.so     75     7.0K   598.0K 
/lib/x86_64-linux-gnu/libmount.so.1.1.0     73    11.0K   807.0K 
/lib/x86_64-linux-gnu/liblzma.so.5.2.2      73     8.0K   606.0K 
/lib/x86_64-linux-gnu/libglib-2.0.so.0.5    71    22.0K     1.5M 
/usr/lib/x86_64-linux-gnu/libgobject-2.0    69    12.0K   847.0K 
/usr/lib/x86_64-linux-gnu/libgmodule-2.0    68     8.0K   544.0K 
/usr/lib/x86_64-linux-gnu/libgio-2.0.so.    68    51.0K     3.4M 
/usr/lib/locale/locale-archive              66    14.0K   933.0K 
...

Tenemos también la opción de generar gráficas con ayuda de las librerías matplotlib de Python. Por ejemplo para generar un gráfico circular:

smem --pie name -s rss

Para un gráfico de barras:

smem --userfilter="bob" --bar pid -c"rss"

Pueden no resultar del todo claras, especialmente cuando hay que renderizar gran cantidad de información. Personalmente prefiero la salida por terminal para medir usos de memoria en vez de el modo gráfico. No sólo por claridad sino porque con una sencilla combinación de opciones podemos obtener reportes de memoria muy útiles.