Como monitorar o uso da memória para fins alarmantes

9

Nós incorporamos o sistema Linux sem troca.

Atualmente, devemos acionar o alarme quando o% de uso da memória aumentar durante um limite de threashold. E reinicie quando o uso da memória% aumentar acima de um limite (mais alto).

Por que queremos fazer isso: Se algum programa vazar, poderemos reiniciar com segurança, antes que o kernel comece a matar nossos processos (o que pode levar à corrupção ou indisponibilidade dos dados).

Mas temos um problema:

Como contar o uso de memória em% que pode ser usado para nosso propósito?

Tentamos contar o uso da 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. Por isso, também fornece valores de uso de memória muito grandes.

(MemTotal - MemFree - Buffers - Cached - Inactive) é inutilizável, porque o resultado pode ser negativo.

Esqui
fonte

Respostas:

6

Monitorar o sistema via 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

Olhe para a -/+ buffers/cachelinha usedefree

Monitore cada processo via / proc

Eu usei esse 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.

Limitar recurso para cada processo

ou use ulimit/setrlimit

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

snies
fonte
Você pode explicar o método usado pelo script Python para calcular o uso de memória? Isso tornaria essa uma resposta muito melhor.
Flimzy
Bem, ele apenas registra o uso da VM em etapas de segundo. Eu usei isso para representar graficamente o consumo de mem durante a vida útil do programa. Isso foi útil para depurar vazamentos de mem em programas de execução longa.
snies
Você pode usar isso para monitorar um programa após algum tempo de inicialização. E alerta algum "sinalizador suspeito de vazamento" se o vmusage ultrapassar determinado limite.
snies
11
O link para phacker.org não existe mais
f01 18/07/2015
... é por isso StarckExchange sempre pede para deixar o conteúdo de roteiros, e não apenas links
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

Nomeie como alert.sh e execute o comando: chmod +x alert.sh

Configure um cron para executar este script a cada 10 minutos

Substitua '512' pela memória total do servidor em MB e '[email protected]' pelo endereço de email real. Isso enviará um alerta por email sempre que o uso da memória for superior a 95% e reiniciará o serviço "service_name" se atingir 90%

Saurabh Singla
fonte
2

Você pode usar um script de 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 nos limites desejados e enviar por email, reiniciar ou qualquer ação que desejar:

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

Em seguida, adicione-o ao crontab para executar nos intervalos desejados.

Pedro
fonte
1

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 memória RAM nesta caixa.

TaoJoannes
fonte