Come monitorare l'utilizzo della memoria a scopo allarmante


9

Abbiamo un sistema Linux incorporato senza swap.

Attualmente dobbiamo allarmare quando l'utilizzo della memoria% aumenta su un limite. E riavviare quando la percentuale di utilizzo della memoria aumenta oltre una soglia (più alta).

Perché vogliamo farlo: se un programma perde, possiamo riavviare la sicurezza prima che il kernel inizi a uccidere i nostri processi (il che può portare a corruzione o indisponibilità dei dati).

Ma abbiamo un problema:

Come contare l'utilizzo della memoria% che può essere utilizzato per il nostro scopo?

Abbiamo provato a contare l'utilizzo della memoria usando i valori di / 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

Senza successo:

(MemTotal - MemFree) non è utilizzabile, perché contiene ad esempio cache.

(MemTotal - MemFree - Buffers - Cached)ha ignorato l'effetto di Inactive. Quindi fornisce anche valori di utilizzo della memoria troppo grandi.

(MemTotal - MemFree - Buffers - Cached - Inactive) è inutilizzabile, perché il risultato può essere negativo.

Risposte:


6

Sistema di monitoraggio 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

Guarda la -/+ buffers/cachelinea usedefree

Monitorare ogni processo tramite / proc

Ho usato questo script Python e / proc / pid / stat per monitorare la memoria di un processo:

http://phacker.org/2009/02/20/monitoring-virtual-memory-usage-with-python/

probabilmente vorresti tradurre qualcosa del genere in c.

Limitare le risorse per ciascun processo

o usa ulimit/setrlimit

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


Puoi spiegare il metodo utilizzato dallo script Python per calcolare l'utilizzo della memoria? Ciò renderebbe questa una risposta molto migliore.
Flimzy,

Bene, registra semplicemente l'utilizzo di VM in pochi secondi. L'ho usato per rappresentare graficamente il consumo di mem durante la durata del programma. Ciò è stato utile per eseguire il debug di perdite di mem in programmi di lunga durata.
Snies

Potresti semplicemente usarlo per monitorare un prog dopo qualche tempo di inizializzazione. E avvisa un po 'di "bandiera sospetta di fuga" se vmusage attraversa una certa soglia.
Snies

1
Il link a phacker.org non esiste più
f01

... ecco perché StarckExchange chiede sempre di pubblicare il contenuto degli script, non solo i collegamenti
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

Denominalo come alert.sh ed esegui il comando: chmod +x alert.sh

Configura un cron per eseguire questo script ogni 10 minuti

Assicurati di sostituire "512" con la memoria totale del tuo server in MB e "admin@dominio.com" con l'indirizzo e-mail effettivo. Questo invierà un avviso e-mail ogni volta che l'utilizzo della memoria supera il 95% e riavvia il servizio "nome_servizio" se raggiunge il 90%


2

Puoi usare uno script di shell in cron con il comando gratuito per monitorare la memoria e agire secondo i suoi valori. Ad esempio, per monitorare 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

Invece di echeggiare l'output, è possibile valutare i valori fino ai limiti desiderati e inviare e-mail, riavviare o qualsiasi altra azione si desideri:

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

Quindi lo aggiungi a crontab per essere eseguito negli intervalli desiderati.


1

un'altra utile utility dal pacchetto sysstat è sar.

Per informazioni sulla memoria, utilizzare:

$ 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

Potrei sicuramente usare più RAM su questa scatola.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.