So überwachen Sie die Speichernutzung zu Alarmzwecken

So überwachen Sie die Speichernutzung zu Alarmzwecken

Wir haben ein eingebettetes Linux-System ohne Swap.

Derzeit müssen wir einen Alarm auslösen, wenn der Prozentsatz der Speichernutzung einen bestimmten Schwellenwert überschreitet. Und einen Neustart durchführen, wenn der Prozentsatz der Speichernutzung einen (höheren) Schwellenwert überschreitet.

Warum wir das tun möchten: Wenn ein Programm ausläuft, können wir einen Sicherheitsneustart durchführen, bevor der Kernel beginnt, unsere Prozesse zu beenden (was zur Beschädigung oder Nichtverfügbarkeit von Daten führen kann).

Aber wir haben ein Problem:

Wie berechnet man den Speichernutzungsprozentsatz, der für unsere Zwecke verwendet werden kann?

Wir haben versucht, die Speichernutzung anhand der Werte von /proc/meminfo zu berechnen:

/ # cat /proc/meminfo
MemTotal:       126744 kB
MemFree:         58256 kB
Buffers:         16740 kB
Cached:          31308 kB
SwapCached:          0 kB
Active:          37580 kB
Inactive:        24000 kB

Ohne Erfolg:

(MemTotal - MemFree)ist nicht nutzbar, da es beispielsweise Caches enthält.

(MemTotal - MemFree - Buffers - Cached)hat den Effekt von ignoriert Inactive. Daher führt es auch zu hohen Speichernutzungswerten.

(MemTotal - MemFree - Buffers - Cached - Inactive)ist unbrauchbar, da das Ergebnis negativ sein kann.

Antwort1

Überwachungssystem überfree

[root@localhost ~]# free
          total       used       free     shared    buffers     cached
Mem:    2058240    1776788     281452          0      89780    1335840
-/+ buffers/cache:  351168    1707072
Swap:   4095992        100    4095892

Schauen Sie sich die -/+ buffers/cacheLinie an usedundfree

Überwachen Sie jeden Prozess über /proc

Ich habe dieses Python-Skript und /proc/pid/stat verwendet, um den Speicher eines Prozesses zu überwachen:

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

Sie würden so etwas wahrscheinlich gerne in c übersetzen.

Begrenzen Sie die Ressourcen für jeden Prozess

oder verwenden Sie ulimit/setrlimit

https://stackoverflow.com/questions/4983120/limit-memory-usage-for-a-single-linux-process

Antwort2

#!/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

Nennen Sie es alert.sh und führen Sie den Befehl aus:chmod +x alert.sh

Konfigurieren Sie einen Cron, um dieses Skript alle 10 Minuten auszuführen

Stellen Sie sicher, dass Sie „512“ durch den Gesamtspeicher Ihres Servers in MB und „[email geschützt]' mit der tatsächlichen E-Mail-Adresse. Dadurch wird eine E-Mail-Benachrichtigung gesendet, wenn die Speichernutzung 95 % überschreitet, und der Dienst „service_name“ wird neu gestartet, wenn er 90 % erreicht.

Antwort3

Sie können ein Shell-Skript in cron mit dem Befehl free verwenden, um den Speicher zu überwachen und entsprechend seiner Werte zu handeln. So überwachen Sie beispielsweise den RAM-Speicher:

#!/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

Anstatt die Ausgabe wiederzugeben, können Sie die Werte auf die gewünschten Grenzwerte auswerten und eine E-Mail senden, einen Neustart durchführen oder die gewünschte Aktion ausführen:

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

Dann fügen Sie es zu Crontab hinzu, um es in den gewünschten Intervallen auszuführen.

Antwort4

Ein weiteres nützliches Dienstprogramm aus dem Sysstat-Paket ist sar.

Verwenden Sie für Speicherinformationen:

$ 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

Ich könnte auf dieser Box definitiv mehr RAM gebrauchen.

verwandte Informationen