Comment surveiller l'utilisation de la mémoire à des fins alarmantes

9

Nous avons intégré un système Linux sans échange.

Nous devons actuellement sonner l'alarme lorsque le pourcentage d'utilisation de la mémoire augmente au cours d'une période de trois ans. Et redémarrez lorsque le pourcentage d'utilisation de la mémoire augmente au-dessus d'un seuil (plus élevé).

Pourquoi nous voulons le faire: si certains programmes fuient, nous pouvons faire un redémarrage de sécurité, avant que le noyau ne commence à tuer nos processus (ce qui peut entraîner une corruption ou une indisponibilité des données).

Mais nous avons un problème:

Comment compter l'utilisation de la mémoire -% qui peut être utilisée pour notre objectif?

Nous avons essayé de compter l'utilisation de la mémoire en utilisant les valeurs 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

Sans succès:

(MemTotal - MemFree) n'est pas utilisable, car il contient par exemple des caches.

(MemTotal - MemFree - Buffers - Cached)n'a pas ignoré l'effet de Inactive. Il donne donc également des valeurs d'utilisation de la mémoire trop importantes.

(MemTotal - MemFree - Buffers - Cached - Inactive) est inutilisable, car le résultat peut être négatif.

Ski
la source

Réponses:

6

Système de surveillance 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

Regardez la -/+ buffers/cacheligne usedetfree

Surveillez chaque processus via / proc

J'ai utilisé ce script python et / proc / pid / stat pour surveiller la mémoire d'un processus:

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

vous aimeriez probablement traduire quelque chose comme ça en c.

Limiter les ressources pour chaque processus

ou utilisez ulimit/setrlimit

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

snies
la source
Pouvez-vous expliquer la méthode utilisée par votre script Python pour calculer l'utilisation de la mémoire? Cela ferait de cela une bien meilleure réponse.
Flimzy
Eh bien, il enregistre simplement l'utilisation de VM par étapes d'une seconde. Je l'ai utilisé pour représenter graphiquement la consommation de mem sur la durée de vie du programme. C'était pratique pour déboguer les fuites mem dans les programmes de longue durée.
snies
Vous pouvez simplement l'utiliser pour surveiller un prog après un certain temps d'initialisation. Et alerter un "drapeau suspect de fuite" si vmusage franchit un certain seuil.
snies
1
Le lien vers phacker.org n'est plus
f01
... c'est pourquoi StarckExchange demande toujours de publier le contenu des scripts, et pas seulement les liens
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

Nommez-le comme alert.sh et exécutez la commande: chmod +x alert.sh

Configurer un cron pour exécuter ce script toutes les 10 minutes

Assurez-vous de remplacer «512» par la mémoire totale de votre serveur en Mo et «[email protected]» par l'adresse e-mail réelle. Cela enverra une alerte par e-mail chaque fois que l'utilisation de la mémoire dépasse 95% et redémarrera le service "nom_service" s'il atteint 90%

Saurabh Singla
la source
2

Vous pouvez utiliser un script shell en cron avec la commande free pour surveiller la mémoire et agir en fonction de ses valeurs. Par exemple, pour surveiller la mémoire 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

Au lieu de faire écho à la sortie, vous pouvez évaluer les valeurs aux limites que vous souhaitez et envoyer, redémarrer ou quelle que soit l'action que vous souhaitez:

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

Ensuite, vous l'ajoutez à crontab pour l'exécuter dans les intervalles souhaités.

Peter
la source
1

un autre utilitaire utile du paquet sysstat est sar.

Pour des informations sur la mémoire, utilisez:

$ 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

Je pourrais certainement utiliser plus de RAM sur cette boîte.

TaoJoannes
la source