故障缘由:
公司服务器要整改,准备用一台新服务器安装LAMP环境,承担现在的WEB服务器,然后将现有的服务器重新规划整理;
故障现象:
当把代码用rsync同步到新服务器上,开启apache服务,做好DNS解析后,刚开始访问的时候是OK的!但是在不到一分钟的时候,网站就打开的非常慢,主页打开时间有时到了几分钟(几乎相当于访问不了),查看Apache报错日志,没有明显的错误异常日志;
解决过程:
1、首先老男孩老师让先把DNS切换到新服务器上去,把流量引过来(因为当时不是访问高峰期,网站临时的波动是允许的);
2、老男孩老师让安装上firebug等工具,查看网站访问慢的时候是哪一部分的加载比较慢;
3、一分钟后,网站访问开始变慢,根据第二点,查看网站首页加载时间的时候,发现首页加载的第一个页面项时间就超过了20s;
4、老男孩老师在本机使用wget访问,然后在机房同局域网的其他服务器上wget 内网地址,结果一样还是特别的慢(此时几乎就已经排除是网络原因了!)
5、老男孩老师让在网站根目录下面创建一个静态页,去访问(结果一样,打开时间非常慢),也几乎排除了数据库链接慢的原因,问题大约定在是apache的问题;
6、此时老男孩老师先将Apache stop,然后start,这样发现网站访问速度没有任何变化;
7、 老男孩老师这时先将网站stop,然后使用killall命令将所有httpd进程杀死,再start,此时发现访问速度突然快了,并且一分钟后访问又是很慢;
8、 对比第六步跟第七步发现多了一个杀死httpd所有进程,访问速度就能复原,分析一下得出这两步做的区别就是第六步会保留已经建立链接的访问,而第七步是直接全部访问链接都没有了(此时,老男孩老师就说很有可能是访问连接数过多);
9、 查看此时的并发连接数,大约在600左右,然后询问我是什么模式(当时apache是跑在perfork模式下的);
10、 打开apache配置文件,找到perfork模块的参数设置:
StartServers 10
MinSpareServers 20
MaxSpareServers 30
ServerLimit 5000
MaxClients 5000
MaxRequestsPerChild 10000
但看参数的设置,是没有什么问题的,此时老男孩老师打开apache错误日志,查看错误信息的时候发现有一条信息记录的是类似连接数的隐蔽问题;(当时的记录已经清空了,这里是翻译过来的意思)
11、看到这里老男孩老师就确定是perfork模式的参数设置有问题,根本就没生效,而导致采用默认的256,但是现在的链接并发数已经大于256了,所以后面的访问用户就处在等待的状态,也就出现了一分钟后就访问特别慢的情况;
12、老男孩老师根据之前规范的文档,看见ServerLimit的位置在文档中配置的是第一行,而现在服务器上的是配置在第四行的,将ServerLimit参数行放到第一行,然后将apache关掉重启;
13、这个时候再次访问的时候,网站一切正常,问题解决!!!!!
根据上面老男孩老师解决这个问题的过程。我总结了一下老男孩老师在结果这个问题时的思路:
1、出现问题,先分析故障,定义问题出现的大范围(这次故障,在服务器压力并不大的时候就出现访问很慢,老男孩老师就确定了是服务配置问题,跟服务器硬件关系不大!)
2、定位问题之后逐一排查缩,把问题的出现原因逐渐缩小(服务器硬件、网络因素、服务配置):
1)通过服务器TOP命令--得出不是服务器硬件;
2)通过内网访问---排除是网络的因素
3)通过创建静态页--排除apache以外其他服务配置问题
4)通过查看apache配置文件--找出问题所在,解决问题