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


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

Ну, он просто регистрирует использование 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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.