Überwachen der Speichernutzung zu alarmierenden Zwecken

9

Wir haben Linux-System ohne Swap eingebettet.

Derzeit müssen wir einen Alarm auslösen, wenn die Speichernutzung% über einen Threashold steigt. Und starten Sie neu, wenn die Speichernutzung% über einen (höheren) Schwellenwert steigt.

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

Aber wir haben ein Problem:

Wie zählt man die Speichernutzung in%, die für unseren Zweck verwendet werden kann?

Wir haben versucht, die Speichernutzung mithilfe der Werte von / proc / meminfo zu zählen:

/ # 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 verwendbar, da es beispielsweise Caches enthält.

(MemTotal - MemFree - Buffers - Cached)ignorierte den Effekt von Inactive. Es gibt also auch zu große Werte für die Speichernutzung.

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

Ski
quelle

Antworten:

6

System über überwachen 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

Schau dir 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 möchten wahrscheinlich so etwas in c übersetzen.

Begrenzen Sie die Ressource für jeden Prozess

oder benutze ulimit/setrlimit

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

snies
quelle
Können Sie die Methode erklären, mit der Ihr Python-Skript die Speichernutzung berechnet? Das würde dies zu einer viel besseren Antwort machen.
Flimzy
Nun, es protokolliert nur die VM-Nutzung in Schritten von einer Sekunde. Ich habe das verwendet, um den Mem-Verbrauch über die Programmlebensdauer grafisch darzustellen. Dies war praktisch, um Mem-Lecks in lang laufenden Programmen zu debuggen.
Snies
Sie können dies einfach verwenden, um einen Prog nach einiger Init-Zeit zu überwachen. Und alarmieren Sie eine "Leckverdächtige-Flagge", wenn vmusage eine bestimmte Schwelle überschreitet.
Snies
1
Der Link zu phacker.org ist nicht mehr
f01
... weshalb StarckExchange immer darum bittet, den Inhalt von Skripten zu veröffentlichen, nicht nur 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" [email protected]


     fi
fi

Nennen Sie dies als alert.sh und führen Sie den folgenden 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 protected]' durch die tatsächliche E-Mail-Adresse ersetzen. Dies sendet eine E-Mail-Benachrichtigung, wenn die Speichernutzung 95% überschreitet, und startet den Dienst "Dienstname" neu, wenn er 90% erreicht.

Saurabh Singla
quelle
2

Sie können ein Shell-Skript in cron mit dem Befehl free verwenden, um den Speicher zu überwachen und gemäß seinen Werten zu handeln. Zum Überwachen des RAM-Speichers:

#!/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 zu wiederholen, können Sie die Werte bis zu den gewünschten Grenzwerten bewerten und per E-Mail versenden, neu starten oder eine beliebige Aktion ausführen:

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

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

Peter
quelle
1

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 definitiv mehr RAM für diese Box verwenden.

TaoJoannes
quelle