LINUX

Análisis de memoria Linux con comando libre y Pmap

Cuando hablamos de memoria, son los parámetros más incomprendidos de todo el sistema, especialmente cuando hablamos de Unix como sistema.

Este artículo habla principalmente de herramientas simples que se pueden usar para evaluar el uso de memoria de un proceso o un sistema en su conjunto.

Dos áreas principales son la memoria del kernel y la memoria del usuario, ahora ampliemos un poco estos términos.

Memoria del núcleo

Es la memoria gestionada por el kernel que comprende:

• Texto: donde solo se almacenan las partes de solo lectura del programa. Este suele ser el código de instrucción real del programa. Múltiples instancias del mismo programa pueden compartir esta área de memoria.

• Datos estáticos: el área donde se asigna la memoria conocida previamente. Esto es generalmente para variables globales y miembros de clase estáticos de C++. El sistema operativo asigna una copia de esta área de memoria para cada instancia del programa.

• Espacio de memoria (también conocido como espacio de pausa): el área donde se almacena la memoria de tiempo de ejecución dinámica. El campo de la memoria consta de almacenamiento dinámico y memoria no utilizada. El montón es donde reside toda la memoria asignada por el usuario. El montón crece desde una dirección de memoria inferior a una dirección de memoria superior.

• Pila: cada vez que un programa realiza una llamada de función, el estado de la función actual debe guardarse en la pila. La pila crece desde una dirección de memoria más alta a una dirección de memoria más baja. Hay una arena de memoria única y una pila para cada instancia del programa.

memoria de usuario

Reside en el montón de memoria y es llamado por rutinas de memoria como malloc(), realloc, free(), callo()
Por lo tanto, la memoria juega un papel importante en el rendimiento del sistema y es uno de los componentes más críticos que se analizarán durante un problema de rendimiento del sistema. Tenemos muchas herramientas a través de las cuales se puede medir el rendimiento del sistema, pero a veces falla estrepitosamente, especialmente cuando no está revisando un laboratorio doméstico, sino una caja de producción en funcionamiento crítico con 60 G de RAM, procesadores multinúcleo y aplicaciones pesadas que generan millones de conexiones y, por lo tanto, crean un cuello de botella en el rendimiento; escenarios en los que generalmente no confiamos demasiado en los comandos ps o top porque informa el uso de memoria del proceso en el concepto de que es el único proceso que se ejecuta en el sistema operativo del sistema, pero en realidad Linux también tiene algunos conceptos de biblioteca compartida, por lo que cuando hacemos un ps o un sus en un proceso para obtener ignora otras cosas relacionadas con la memoria, como las secciones compartidas/privadas que muestran el uso real de la memoria, esta línea a continuación nos ayudará a encontrar las cosas exactas para los procesos en ejecución.

No siempre debe estar satisfecho con estas líneas principales:

[redhat@localhost Desktop]$ ps -e -o user,pid,%cpu,%mem,rss,cmd --sort=-rss | head
USER PID %CPU %MEM RSS CMD
redhat 3114 4.2 1.1 21612 /usr/lib/vmware-tools/sbin32/vmtoolsd -n vmusr
root 2673 5.9 1.0 20032 /usr/bin/Xorg :0 -nr -verbose -audit 4 -auth /var/run/gdm/auth-for-gdm-WW9iey/database -nolisten tcp vt1
redhat 3090 5.3 0.9 18928 nautilus
redhat 3161 1.3 0.8 17444 /usr/bin/gnote --panel-applet --oaf-activate-iid=OAFIID:GnoteApplet_Factory --oaf-ior-fd=19
redhat 3207 3.4 0.7 14384 /usr/bin/gnome-terminal -x /bin/sh -c cd '/home/redhat/Desktop' && exec $SHELL
redhat 3162 1.2 0.6 13084 /usr/libexec/clock-applet --oaf-activate-iid=OAFIID:GNOME_ClockApplet_Factory --oaf-ior-fd=28
redhat 3084 0.8 0.5 11620 gnome-panel
redhat 3146 0.7 0.5 11176 nm-applet --sm-disable
redhat 3133 0.4 0.5 10428 gnome-volume-control-applet
NB: The moral of this story is that process memory usage on Linux is a complex matter; you can't just run ps and know what is going on. This is especially true when you deal with programs that create a lot of identical children processes, like Java. Ps command might report that each Java process uses 100 megabytes of memory, when the reality might be that the marginal cost of each Java process is 10 megabyte of memory.

Una línea a continuación le dará una imagen detallada de lo que sucede debajo de las sábanas:

for i in `ps -eaf | grep java | grep -v grep | awk '{print $2}'`; do  echo -n "PID $i actual memory  usage is :" >> totaluse.txt; pmap -d $i | grep -i "writeable/private: " >> totaluse.txt; done

Ahora, no se asuste con esa línea porque la voy a dividir en partes para explicar cada parte de ella y luego podrá ver lo fácil que es usar esos delineadores en algunos de los escenarios de producción más críticos, aquí tenemos Hablamos sobre la herramienta pmap, presentemos pmap y definámoslo oficialmente de acuerdo con la página MAN:

NAME
PMAP - REPORT MEMORY MAP OF A PROCESS

SYNOPSIS
PMAP [ -X | -D ] [ -Q ] PIDS...
PMAP -V

DESCRIPTION
THE PMAP COMMAND REPORTS THE MEMORY MAP OF A PROCESS OR PROCESSES.

GENERAL OPTIONS
-X EXTENDED SHOW THE EXTENDED FORMAT.
-D DEVICE SHOW THE DEVICE FORMAT.
-Q QUIET DO NOT DISPLAY SOME HEADER/FOOTER LINES.
-V SHOW VERSION DISPLAYS VERSION OF PROGRAM.

EXTENDED AND DEVICE FORMAT FIELDS
ADDRESS: START ADDRESS OF MAP
KBYTES: SIZE OF MAP IN KILOBYTES
RSS: RESIDENT SET SIZE IN KILOBYTES
DIRTY: DIRTY PAGES (BOTH SHARED AND PRIVATE) IN KILOBYTES
MODE: PERMISSIONS ON MAP: READ, WRITE, EXECUTE, SHARED, PRIVATE (COPY ON WRITE)
MAPPING: FILE BACKING THE MAP, OR ’[ ANON ]’ FOR ALLOCATED MEMORY, OR ’[ STACK ]’ FOR THE PROGRAM STACK
OFFSET: OFFSET INTO THE FILE
DEVICE: DEVICE NAME (MAJOR:MINOR)

Para que podamos ver el mapa de procesos de cualquier proceso y su consumo de memoria real y no el promedio vago informado por el proceso principal, tomaré un escenario de producción para explicar mi línea anterior y otros cálculos de memoria basados ​​en herramientas de memoria, como free .

Scenarios : its difficult to find the actual memory consumption as top is reporting memory usage is 98% utilized and free is also aligning with the top output with no process running in the system other than the system processes, what could be the reason and how to debug it.

filosofia linux

La filosofía de Linux es que un recurso no utilizado es un recurso desperdiciado. Por lo tanto, el kernel usará tanta RAM como sea posible para almacenar información en caché en sus sistemas de archivos y discos locales y remotos. Esto se acumula con el tiempo a medida que se realizan lecturas y escrituras en el sistema, tratando de mantener los datos almacenados en la RAM lo más relevantes posible para los procesos que se han estado ejecutando en su sistema. El sistema informa sobre este caché como la suma de dos números, búfer y caché de página. La memoria caché se recupera, no cuando finaliza el proceso (es posible que pronto inicie otro proceso que necesite los mismos datos), sino a pedido; por ejemplo, cuando inicia un proceso que necesita mucha memoria para ejecutarse, el kernel de Linux recuperará la memoria que tenía datos almacenados en caché y dárselos al nuevo proceso.

Dicho esto, hay algunas cosas que se informan como «almacenadas en caché» pero que no están directamente disponibles para el kernel:

1. mmaps anónimos, que no son compatibles con un archivo sino con el área de intercambio.

2. regiones de memoria compartida, tanto System V IPC como POSIX /dev/shm.

3. Algunos servidores de aplicaciones y bases de datos (p. ej., SAP y Oracle DB) utilizan estas instalaciones de memoria compartida como una forma muy conveniente de compartir datos entre múltiples procesos.

Aunque tanto los mmaps anónimos como las regiones de memoria compartida se pueden intercambiar de la memoria al disco, por lo que, en teoría, sus aplicaciones podrían usar esa memoria, su sistema puede experimentar problemas de rendimiento si esto aparece.

En consecuencia, si su sistema utiliza alguna de las funciones anteriores, debe tener en cuenta que no toda la memoria informada como «caché» debe considerarse disponible para sus aplicaciones.

Todavía informarán sobre todos los procesos adjuntos a ellos, a diferencia del caché normal que no es parte del espacio de direcciones de ningún proceso en ejecución, sino que es simplemente un mapeo del núcleo.

Por ejemplo (las unidades están en megabytes):

# free -m
total used free shared buffers cached
Mem: 1000 900 100 0 350 350
-/+ buffers/cache: 200 800

En este ejemplo, en términos de aplicaciones, el sistema usa solo 200 MB de memoria y tiene 800 MB libres y disponibles para usar si es necesario (siempre que no haya mapas de memoria anónimos o regiones de memoria compartida).

Nota: En este ejemplo,

Total Physical Memory = 1000 M

Physically Used Memory = 900 M

Actual used memory = 200 M

buffers = 350 M

cached = 350 M

Physically Free Memory = 100 M

Memory free for Applications = 800 M

Los elementos a tener en cuenta aquí son:

<Physically Used Memory> = <Actual used memory> + <buffers> + <cache> = 200 + 350 + 350 = 900 M

<Physically Free Memory> = <Total Physical Memory> - <Actual used memory> - <buffers> - <cache> = 1000 - 200 - 350 - 350 = 100 M

<Memory free for Applications> = <Total Physical Memory> - <Actual used memory> = 1000 - 200 = 800 M

<Memory used  by Applications> = <Physically Used Memory> - <buffers> - <cache> = 900 - 350 - 350 = 200 M

El escenario anterior explica un ejemplo perfecto del uso de la herramienta de forma gratuita, porque comprender cada parámetro del resultado puede llevar a conclusiones sorprendentes y reducir el capital total de los gastos de actualización del servidor.

Podemos explicar algunas frases ingeniosas aquí ahora, en caso de que se necesite el mapa de proceso detallado para los cálculos anteriores, se requiere un poco de secuencias de comandos bash shell y puede obtener valores «fuera de los gráficos» para el rendimiento de su sistema, echemos un vistazo a la explicación a continuación, la vista del mapa de procesos para cada proceso del sistema se puede obtener con esta línea, y luego se pueden agregar las secciones a continuación para obtener el uso de la memoria del sistema o de la aplicación, si desea evitar los cálculos de libre herramientas de arriba.

Usando Pmap

for i in `ps -eaf | grep “any application process” | grep -v grep | awk '{print $2}'`; do echo -n "PID $i actual memory usage is :" >> totaluse.txt; pmap -d $i | grep -i "writeable/private: " >> totaluse.txt; done

Ahora, el mismo parámetro «Memoria utilizada por las aplicaciones» se puede confirmar dos veces con el anterior también si tiene tiempo y desea una explicación precisa del uso de la memoria por aplicación o proceso del sistema, por lo que al hacer un gato en totaluse.txt, verá algo como este:

{a continuación se muestra solo un ejemplo y no tiene nada que ver con el cálculo anterior}

PID 16156 actual memory usage is :mapped: 15128K writeable/private: 10824K shared: 28K
PID 16158 actual memory usage is :mapped: 1381472K writeable/private: 1349680K shared: 2676K
PID 20220 actual memory usage is :mapped: 15196K writeable/private: 10892K shared: 28K
PID 20222 actual memory usage is :mapped: 2733700K writeable/private: 2708256K shared: 2932K
PID 27764 actual memory usage is :mapped: 15196K writeable/private: 10892K shared: 28K
PID 27766 actual memory usage is :mapped: 277176K writeable/private: 255552K shared: 3360K

Ahora, si agrega las secciones grabables/privadas, obtendrá exactamente el uso de memoria de los procesos IV, espero que esto ayude. Al agregar estas columnas, se acerca a 4+GB, 10824+1349680+10892+2708256+10892+255552 KB de memoria === cerca de 4+GB.

En conclusión, aquí discutimos free y pmap para obtener el uso exacto de la memoria y evitar resultados imprecisos en escenarios de producción críticos.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba
Cerrar