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.