
У нас встроенная система 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)
непригоден к использованию, так как результат может быть отрицательным.
решение1
Система мониторинга через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
https://stackoverflow.com/questions/4983120/limit-memory-usage-for-a-single-linux-process
решение2
#!/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
Назовите его alert.sh и выполните команду:chmod +x alert.sh
Настройте cron для запуска этого скрипта каждые 10 минут.
Обязательно замените «512» на общий объем памяти вашего сервера в МБ и «[email protected]' с реальным адресом электронной почты. Это отправит оповещение по электронной почте, когда использование памяти превысит 95 %, и перезапустит службу "service_name", если она достигнет 90 %
решение3
Вы можете использовать скрипт оболочки в 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 для запуска с нужными вам интервалами.
решение4
Еще одна полезная утилита из пакета 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
Мне определенно не помешало бы больше оперативной памяти на этом компьютере.