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!