Cómo monitorear el uso de la memoria con fines alarmantes

Cómo monitorear el uso de la memoria con fines alarmantes

Contamos con sistema Linux integrado sin swap.

Actualmente debemos dar la alarma cuando el porcentaje de uso de memoria aumenta por encima de un umbral. Y reinicie cuando el porcentaje de uso de memoria aumente por encima de un umbral (más alto).

Por qué queremos hacer eso: si algún programa tiene fugas, podemos realizar un reinicio de seguridad, antes de que el kernel comience a eliminar nuestros procesos (lo que puede provocar corrupción o indisponibilidad de los datos).

Pero tenemos un problema:

¿Cómo contar el porcentaje de uso de memoria que se puede utilizar para nuestro propósito?

Intentamos contar el uso de memoria usando valores de /proc/meminfo:

/ # cat /proc/meminfo
MemTotal:       126744 kB
MemFree:         58256 kB
Buffers:         16740 kB
Cached:          31308 kB
SwapCached:          0 kB
Active:          37580 kB
Inactive:        24000 kB

Sin éxito:

(MemTotal - MemFree)no se puede utilizar porque contiene, por ejemplo, cachés.

(MemTotal - MemFree - Buffers - Cached)ignoró el efecto de Inactive. Por lo tanto, también proporciona valores de uso de memoria demasiado grandes.

(MemTotal - MemFree - Buffers - Cached - Inactive)es inutilizable, porque el resultado puede ser negativo.

Respuesta1

Monitorear el sistema mediantefree

[root@localhost ~]# free
          total       used       free     shared    buffers     cached
Mem:    2058240    1776788     281452          0      89780    1335840
-/+ buffers/cache:  351168    1707072
Swap:   4095992        100    4095892

Mira la -/+ buffers/cachelínea usedyfree

Monitorear cada proceso vía /proc

Utilicé este script de Python y /proc/pid/stat para monitorear la memoria de un proceso:

http://phacker.org/2009/02/20/monitoring-virtual-memory-usage-with-python/

probablemente le gustaría traducir algo como esto a c.

Limitar recursos para cada proceso.

o usar ulimit/setrlimit

https://stackoverflow.com/questions/4983120/limit-memory-usage-for-a-single-linux-process

Respuesta2

#!/bin/bash

threshold=90
threshold2=95

freemem=$(($(free -m |awk 'NR==2 {print $3}') * 100))

usage=$(($freemem / 512))

if [ "$usage" -gt "$threshold" ]

then

/etc/init.d/service_name restart

     if [ "$usage" -gt "$threshold2" ]

     then

     echo "The memory usage has reached $usage% on $HOSTNAME." | mail -s "High Memory Usage Alert" [email protected]


     fi
fi

Nombra esto como alert.sh y ejecuta el comando:chmod +x alert.sh

Configure un cron para ejecutar este script cada 10 minutos

Asegúrese de reemplazar '512' con la memoria total de su servidor en MB y '[correo electrónico protegido]' con dirección de correo electrónico real. Esto enviará una alerta por correo electrónico cada vez que el uso de la memoria supere el 95 % y reiniciará el servicio "nombre_servicio" si alcanza el 90 %.

Respuesta3

Puede utilizar un script de shell en cron con el comando gratuito para monitorear la memoria y actuar de acuerdo con sus valores. Por ejemplo, para monitorear la memoria RAM:

#!/bin/bash

LOG_DIR=/var/log/memory_monitor.log

DATE=$(date +%d/%m/%Y)
TIME=$(date +%H:%M)
TIMESTAMP="$DATE $TIME"

MONITOR=$(free | grep Mem)
MEM_USED=$(echo $MONITOR | awk '{ print $3 }')
MEM_FREE=$(echo $MONITOR | awk '{ print $4 }')

echo "$TIMESTAMP $MEM_USED $MEM_FREE" >> $LOG_DIR

En lugar de repetir la salida, puede evaluar los valores hasta los límites que desee y enviarlos por correo, reiniciar o realizar cualquier acción que desee:

if [ eval_values > threshold ]
then
    # Do stuff (mail, reboot, etc)
fi

Luego lo agregas a crontab para que se ejecute en los intervalos que desees.

Respuesta4

Otra utilidad útil del paquete sysstat es sar.

Para obtener información sobre la memoria, utilice:

$ sar -r 1
Linux 3.0.0-12-generic (HFC-2600)       05/03/2012      _i686_  (4 CPU)

01:35:45 PM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact
01:35:46 PM    118484    907364     88.45     59200    317368   2169716    104.75    412476    436140

Definitivamente podría usar más RAM en esta caja.

información relacionada