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.