
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/cache
Linie an used
undfree
Ü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.