Как контролировать использование памяти для тревожных целей

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) непригоден, потому что результат может быть отрицательным.

SKi
источник

Ответы:

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

snies
источник
Можете ли вы объяснить метод, который ваш скрипт Python использует для расчета использования памяти? Это сделало бы это намного лучшим ответом.
Хлипкий
Ну, он просто регистрирует использование 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

Сконфигурируйте cron для запуска этого скрипта каждые 10 минут

Обязательно замените «512» на общий объем памяти сервера в МБ, а «admin@domain.com» - на реальный адрес электронной почты. Это отправит уведомление по электронной почте, когда использование памяти превысит 95%, и перезапустит службу «service_name», если оно достигнет 90%.

Саурабх Сингла
источник
2

Вы можете использовать сценарий оболочки в cron с командой free, чтобы отслеживать память и действовать в соответствии с ее значениями. Например, для мониторинга оперативной памяти:

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

Я определенно мог бы использовать больше оперативной памяти на этой коробке.

TaoJoannes
источник