Як контролювати використання пам'яті з тривожною метою


9

Ми вбудували систему Linux без своп.

Наразі ми повинні підняти тривогу, коли споживання пам’яті% збільшується вдвічі. І перезавантажтесь, коли споживання пам'яті% збільшується понад (більш високий) поріг.

Чому ми хочемо це зробити: Якщо якась програма протікає, ми можемо зробити безпечну перезавантаження, перш ніж ядро ​​почне вбивати наші процеси (що може призвести до пошкодження даних або недоступності).

Але у нас є проблема:

Як підрахувати використання пам'яті,%, яке можна використовувати для наших цілей?

Ми намагалися підрахувати використання пам'яті, використовуючи значення / 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

Без успіху:

(MemTotal - MemFree) не використовується, оскільки містить, наприклад, кеші.

(MemTotal - MemFree - Buffers - Cached)не враховував ефекту Inactive. Таким чином, він також дає занадто великі значення використання пам'яті.

(MemTotal - MemFree - Buffers - Cached - Inactive) є непридатним, оскільки результат може бути негативним.

Відповіді:


6

Система моніторингу через 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

Подивіться на -/+ buffers/cacheрядок usedіfree

Контролюйте кожен процес через / proc

Я використовував цей скрипт python та / proc / pid / stat для контролю пам'яті процесу:

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

ви, мабуть, хотіли б перекласти щось подібне на c.

Обмежте ресурс для кожного процесу

або використовувати ulimit/setrlimit

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


Чи можете ви пояснити метод, який ваш скрипт Python використовує для обчислення використання пам'яті? Це зробило б це набагато кращою відповіддю.
Flimzy

Ну, він просто записує використання vm за кроками секунди. Я використовував це для графіки споживання пам'яті протягом життя програми. Це було зручно для налагодження витоків пам’яті у тривалих програмах.
snies

Ви можете просто скористатися цією функцією, щоб відстежувати пробіг через деякий ініціативний час. І попередити якийсь "прапор підозрюваний у витоку", якщо vmusage перетинає певний поріг.
snies

1
Посилання на phacker.org більше не
f01

... саме тому StarckExchange завжди просить розмістити вміст скриптів, а не лише посилання
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" admin@domain.com


     fi
fi

Назвіть це як alert.sh та виконайте команду: chmod +x alert.sh

Налаштуйте крон для запуску цього сценарію кожні 10 хвилин

Не забудьте замінити '512' на загальну пам’ять вашого сервера в MB та 'admin@domain.com' на фактичну адресу електронної пошти. Це буде надсилати сповіщення електронною поштою щоразу, коли використання пам'яті перевищує 95% і перезапустить послугу "service_name", якщо вона досягне 90%


2

Ви можете використовувати скрипт оболонки в cron за допомогою вільної команди для контролю пам'яті та дії відповідно до її значень. Наприклад, для моніторингу оперативної пам'яті:

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

Замість того, щоб повторювати висновок, ви можете зрівняти значення до потрібних обмежень і надсилати пошту, перезавантажувати або будь-яку дію, яку ви хочете:

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

Потім ви додаєте його в crontab, який потрібно запускати через потрібні інтервали.


1

Ще одна корисна утиліта з пакету sysstat - це sar.

Для отримання інформації про пам'ять використовуйте:

$ 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

Я міг би точно використовувати більше оперативної пам’яті на цій коробці.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.