Go to content Go to menu Go to search

Watchdog - скрипт для контроля утечки памяти

Постановка задачи

Периодически на некоторых инстансах LAMP + WordPress происходит утечка памяти. Симптомы – апач очень быстро пожирает всю свободную память и сервер встает колом.
Решение проблемы – переход на nginx + php-fpm. К сожалению, не всегда это возможно (по организационным причинам).
Другое решение – скрипт, который контролирует занятость swap. Если место в swap кончается, скрипт грохает httpd и потом запускает заново.

Решение

Скрипт watch-swap запускать по cron раз в минуту.
Скрипт использует команды free и mailx, нужно проверить их наличие, и установить.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#! /bin/bash
# wget -c http:// valynkin .ru/watch-swap.tar.gz
# which free mailx

MINIMUM_FRRE_SWAP_PERCENT="70"
ADMIN_MAIL='admin@mail.propertyminder.com, zabbix@ valynkin .ru'
LOGFILE='/tmp/watch-swap.log'
DAEMON_TO_KILL='httpd'
SERVICE_TO_RESTART='mysqld'

if [ `ps axf | grep $0 | grep -v grep | wc -l` -ge 4 ]; then echo "we already runned $0"  >> $LOGFILE; exit; fi

HOSTNAME=`uname -n`
SWAP_SIZE=`free -m | awk '/Swap/ {print $2}'`
SWAP_USED=`free -m | awk '/Swap/ {print $3}'`

let SWAP_FREE=$SWAP_SIZE-$SWAP_USED
let MAX_SWAP_USAGE_ALLOWED=$SWAP_SIZE-\(\($SWAP_SIZE/100\)*$MINIMUM_FRRE_SWAP_PERCENT\)

if [ $SWAP_USED -ge $MAX_SWAP_USAGE_ALLOWED ]; then
    if [ `ps axf | grep $DAEMON_TO_KILL | wc -l` -ge 3 ]; 
    then
    while [ `ps axf | grep $DAEMON_TO_KILL | wc -l` -ge 3 ]; do pkill -9 $DAEMON_TO_KILL; sleep 1; done
    service $DAEMON_TO_KILL start; 
    fi
    if [ `ps axf | grep $SERVICE_TO_RESTART | wc -l` -ge 2 ]; then service $SERVICE_TO_RESTART restart; fi
    echo "SWAP ALERT on $HOSTNAME: SWAP_SIZE: $SWAP_SIZE SWAP_FREE: $SWAP_FREE restartyng services" | mailx -s "SWAP ALERT on $HOSTNAME" $ADMIN_MAIL
    if [ $LOGFILE ]; then echo `date` "SWAP ALERT on $HOSTNAME: SWAP_SIZE: $SWAP_SIZE SWAP_FREE: $SWAP_FREE restartyng services" >> $LOGFILE; fi
fi

if [ $LOGFILE ]; then echo `date` "SWAP_SIZE: $SWAP_SIZE SWAP_FREE: $SWAP_FREE SWAP_USED: $SWAP_USED" >> $LOGFILE; fi

ENJOY!


при публикации материалов с данного сайта обратная ссылка на сайт обязательна.
valynkin.ru © no rights reserved