问题描述:web前台页面打开很慢,慢的结果是,缓冲了25分钟左右页面打不开,大量close_wait假死等待关闭,导致请求堆积,出现超时错误访问超时报错如图(1)。
图(1)
环境工具:A. 服务器硬件信息
型号 DELL R1670
CPU Intel 四核/颗 X 2颗
内存 16G
硬盘 600G/块 X 4块
存储 Raid5
B. 服务器软件信息
操作系统 CentOS6.3
应用服务器 apache2.2+tomcat6.0
第三方软件 Server Protect for Linux(趋势科技的防病毒软件,在操作系统上安装使用)、Iguard(天存的防篡改软件,在apache上加载使用)、Iwall(天存的防火墙软件,在apache上加载使用)
解决过程:1. 网站的应用服务器apache从2.0升级到2.2后,不知道为什么在apache和tomcat重启一段时间后,就出现访问迟缓问题,如图(1),因为项目上加载了第三方软件,我怀疑是第三方软件和升级后的apache的版本的兼容性问题。所以我请第三方软件厂商,也根据升级后的apache版本更新了iguard和iwall产品。出问题的时候,我还检查了httpd进程的运行情况,如下:
[root@localhost /]#ps -ef|grep httpd|wc -l
152
2. 观察三天左右,还是发生apache和tomcat重启一段时间后,出现访问迟缓问题。我再次检查httpd进程的运行情况如下:
[root@localhost /]#ps -ef|grep httpd|wc -l
152
为什么每次出现访问问题的时候,httpd进程数都是152呢?
于是我检查apache的MPM工作模式,如下:
[root@localhost /]# /cicro/wcm/as/apache/bin/httpd -l
core.c
prefork.c
http_core.c
mod_so.c
证明是prefork.c工作模式,接下来查找apache的httpd.conf配置文件,发现缺少
<IfModule prefork.c>......</prefork.c>配置,在网上查资料发现默认配置如下:
<IfModule prefork.c>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
这就印证了为什么httpd进程数达到152的时候,网站访问就特别慢,因为MaxClients是 Apache可以同时处理的请求数上限,是对Apache性能影响最大的参数。如果请求总数已达到这个值(可通过ps -ef|grep httpd|wc -l来确认),那么后面的请求就要排队,直到某个已处理请求完毕。对于目前项目的网站,其缺省值150是不够的。于是我增加了<IfModule prefork.c>......</prefork.c>配置如下:
<IfModule prefork.c>
ServerLimit 2000
StartServers 10
MinSpareServers 25
MaxSpareServers 75
MaxClients 1000
ThreadsPerChild 25
MaxRequestsPerChild 10000
</IfModule>
3. 配置好httpd.conf以后,我观察到第五天时候,发现网站访问又出问题了,我检查httpd进程的运行情况如下:
[root@localhost /]#ps -ef|grep httpd|wc -l
1002
再次印证了访问问题和httpd进程数、以及httpd.conf的MaxClients有关。个人觉得apache的最大连接数设置成1000对于这个项目来说,足够了。于是在想为什么时间一长,就就积累了这么多没有消亡的httpd进程。
于是我再用netstat -an|grep 80查看服务器的连接,发现列表很大,觉得有点不正常,就去网上了解下,知道apache的性能问题一般都与TIME_WAIT和CLOSE_WAIT有关系。我就用netstat -an|grep httpd|grep TIME_WAIT和netstat -an|grep httpd|grep CLOSE_WAIT分别查看两种状态的httpd连接数目。发现TIME_WAIT的正常,发现大量tcp CLOSE_WAIT假死等待关闭,情况如图(2):
图(2)
4. 图(2)中有大量CLOSE_WAIT状态的127.0.0.1:8009端口和127.0.0.1的连接,8009是apache和tomcat的整合使用端口;我再查看其中一个CLOSE_WAIT状态的连接的进程的连接状况(netstat -an|grep httpd|grep 22399),结果有两个连接,一个是apache和tomcat通信(127.0.0.1:8009端口和127.0.0.1)的CLOSE_WAIT连接,一个是外部用户访问apache的ESTABLISHED连接;我再去查看这个进程具体情况(ps -ef|grep httpd|grep 22399),发现这个进程CPU的占用时间是00:00:00,也就意味着CPU还没空处理它;我再查看这种进程的数目(ps -ef|grep httpd|grep 00:00:00|wc -l),如图(3)
图(3)
5. 竟然有这么多进程都没有被CPU处理,难道是CPU资源不够,我就用top看下CPU资源使用情况,如图(4)
图(4)
发现CPU的资源还有很多的剩余,那为什么这么多进程占用CPU的时间是0呢?
6. 客户等着解决问题,我凭目前的知识量,无法在短期内查到具体原因,只好网上寻求解决问题的方法:
方案一,在tomcat的workers.properties里面配置相关条件
worker.tomcat.lbfactor=50
worker.tomcat.cachesize=10
worker.tomcat.cache_timeout=600
worker.tomcat.socket_keepalive=1
worker.tomcat.socket_timeout=300
方案二,优化服务器内核参数(/etc/sysctl.conf)
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=1
net.ipv4.tcp_keepalive_time=1800
net.ipv4.tcp_keepalive_probes=4
net.ipv4.tcp_keepalive_intvl=15
方案三,关闭tomcat的keepalive参数
方案四,做定时任务检查httpd进程数目,一旦发现httpd进程数目异常,就重启apache和tomcat
7.针对于本项目目前的状况,我采用了方案四,编写了linux shell脚本如下:
#!/bin/sh
httpcount=`ps -ef|grep httpd|wc -l`
echo $httpcount
if [ $httpcount -gt 900 ]; then
killall httpd
killall java
/cicro/wcm/bin/startas.sh
echo "Restart successfully because of much useless process."
else
echo "It is OK!"
fi
为了保证白天用户正常上网和用户体验,在每天早上6:30执行脚本,发现异常则重启;观察了几天,发现方案四还是不错,也陆续隔几天,就能发现重启的记录。但是个人还是希望能够分析出CLOSE_WAIT状态的链接有增无减的具体原因,从而能够根治这个问题。
相关推荐
### Apache 2.2 + Tomcat 6.0 + MySQL 5.0 + mod_jk 整合 本文旨在深入探讨如何将Apache 2.2、Tomcat 6.0、MySQL 5.0以及mod_jk进行有效的整合,以构建一个高性能、可扩展的应用服务器环境。这种整合方式不仅能够...
"两台服务器上做Apache2.2+Tomcat6.0+mod_jk的负载均衡"是一个典型的分布式系统架构,旨在通过在多台服务器之间分配工作负载来提高系统的稳定性和性能。下面将详细介绍这个配置涉及的知识点: 1. **Apache ...
Apache2.2与Tomcat6.0的组合可以构建一个高效、可靠的负载均衡服务器系统,以分散客户端请求到多个后端应用服务器,提高整体服务的可用性和响应速度。以下是搭建和配置的关键步骤及知识点: 1. **Apache2.2安装配置...
Apache2.2与Tomcat6.0的组合可以创建一个高效能、高可用性的Web服务器环境,通过负载均衡技术,可以有效地分散用户请求到多个Tomcat实例,从而提高系统的响应速度和整体性能。以下是关于这个配置的详细知识讲解: 1...
apache2.2+tomcat7
Apache2.2与Tomcat6.0的集成配置是一个常见的软件开发任务,特别是在构建高性能、高可用性的Web应用服务器环境中。Apache作为静态内容处理的强力HTTP服务器,与Tomcat(一个流行的Java Servlet容器)结合使用,可以...
Apache 2.2 和 Tomcat 6.0 的负载均衡配置是提高Web应用程序性能和可扩展性的重要技术。在高流量环境下,通过将工作负载分散到多个Tomcat实例上,可以确保服务的稳定性和响应速度,同时避免单一服务器过载。下面我们...
Apache2.2+Apusic6.0负载配置指南主要涉及两个关键组件的设置:Apache HTTP服务器和Apusic应用服务器,用于实现负载均衡和高可用性。以下是详细的配置步骤和相关知识点: 1. **Apache2.2的安装**: - 下载Apache ...
Apache2.2与Tomcat5.5的整合配置是一个常见的任务,特别是在那些希望利用Apache作为前端服务器处理静态内容,而将动态请求转发给Tomcat处理的环境中。这种配置可以提高服务器性能并优化资源分配。 首先,我们需要...
在IT行业中,集成Apache2.2与Tomcat6是一个常见的任务,这主要涉及到Web服务器与应用服务器的联合部署,以实现动态和静态内容的高效分发。Apache2.2是一个强大的HTTP服务器,常用于处理静态内容,而Tomcat6则是一个...
在Windows XP操作系统上搭建一个完整的Web开发环境,包括Apache Web Server 2.2、PHP 5.2.9.2、MySQL 6.0、Tomcat 6.0以及JSP整合,是一个常见的需求,特别是在进行多语言动态网站开发时。这个压缩包提供了一整套的...
用户配置apache和tomcat配置使用的插件,使用与apache2.2.*
### Apache和Tomcat集群配置详解 #### 一、软件准备 在进行Apache和Tomcat集群配置之前,首先需要准备所需的软件资源。 - **Apache 2.2**: - Windows平台: 从官方网站 [http://httpd.apache.org/download.cgi]...
Apache2.2+Tomcat集群 只是一个简单的集群例子,所用到的Apache,Tomcat压缩文件里都有
Tomcat 7 是第七个主要版本,支持 Java Servlet 3.0、JavaServer Pages (JSP) 2.2 和 Expression Language (EL) 2.2。 3. **mod_jk**:这是 Apache 的一个模块,用于连接 Apache 和 Tomcat。它实现了 AJP (Apache ...
本配置"Apache2.2+tomcat7+jk+jdk1.6"旨在实现一个稳定且可靠的环境,特别关注于session的共享与管理,以解决多服务器间的session一致性问题。 Apache2.2是Apache HTTP Server的第2.2版本,提供了强大的静态内容...
Tomcat6.0是一款遵循Apache Software Foundation的Jakarta项目下的Servlet和JavaServer Pages (JSP) 规范的应用服务器,主要处理Java Web应用程序。它轻量级、高效且开源,是许多开发者的首选。 3. **整合背景** ...
"WLSPlugin12.2.1.4.0-Apache2.2-Apache2.4-Linux_x86_64-12.2.1.4.0.zip" 是一个包含WebLogic Plugin的压缩包,适用于Apache 2.2和2.4版本,且专为Linux x86_64架构设计。 **WebLogic Plugin**: WebLogic Plugin...