Linux服务器负载过高时自动重启Apache服务

来自Jamesqi
跳转至: 导航搜索

--James Qi 2010年1月2日 (六) 23:33 (CST)

  元旦前一个星期左右,我把查号吧和其它几个实用查询网站的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=20
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 httpd" `ps -ef | grep httpd | wc -l`  
    pkill httpd  
    sleep 10  
    for i in 1 2 3  
    do  
        if [ `pgrep httpd | wc -l` -le 0 ]  
        then  
            /usr/local/apache2/bin/apachectl start  
            sleep 30  
            echo "##" $(date +"%y-%m-%d %H:%M:%S") "start httpd" `ps -ef | grep httpd | wc -l`  
        fi  
    done  
else  
    if [ `pgrep httpd | wc -l` -le 0 ]  
    then  
        /usr/local/apache2/bin/apachectl start  
        sleep 30  
        echo "##" $(date +"%y-%m-%d %H:%M:%S") "start httpd" `ps -ef | grep httpd | 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

  从晚上的几个小时试用情况来看还不错,达到了目的,也让我至少能睡个安稳觉了,不用担心死机。

标签:Linux服务器负载Apache
相关内容:
  1. 2010-05-05 14:03:43 香港服务器2M线路换为10M
  2. 2010-03-05 15:45:53 修改Apache的MIME设置,直接浏览.html.gz文件
  3. 2010-03-02 14:29:51 用Cron定时生成网站的Sitemap
  4. 2010-02-24 00:15:35 试用国外虚拟主机空间
  5. 2009-11-01 22:51:27 网站服务器重返武汉电信机房
  6. 2009-10-19 00:06:37 在服务器上安装网站监控软件
  7. 2009-09-04 12:28:08 在MediaWiki中启用主从两个MySQL服务器
  8. 2009-08-17 10:36:58 上海网吧门视频下载拖垮了我们的服务器
  9. 2009-07-20 23:39:24 回到兴城大厦办公,讨论服务器维护工作
  10. 2009-06-23 22:26:30 试用DNS轮询,更换Web服务器
  11. 2009-05-06 20:49:58 调整MediaWiki文件缓存设置降低服务器负载
  12. 2009-04-29 21:50:09 网站服务器故障10小时
  13. 2009-03-20 16:33:01 网站服务器监控服务的尝试
  14. 2008-09-20 22:03:36 再次用301永久重定向转移网站域名

关于“Linux服务器负载过高时自动重启Apache服务”的留言:

目前暂无留言

新增相关留言