Jak monitorować wykorzystanie pamięci w celu alarmowania

9

Wbudowaliśmy system Linux bez wymiany.

Obecnie musimy podnieść alarm, gdy% wykorzystania pamięci wzrośnie ponad trzykrotnie. I uruchom ponownie, gdy% wykorzystania pamięci wzrośnie powyżej (wyższego) progu.

Dlaczego chcemy to zrobić: Jeśli jakiś program wycieknie, możemy wykonać restart bezpieczeństwa, zanim jądro zacznie zabijać nasze procesy (co może prowadzić do uszkodzenia danych lub niedostępności).

Ale mamy problem:

Jak policzyć użycie pamięci-%, które można wykorzystać do naszych celów?

Próbowaliśmy policzyć zużycie pamięci, używając wartości / 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

Bezskutecznie:

(MemTotal - MemFree) nie jest użyteczny, ponieważ zawiera na przykład pamięci podręczne.

(MemTotal - MemFree - Buffers - Cached)zignorował efekt Inactive. Daje to również zbyt duże wartości zużycia pamięci.

(MemTotal - MemFree - Buffers - Cached - Inactive) jest bezużyteczny, ponieważ wynik może być ujemny.

Narty
źródło

Odpowiedzi:

6

Monitoruj system przez 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

Spójrz na -/+ buffers/cachelinię usedifree

Monitoruj każdy proces za pomocą / proc

Użyłem tego skryptu Pythona i / proc / pid / stat do monitorowania pamięci procesu:

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

prawdopodobnie chciałbyś przetłumaczyć coś takiego na c.

Ogranicz zasoby dla każdego procesu

lub użyj ulimit/setrlimit

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

snies
źródło
Czy możesz wyjaśnić metodę używaną przez skrypt w języku Python do obliczania zużycia pamięci? To uczyniłoby to znacznie lepszą odpowiedź.
Flimzy
Po prostu rejestruje użycie VM w krokach sekundy. Wykorzystałem to do zobrazowania zużycia pamięci przez czas trwania programu. Przydało się to do debugowania przecieków pamięci w programach długo działających.
snies
Możesz użyć tego do monitorowania progresji po pewnym czasie inicjacji. Zaalarmuj „flagę podejrzanego o wyciek”, jeśli vmusage przekroczy określony próg.
snies
1
Link do phacker.org nie jest już dostępny
f01
... dlatego StarckExchange zawsze prosi o opublikowanie treści skryptów, a nie tylko linków
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

Nazwij to jako alert.sh i wykonaj polecenie: chmod +x alert.sh

Skonfiguruj crona, aby uruchamiał ten skrypt co 10 minut

Pamiętaj, aby zastąpić „512” całkowitą pamięcią serwera w MB, a „[email protected]” faktycznym adresem e-mail. Spowoduje to wysłanie powiadomienia e-mail za każdym razem, gdy wykorzystanie pamięci przekroczy 95%, i ponownie uruchomi usługę „nazwa_usługi”, jeśli osiągnie 90%

Saurabh Singla
źródło
2

Możesz użyć skryptu powłoki w cron z bezpłatnym poleceniem do monitorowania pamięci i działania zgodnie z jej wartościami. Na przykład, aby monitorować pamięć 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

Zamiast powtarzać dane wyjściowe, możesz ewaluować wartości do żądanych limitów i wysyłać pocztą, ponownie uruchamiać komputer lub dowolną inną akcję:

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

Następnie dodajesz go do crontab, aby uruchamiał się w żądanych odstępach czasu.

Piotr
źródło
1

innym przydatnym narzędziem z pakietu sysstat jest sar.

Aby uzyskać informacje o pamięci, użyj:

$ 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

Zdecydowanie mógłbym użyć więcej pamięci RAM na tym polu.

TaoJoannes
źródło