
Temos sistema Linux embarcado sem swap.
Atualmente, devemos acionar o alarme quando a% de uso de memória aumentar acima de um limite. E reinicie quando a% de uso de memória aumentar acima de um limite (maior).
Por que queremos fazer isso: Se algum programa vazar, podemos fazer uma reinicialização de segurança, antes que o kernel comece a eliminar nossos processos (o que pode levar à corrupção de dados ou indisponibilidade).
Mas temos um problema:
Como contar o uso de memória -% que pode ser usado para nosso propósito?
Tentamos contar o uso de memória 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
Sem sucesso:
(MemTotal - MemFree)
não é utilizável porque contém, por exemplo, caches.
(MemTotal - MemFree - Buffers - Cached)
ignorou o efeito de Inactive
. Portanto, também fornece valores de uso de memória muito grandes.
(MemTotal - MemFree - Buffers - Cached - Inactive)
é inutilizável, porque o resultado pode ser negativo.
Responder1
Sistema de monitoramento viafree
[root@localhost ~]# free
total used free shared buffers cached
Mem: 2058240 1776788 281452 0 89780 1335840
-/+ buffers/cache: 351168 1707072
Swap: 4095992 100 4095892
Olhe para a -/+ buffers/cache
linha used
efree
Monitore cada processo via /proc
Usei este script python e /proc/pid/stat para monitorar a memória de um processo:
http://phacker.org/2009/02/20/monitoring-virtual-memory-usage-with-python/
você provavelmente gostaria de traduzir algo assim para c.
Limite recursos para cada processo
ou usar ulimit
/setrlimit
https://stackoverflow.com/questions/4983120/limit-memory-usage-for-a-single-linux-process
Responder2
#!/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
Nomeie isso como alert.sh e execute o comando:chmod +x alert.sh
Configure um cron para executar este script a cada 10 minutos
Certifique-se de substituir '512' pela memória total do servidor em MB e '[e-mail protegido]'com endereço de e-mail real. Isso enviará um alerta por e-mail sempre que o uso da memória ultrapassar 95% e reiniciará o serviço "service_name" se atingir 90%
Responder3
Você pode usar um script shell no cron com o comando free para monitorar a memória e agir de acordo com seus valores. Por exemplo, para monitorar a memória 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
Em vez de repetir a saída, você pode avaliar os valores até os limites desejados e enviar por e-mail, reinicializar ou qualquer ação desejada:
if [ eval_values > threshold ]
then
# Do stuff (mail, reboot, etc)
fi
Em seguida, você o adiciona ao crontab para ser executado nos intervalos desejados.
Responder4
outro utilitário útil do pacote sysstat é o sar.
Para informações de memória, 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
Eu definitivamente poderia usar mais RAM nesta caixa.