网站故障处理记实:apache引起的麻烦
2009-05-13 01:42:37来源:未知 阅读 ()
春节还没过完就接到同事的电话,说论坛访问速度慢,遭致用户强烈的投诉,要求我马上处理。这个bbs是运行在RedhatAS5上,由apache、mysql、php和discuz组成,有129550位注册会员,同时在线的最高人数11128,按照当前的硬件条件,应该满足访问需求(新上线的HP服务器)。在浏览器输入论坛的url,果然很慢,再联系朋友帮忙测试,打开网络还是很慢。
恶意攻击?mysql瘫痪?
先不管这么多,登录到服务器上去看看再做下一步打算。还好,登录比较顺利。运行命令uptime看系统负载,很低呀,再运行命令top,跟uptime得出的结论基本吻合,于是得出结论:系统负载不大。
是否被恶意攻击呢?基于这个想法,察看系统帐号—打开文件/etc/passwd,没看见任何异常;运行命令iptables–L–n发现防火墙规则仍按我当初设定的策略执行,这些迹象表明,系统不存在安全问题。
那会不会是mysql的性能问题呢?用mysql客户端连接数据库,察看负载,其情况如下:
mysql>showprocesslist;
+---------+-----------+-----------+--------+---------+------+-------+------------------+
|Id|User|Host|db|Command|Time|State|Info|
+---------+-----------+-----------+--------+---------+------+-------+------------------+
|1917230|bbsdiscuz|localhost|discuz|Sleep|284||NULL|
|1917412|bbsdiscuz|localhost|discuz|Sleep|223||NULL|
|1917442|bbsdiscuz|localhost|discuz|Sleep|222||NULL|
|1917554|bbsdiscuz|localhost|discuz|Sleep|205||NULL|
|…………………..省略若干………………………..
|1918404|bbsdiscuz|localhost|discuz|Sleep|0||NULL|
+---------+-----------+-----------+--------+---------+------+-------+------------------+
19rowsinset(0.00sec)
从输出结果看,连接数和保持时间也在正常范围内。以前曾经有过mysql数据库连接数过多(达到设定的最大连接数)及会话保持时间(Time)过长的事故,从而导致网站访问速度变慢,以至于无法忍受。由此分析,这个故障不是由mysql数据库所引起的。
现在还剩下apache了,看来该怀疑一下它了。我们先看看有多少个httpd进程,其过程如下:
[root@web1~]#psaux|grephttpd|grep-vgrep|wc-l
256
结果刚好是apache默认设置的最大连接数,再执行[root@web1~]#netstat-n|awk'/^tcp/{++S[$NF]}END{for(ainS)printa,S[a]}'其运行结果如下所示:
LAST_ACK3
SYN_RECV628
…………省略若干…………
TIME_WAIT524
apache引起的麻烦?
这个结果表明请求数比较大但却没有得到适时的响应,再看一下这些请求都是发往那些服务端口,只需运行netstat–anp|grep–vunix,发现绝大部分请求是针对80端口的。由这个现象基本可以断定是apache引起的麻烦。那好,我就从这里着手。关apache服务再启用,这时察看httpd进程,马上就是256.既然这样,我就在配置文件httpd.conf加入下面的代码块:
<IfModuleprefork.c>
StartServers10
MinSpareServers10
MaxSpareServers15
MaxClients1500
ServerLimit2000
MaxRequestsPerChild10000
</IfModule>
执行apachectl–t,报错,警告说MaxClients超过256,以至于apache服务不能正常运行,该小一点呢?好,改成150,运行后,查httpd进程数,刚好150。用浏览器访问论坛,还是十分的缓慢。看来得朝大的方向改,否则瞬间apache达到最大连接数,就不再响应新的请求。从前面的操作(把MaxClients的值改大超过256)可以知道,必须重新编译和安装apache才可以达到目的。当时曾经尝试把apache置于worker模式,但在编译时涉及到php,不想再节外生枝,就不再继续。我用的apache版本是httpd-2.2.6,进安装包所在的目录(如我的目录是/root/httpd-2.2.6,即解压httpd-2.2.6.tgz后生成的目录),修改文件server/mpm/prefork/prefork.c,把第77行的值改成1500,如下图所示:
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:一个完备的个人邮件解决方案
- 由java程序引起的一次系统崩溃 2020-05-27
- 一次云服务器安装达梦数据库后无法远程访问问题处理 2020-05-24
- Linux 下三种提高工作效率的文件处理技巧 2020-05-23
- 万字长文!一次性弄懂 Nginx 处理 HTTP 请求的 11 个阶段 2020-05-21
- 关于Nginx处理HTTP请求的11个阶段流程 2020-05-07
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash