Medir la memoria RAM es una tarea complicada. Podemos ejecutar el comando ps y somar los valores de una determinada columna, pero no nos va a dar el resultado correcto.
Los sistemas operativos actuales como Linux usan memoria virtual, esta les permite utilizar parte de la memoria RAM que necesita cada aplicación y sobreasignar la cantidad de memoria RAM, simulando que poseen mucha más memoria.
Además, la mayoría de los programas usan librerías compartidas. Entonces al abrir otra aplicación que usa la misma librería que otro programa en ejecución ahorra cierta cantidad de memoria RAM.
Por ejemplo, supongamos que queremos ver la cantidad de memoria que consume Firefox, si lo intentamos con ps:
`ps -Cfirefox -o vsz --no-headers | awk '{ sum += $1 } END { print sum/1024/1024 }'`
Eso da como resultado (en este caso particular) 3.75465 GB ¿Parece mucho, no?
En realidad ese resultado es poco significativo. El campo *vsz* es el tamaño de la memoria virtual que usa un proceso. Esto es: la memoria física realmente utilizada más memoria que el proceso puede llegar a necesitar en algún momento, más la memoria swap empleada.
Podríamos medirlo con un parámetro un poco más exacto tal como ls RSS. RSS (*Resident Set Size*) es la cantidad de memoria asignada a ese proceso y está en RAM. No incluye swap. Incluye la memoria de librerías compartidas siempre que las páginas de esas librerías estén en memoria.
Estos serían los resultados
```
pgrep -f /usr/lib64/firefox | xargs ps -o rss --no-headers | awk '{ sumrss += $1 } END { print sumrss/1024/1024 } '
2.92811
```
Pero existe una herramienta llamada **smem** que mide valores más útiles, estos son **PSS** y **USS**.
PSS divide los bloques de memoria virtual compartida por la cantidad de procesos que en ese momento tienen una entrada en la tabla que traduce direcciones virtuales a físicas para la página. Dicho de otro modo la memoria compartida se divide por la cantidad de procesos que la usan.
Además, smem informa acerca de USS que es la memoria que no está compartida con otros procesos.
`smem -tk -P/usr/lib64/firefox`
Como se puede apreciar una diferencia de 17% respecto a la RSS
Además, smem puede mostrar la información de manera gráfica:
### Fuentes y recursos adicionales
- [Chris's Wiki :: blog/linux/LinuxMemoryStats](https://utcc.utoronto.ca/~cks/space/blog/linux/LinuxMemorySt
ats)
- [smem memory reporting tool](https://www.selenic.com/smem/)
- [Proportional set size - Wikipedia](https://en.wikipedia.org/wiki/Proportional_set_size)
- [Unique set size - Wikipedia](https://en.wikipedia.org/wiki/Unique_set_size)
- [Resident set size - Wikipedia](https://en.wikipedia.org/wiki/Resident_set_size)