热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

apache2.2+tomcat6.0的大量CLOSE_WAIT问题

apache2.2+tomcat6.0的大量CLOSE_WAIT问题

问题描述: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配置文件,发现缺少

......配置,在网上查资料发现默认配置如下:

StartServers         5

MinSpareServers      5

MaxSpareServers     10

MaxClients         150

MaxRequestsPerChild  0

 这就印证了为什么httpd进程数达到152的时候,网站访问就特别慢,因为MaxClients是 Apache可以同时处理的请求数上限,是对Apache性能影响最大的参数。如果请求总数已达到这个值(可通过ps -ef|grep httpd|wc -l来确认),那么后面的请求就要排队,直到某个已处理请求完毕。对于目前项目的网站,其缺省值150是不够的。于是我增加了......配置如下:

ServerLimit          2000

StartServers         10

MinSpareServers      25

MaxSpareServers     75

MaxClients         1000

ThreadsPerChild     25

MaxRequestsPerChild  10000


 

                  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状态的链接有增无减的具体原因,从而能够根治这个问题。

 


推荐阅读
  • 如何将PHP文件上传至服务器及正确配置服务器地址 ... [详细]
  • Ceph API微服务实现RBD块设备的高效创建与安全删除
    本文旨在实现Ceph块存储中RBD块设备的高效创建与安全删除功能。开发环境为CentOS 7,使用 IntelliJ IDEA 进行开发。首先介绍了 librbd 的基本概念及其在 Ceph 中的作用,随后详细描述了项目 Gradle 配置的优化过程,确保了开发环境的稳定性和兼容性。通过这一系列步骤,我们成功实现了 RBD 块设备的快速创建与安全删除,提升了系统的整体性能和可靠性。 ... [详细]
  • 深入解析Tomcat:开发者的实用指南
    深入解析Tomcat:开发者的实用指南 ... [详细]
  • 全面解析:Hadoop技术栈中的Linux操作系统概览
    全面解析:Hadoop技术栈中的Linux操作系统概览 ... [详细]
  • Linux磁盘管理入门指南:MBR分区格式详解与安装步骤
    在 CentOS 7.x 环境下,本文详细介绍了 MBR 分区格式的基本概念及其安装步骤。实验中使用了 SAS 和 SATA 硬盘,其中 SAS 硬盘主要用于企业级应用和服务器,而 SATA 硬盘则广泛应用于个人计算机和低端服务器。文章通过具体操作示例,帮助读者更好地理解和掌握 Linux 磁盘管理的基本技能。 ... [详细]
  • 深入解析:RKHunter与AIDE在入侵检测中的应用与优势
    本文深入探讨了RKHunter与AIDE在入侵检测领域的应用及其独特优势。通过对比分析,详细阐述了这两种工具在系统完整性验证、恶意软件检测及日志文件监控等方面的技术特点和实际效果,为安全管理人员提供了有效的防护策略建议。 ... [详细]
  • 本文深入探讨了IO复用技术的原理与实现,重点分析了其在解决C10K问题中的关键作用。IO复用技术允许单个进程同时管理多个IO对象,如文件、套接字和管道等,通过系统调用如`select`、`poll`和`epoll`,高效地处理大量并发连接。文章详细介绍了这些技术的工作机制,并结合实际案例,展示了它们在高并发场景下的应用效果。 ... [详细]
  • SpringBoot启动脚本详解:BAT文件应用与基础入门指南(SpringBoot系列第1篇)
    如果你还在为SSM框架的复杂搭建过程和繁琐的配置文件而烦恼,那么SpringBoot将是你的一大福音。作为SpringBoot系列的第一篇文章,本文详细介绍了如何使用BAT文件来启动SpringBoot应用,并提供了基础入门指南,帮助开发者快速上手,简化开发流程。 ... [详细]
  • Linux学习精华:程序管理、终端种类与命令帮助获取方法综述 ... [详细]
  • 如何在Linux系统中实施网络流量监测与分析
    本文详细介绍了在Linux系统中实施网络流量监测与分析的方法。通过使用专业的工具和技术,读者可以有效地监控和分析网络流量,从而提高系统的安全性和性能。希望本文能为读者提供有价值的参考和实践指导。 ... [详细]
  • 手机上编写和运行PHP代码的最佳软件推荐 ... [详细]
  • 对于内存仅为512MB、硬盘80GB的老旧设备,部署Ubuntu Server毫无压力。然而,许多平台仅支持CentOS系统,而CentOS默认要求1GB以上内存才能使用图形界面安装。实际上,安装完成后,即使内存低至256MB也能正常运行。此外,通过优化系统配置和减少不必要的服务,可以进一步提升系统性能,确保在资源受限的环境中稳定运行。 ... [详细]
  • 本文详细介绍了在CentOS 7上构建DNS解析服务器的步骤与配置方法。DNS系统不仅负责将主机名(域名)转换为相应的IP地址(正向解析),还能够根据IP地址反查主机名(反向解析)。此外,文章还探讨了不同类型的DNS服务器,如缓存域名服务器的作用和配置要点。通过本指南,读者可以全面了解并成功搭建一个高效稳定的DNS解析环境。 ... [详细]
  • 在服务器管理和大规模操作中,常需将系统状态或执行结果通过电子邮件通知相关人员。本文详细介绍了如何利用Linux自带的命令行工具高效地通过SMTP协议发送邮件,提供了一种快速便捷的解决方案。 ... [详细]
  • 深入解析Wget CVE-2016-4971漏洞的利用方法与安全防范措施
    ### 摘要Wget 是一个广泛使用的命令行工具,用于从 Web 服务器下载文件。CVE-2016-4971 漏洞涉及 Wget 在处理特定 HTTP 响应头时的缺陷,可能导致远程代码执行。本文详细分析了该漏洞的成因、利用方法以及相应的安全防范措施,包括更新 Wget 版本、配置防火墙规则和使用安全的 HTTP 头。通过这些措施,可以有效防止潜在的安全威胁。 ... [详细]
author-avatar
天狼飞虎神印
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有