Cómo monitorear el uso de la memoria con un propósito alarmante

9

Hemos integrado el sistema Linux sin intercambio.

Actualmente debemos dar la alarma cuando el porcentaje de uso de memoria aumenta en 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 hacer un reinicio de seguridad, antes de que el núcleo comience a matar nuestros procesos (lo que puede conducir a la corrupción o falta de disponibilidad de datos).

Pero tenemos un problema:

¿Cómo contar el 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 es utilizable porque contiene, por ejemplo, cachés.

(MemTotal - MemFree - Buffers - Cached)hizo caso omiso de efecto 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.

Esquí
fuente

Respuestas:

6

Monitorear el sistema a través de free

[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/cachelinea usedyfree

Monitoree cada proceso a través de / proc

Usé 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.

Limite los recursos para cada proceso

o usar ulimit/setrlimit

/programming/4983120/limit-memory-usage-for-a-single-linux-process

Snies
fuente
¿Puedes explicar el método que usa tu script Python para calcular el uso de memoria? Eso haría que esta sea una respuesta mucho mejor.
Flimzy
Bueno, solo registra el uso de VM en pasos de un segundo. Lo usé para graficar el consumo de memoria durante la vida útil del programa. Esto fue útil para depurar fugas de memoria en programas de larga ejecución.
Snies
Podrías usar esto para monitorear un programa después de un tiempo de inicio. Y alerta alguna "bandera sospechosa de fuga" si vmusage cruza cierto umbral.
Snies
1
El enlace a phacker.org ya no existe
f01
... por eso StarckExchange siempre pide publicar el contenido de los scripts, no solo los enlaces
JDS
4
#!/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

Nombre esto como alert.sh y ejecute 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 '[email protected]' con la dirección de correo electrónico real. Esto enviará una alerta por correo electrónico cada vez que el uso de memoria supere el 95% y reiniciará el servicio "nombre_servicio" si alcanza el 90%

Saurabh Singla
fuente
2

Puede usar un script de shell en cron con el comando libre para monitorear la memoria y actuar según 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 hacer eco de la salida, puede evaluar los valores a los límites que desee y enviar por correo, reiniciar o cualquier acción que desee:

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

Luego lo agrega a crontab para que se ejecute en los intervalos que desee.

Peter
fuente
1

Otra utilidad útil del paquete sysstat es sar.

Para información sobre la memoria, use:

$ 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.

TaoJoannes
fuente