元旦前一个星期左右,我把查号吧和其它几个实用查询网站的Google AdManager代码修改了,将原来在MediaWiki网站中控制的AdSense Link广告底色改成在AdManager中控制,这就涉及到模板的修改,而这个广告代码的模板被数十万个页面调用,job刷新、html cache重新生成都需要很长的时间,几个实用查询网站的访问量还不算很大,而查号吧网站的访问量大、调用模板复杂,导致服务器负载急剧增高,造成死机,让服务器山的其它网站也都不能访问。
前些天想通过修改HTMLCache程序的办法来解决,将修改的情况记录在《修改MediaWiki的 PHP程序》这篇日志中,当时以为解决了,但实际情况并没有解决,等job队列全部处理完了以后,网站负载依然大得惊人,检查html cache文件发现应该有60多万个文件却只有10多万个,这有可能是因为修改HTMLCache程序的不慎造成的老缓存文件被删除。
没有办法,只要重新生成,而这又是一个好些天漫长的过程,这期间要保持网站正常访问很难,只有不断观察服务器的负载情况,及时调整网站分配到某一个 web服务器、空闲时运行批量生成htmlcache文件的程序。这几天正赶上岁末年初的时候,单位聚餐晚会、元旦外出洪湖、今年早上踢球这些事情的过程中,只要离开电脑就有可能服务器负载过高导致死机。这几天的网站访问量、收入都受到很大影响,只有正常的几分之一。
既然人守着观察、调整可以起到一定的保障作用,那也应该可以找到程序的办法,于是我在网上搜索“linux负载高重启apache”,找到一篇文件《当负载过高时重启Apache》,正符合我们的要求,于是编辑了checkload.sh这个文件。
Shell代码
#!/bin/sh
TOP_SYS_LOAD_NUM=5
SYS_LOAD_NUM=`uptime | awk '{print $(NF-2)}' | sed 's/,//'`
echo $(date +"%y-%m-%d") `uptime`
if [ `echo "$TOP_SYS_LOAD_NUM < $SYS_LOAD_NUM"|bc` -eq 1 ]
then
echo "##" $(date +"%y-%m-%d %H:%M:%S") "pkill apache2" `ps -ef | grep apache2 | wc -l`
pkill apache2
sleep 10
for i in 1 2 3
do
if [ `pgrep apache2 | wc -l` -le 0 ]
then
service apache2 start
sleep 30
echo "##" $(date +"%y-%m-%d %H:%M:%S") "start apache2" `ps -ef | grep apache2 | wc -l`
fi
done
else
if [ `pgrep apache2 | wc -l` -le 0 ]
then
service apache2 start
sleep 30
echo "##" $(date +"%y-%m-%d %H:%M:%S") "start apache2" `ps -ef | grep apache2 | wc -l`
fi
fi
然后在/etc/crontab里增加定时执行的命令:
*/2 * * * * root /root/checkload.sh >>/root/checkload.log
这样每两分钟检查系统的负载,如果load average超过设定的20,就会重新启动Apache服务,丢弃当时的一些访问,保证服务器不会过载死机。
注意需要为checkload.sh文件赋予执行权限,这个问题也害我查了好半天才搞定。
记录的日志摘取一部分如下:
10-01-02 23:00:01 up 1 day, 12:26, 4 users, load average: 5.36, 4.53, 5.17
10-01-02 23:02:02 up 1 day, 12:28, 4 users, load average: 4.48, 4.63, 5.13
10-01-02 23:04:01 up 1 day, 12:30, 4 users, load average: 4.39, 4.44, 4.99
10-01-02 23:06:03 up 1 day, 12:32, 4 users, load average: 6.97, 5.22, 5.19
10-01-02 23:08:01 up 1 day, 12:34, 4 users, load average: 6.56, 5.74, 5.39
10-01-02 23:10:02 up 1 day, 12:36, 4 users, load average: 9.36, 6.88, 5.83
10-01-02 23:12:01 up 1 day, 12:38, 4 users, load average: 5.22, 6.23, 5.72
10-01-02 23:14:01 up 1 day, 12:40, 4 users, load average: 7.51, 6.61, 5.91
10-01-02 23:16:03 up 1 day, 12:42, 4 users, load average: 17.24, 10.36, 7.35
10-01-02 23:18:06 up 1 day, 12:44, 4 users, load average: 26.62, 16.12, 9.80
## 10-01-02 23:18:06 pkill httpd 41
## 10-01-02 23:18:49 start httpd 23
10-01-02 23:20:03 up 1 day, 12:46, 4 users, load average: 14.10, 14.51, 9.96
10-01-02 23:22:12 up 1 day, 12:48, 4 users, load average: 26.37, 18.44, 11.93
## 10-01-02 23:22:12 pkill httpd 48
10-01-02 23:24:01 up 1 day, 12:50, 4 users, load average: 6.64, 14.04, 11.08
## 10-01-02 23:24:32 start httpd 25
10-01-02 23:26:05 up 1 day, 12:52, 4 users, load average: 17.97, 15.10, 11.78
从晚上的几个小时试用情况来看还不错,达到了目的,也让我至少能睡个安稳觉了,不用担心死机。