
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/cache
línea used
yfree
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.