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.

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


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" admin@domain.com


     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 'admin@domain.com' 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%


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.